[Java] Method 04 - 생성자
Java생성자 Constructor
인스턴스 초기화 메서드.
인스턴스가 생성될 때 호출된다. (인스턴스를 생성하는 것은 new 연산자가 하는 것임을 헷갈리지 말자)
오버로딩 가능하다.
조건
생성자의 이름은 클래스의 이름과 같아야 한다.
생성자는 반환값이 없다. (void 생략 가능)
public class Test {
public static void main(String[] args) {
Hello h1 = new Hello();
Hello h2 = new Hello(1);
}
}
class Hello{
Hello() {} // Constructor1
Hello(int a) {} // Constructor2
}
• 생성 과정
new 연산자에 의해서 메모리(heap)에 Hello 클래스의 인스턴스가 생성된다.
생성자 Hello() / Hello(int a)가 호출되어 수행된다.
new 연산자의 결과로, 생성된 Hello 인스턴스의 주소가 반환되어 참조변수 h1, h2에 저장된다.
기본 생성자 Default Constructor
클래스 내에 정의된 생성자가 없을 때 컴파일러에 의해 추가된다.
정의된 생성자가 있을 경우 기본 생성자는 추가 되지 않는다.
특별히 인스턴스 초기화 작업이 요구되지 않는 다면 컴파일러가 제공하는 기본 생성자를 사용해도 좋다.
public class Test {
public static void main(String[] args) {
Hello1 h1 = new Hello1();
// Hello2 h2 = new Hello2(); error
Hello2 h2 = new Hello2(10);
}
}
class Hello1{
}
class Hello2{
Hello2(int a) {}
}
매개변수가 있는 생성자
인스턴스마다 각기 다른 값으로 초기화되어야 하는 경우.
인스턴스 생성과 동시에 원하는 값으로 초기화할 수 있다.
public class Test {
public static void main(String[] args) {
Hello h = new Hello(1);
}
}
class Hello{
int a = 0;
Hello(int a) {
this.a = a;
}
}
this() / this(매개변수)
클래스 내에 두 개 이상의 생성자가 있을 때, 한 생성자에서 다른 생성자를 호출할 때 사용한다.
생성자의 이름으로 클래스 이름 대신 this를 사용한다.
반드시 첫 줄에서만 호출이 가능하다.
∵ 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문이다.
public class Hello{
Hello() {
// Hello(1, 1); error
}
Hello(int a, int b) {
this();
}
}
public class Hello{
int x;
Hello(int a) {
}
Hello(int a, int b) {
x = a;
// this(b); error
}
}
this
인스턴스 자신을 가리키는 참조변수.
인스턴스 멤버(멤버 변수)만 사용 가능하다.
인스턴스의 주소가 저장되어 있다.
모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
public class Hello{
int a;
Hello(int a) {
this.a = a;
}
}
this.a는 인스턴스 변수, a는 생성자의 매개변수로 정의된 지역변수로 서로 구별된다.
생성자를 이용한 인스턴스의 복사
생성자의 매개변수를 참조변수로 선언하면 똑같은 상태의 인스턴스를 추가로 생성할 수 있다.
public class Test {
public static void main(String[] args) {
Hello h1 = new Hello();
Hello h2 = new Hello(h1);
h1.b = 2;
System.out.println(h1.a + "," + h1.b); // 0, 2
System.out.println(h2.a + "," + h2.b); // 0, 0
}
}
class Hello{
int a = 0;
int b = 0;
Hello() {
}
Hello(Hello h) {
a = h.a;
b = h.b;
}
}
h2는 h1을 복사하여 생성되었기 때문에 서로 같은 상태를 갖는다.
그러나 서로 독립적인 메모리 공간에 존재하는 별도의 인스턴스이므로 복사 외에는 영향을 받지 않는다.
참고 서적: 자바의 정석 3판