목차
1. 생성자란?
2. 기본 생성자
3. 매개변수가 있는 생성자
4. this(), this
1. 생성자란?
인스턴스가 생성될 때 호출되는 "인스턴스 초기화" 담당 메서드이다. 생성자의 구조는 메서드와 유사하지만 리턴값이 없다. 생성자는 여러 개 존재할 수 있다. 한편, 생성자의 조건은 아래 두가지이다.
1. 생성자의 이름은 클래스의 이름과 같아야 한다. |
2. 생성자는 return 값이 없다. |
생성자의 동작 과정을 예제 코드를 통해 알아보자.
코드 예제
public class ConstructorEx1 {
public static void main(String[] args) {
Fruit fruit = new Fruit();
}
}
class Fruit {
Fruit() {
}
}
1. 연산자 new에 의해 메모리에(heap)에 Fruit클래스의 인스턴스가 생성된다.
2. 생성자 Fruit()가 호출된다.
3. = 대입 연산자에 의해 fruit라는 참조변수에 인스턴스의 주소가 저장된다.
2. 기본 생성자
컴파일 시 생성자가 하나도 없는 클래스의 경우 컴파일러가 자동으로 아래와 같은 기본생성자를 추가한다.
Fruit() {} // Fruit는 예시 클래스의 이름
컴파일러가 아래와같이 기본 생성자를 추가해놓은 것을 알 수 있다.
3. 매개변수가 있는 생성자
생성자도 매개변수를 받아서 인스턴스의 맴버변수를 초기화하기 위해 사용된다.
코드예제
public class ConstructorEx2 {
public static void main(String[] args) {
Member member = new Member("박슬기");
System.out.println("member.name = " + member.name);
}
}
class Member {
String name;
Member(String nameParam) {
name = nameParam;
}
}
4. this(), this
같은 클래스의 맴버들 간 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다. 단 아래의 두 조건을 만족시켜야 한다.
1. 생성자의 이름으로 클래스 이름 대신 this를 사용한다. |
2. 한 생성자에서 다른 생성자를 호출할 때는 첫줄에서만 가능하다. |
public class ConstructorEx3 {
public static void main(String[] args) {
Car car1 = new Car();
System.out.println("car1.color = " + car1.color);
System.out.println("car1.gearType = " + car1.gearType);
System.out.println("car1.door = " + car1.door);
}
}
class Car {
String color; // 색
String gearType; // 변속기 종류 auto, manual
int door; // 문의 개수
// 생성자
Car() {
this("white", "auto", 4); // 생성자 이름을 대신하는 this
}
Car(String color, String gearType, int door) {
this.color = color; // 멤버변수를 가리키는 this
this.gearType = gearType;
this.door = door;
}
}
Car() 생성자의 첫째줄에서 인자가 3개 있는 Car 생성자를 불러 객체를 초기화하게 된다.
Car()안의 this는 그럼 무엇인가?
this는 참조변수로 인스턴스 자신을 가리킨다. this는 매개변수와 멤버변수의 이름이 같은 경우 구분해주기 위해 사용된다.
즉, this.color는 인스턴스 자신의 멤버변수 color를 의미하고 color는 매개변수를 의미한다.
하지만 this를 사용할 수 있는것은 인스턴스맴버뿐이다. static 메서드에서 인스턴스 맴버들을 사용할 수 없는 것처럼, this역시 사용할 수 없다. static메서드는 인스턴스를 생성하지 않고도 호출될 수 있으므로 static메서드가 호출된 시점에 인스턴스가 존재하지 않을 수 있기 때문이다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 클래스 상속과 포함관계 (0) | 2022.06.23 |
---|---|
[Java] 변수의 초기화 (0) | 2022.06.23 |
[Java] 오버로딩이란? (0) | 2022.06.22 |
[Java] 변수와 메서드 (0) | 2022.06.22 |
[Java] 클래스와 객체 (0) | 2022.06.22 |