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) 생성자를 중복해서 사용하므로 아래의 코드처럼 간결하게 만들어 본다. )
'자바 > 기본적인 개념' 카테고리의 다른 글
상속 (0) | 2021.01.08 |
---|---|
초기화 블럭 (0) | 2021.01.08 |
가변 인자(varargs) (0) | 2021.01.07 |
오버 로딩 (0) | 2021.01.07 |
클래스 맴버와 인스턴스 맴버간의 참조와 호출 (0) | 2021.01.07 |