생성자
1. 하나의 클래스의 인스턴스가 생성되는 코드의 단계
(1) 연산자 new에 의해서 메모리(heap)에 클래스의 인스턴스가 생성된다.
(2) 생성자가 호출되어 수행된다.
(3) 연산자 new의 결과로, 생성된 클래스의 인스턴스의 주소가 반환되어 참조변수에 저장된다.
( 주의할 점은 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다. )
2. 생성자에서 다른 생성자 호출하기 - this(), this
- this는 참조변수로 인스턴스 자신을 가리킨다.
- 사실 생성자를 포함한 모든 인스턴스 메서드에는 자신이 관련된 인스턴스를 가리키는 참조변수 'this'가
지역변수로 숨겨진 채로 존재한다.
- 같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다.
( 단, 아래의 두 조건을 만족해야 한다. )
(1) 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
( 즉, 클래스이름()으로 호출하는 것이 아닌 this()로 호출해야 한다. )
(2) 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
( 생성자에서 다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유는 생성자 내에서 초기화 작업 도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화를 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문이다. )
( 그러므로, 만약 두 번째 줄 이상에서 호출하면 컴파일 에러가 발생한다. )
3. 오해하기 쉬운 개념 정리
(1) 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
(2) this를 사용할 수 있는 것은 오직 인스턴스 맴버뿐이다. 클래스 메서드와 사용하면 에러가 나오기에 유의하자.
(3) this와 this()는 비슷하게 생겼을 뿐, 완전히 다른 개념이다. this는 '참조 변수'이고, this()는 '생성자'이다.
4. 잘못된 예제
( x = x를 하게 되면 지역변수로 간주되어 초기화 작업이 무의미해진다. )
( 그래서 this.x = x를 꼭 써주어야 한다 .)
5. 예제 - 생성자를 이용한 인스턴스의 복사
( 주의할 점은 a2는 a1을 복사하여 생성된 것이므로 서로 같은 상태를 갖지만, 서로 독립적으로
메모리 공간에 존재하는 별도의 인스턴스이므로 a1의 값들이 변경되어도 a2는 영향을 받지 않는다. )
( 또한 as(as a) 생성자를 중복해서 사용하므로 아래의 코드처럼 간결하게 만들어 본다. )