본문 바로가기
진행중인 학습/자바의 정석_학습

자바의 정석_기초편 CHAPTER 6 中 33 ~ 39

by 트레비봄 2023. 8. 23.
728x90
자바의 정석_기초편 CHAPTER  6 中 33 ~ 39 

6-33. 기본 생성자 (default constructor)

모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 함.

그러나 지금까지 클래스에 생성자를 정의 하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 '기본 생성자(default constructor)' 덕분 이었음.

생성자가 1도 정의되지 않은 경우 컴파일러는 자동으로 기본 생성자를 추가하여 컴파일 한다.

클래스 이름() { } // 기본 생성자

Point() { } // Point클래스의 기본 생성자.

컴파일러가 자동으로 추가해주는 기본 생성자는 위 처럼 변수도 없고 아주 간단한 것들이다.

기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때만 이다.

 

6-34. 매개변수가 있는 생성자.

생성자도 메서드처럼 매개변수를 선언 후 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있음.

인스턴스마다 각기 다른 값으로 초기화되어야 하는 경우가 많기에 매개변수를 사용한 초기화는 매우 유용함.

클래스를 작성할 때 다양한 생성자를 제공함으로써 인스턴스 생성 후에 별도로 초기화를 하지 않아도 되게 하는 것이 바람직하다.

 

6-36. 생성자에서 다른 생성자 호출하기 - this( )

같은 클래스 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하지만 다음의 조건을 만족해야함.

1. 생성자의 이름으로 클래스이름 대신 this 를 사용.

2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능.

이 내용은 7장에서 추가로 배움.

같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊은 경우가 많아 이처럼 서로 호출하도록 하여 유기적으로 연결해주면 더 좋은 코드로 만들 수 있으며 수정이 필요한 경우는 적은 코드만 변경하면 되므로 유지보수에도 이득이다.

 

6-37. 객체 자신을 가리키는 참조변수 - this.

'this' 는 참조변수로 인스턴스 자신을 가리키며, 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼, 'this'로 인스턴스변수에 접근할 수 있음.

단, this를 사용할 수 있는 것은 인스턴스멤버뿐이다. static메서드(클래스 메서드)에선 인스턴스 멤버들을 사용할 수 없는 것처럼 'this' 도 마찬가지다. static메서드는 인스턴스를 생성하지 않고도 호출될 수 있으므로 static 메서드가 호출된 시점에 인스턴스가 존재하지 않을 수 있기 때문이다.

정리하면 아래와 같다.

this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있음.

모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재함.

this( ), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

 

6-38. 변수의 초기화

변수의 초기화는 경우에 따라 필수적 또는 선택적이지만 가능하면 선언과 동시에 적절한 값으로 초기화하는 것이 바람직하다.

멤버변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않고 사용해도 되지만, 지역변수는 사용하기 전에 반드시 초기화해야 한다.

 

6-39. 멤버변수의 초기화.

앞서 말했듯 멤버변수는 각 타입의 기본값으로 자동 초기화 된다. 그 다음 명시적 초기화, 초기화 블럭, 생성자의 순서로 초기화 된다. 또 클래스 변수(cv) 가 인스턴스 변수(iv)보다 먼저 초기화 된다. 멤버변수의 초기화에 대해선 두 가지를 기억!.

1. 클래스 변수(cv) 초기화 -> 인스턴스 변수(iv) 초기화.

2. 자동 초기화 -> 명시적 초기화(간단) -> 초기화 블럭, 생성자(복잡)

명시적 초기화 : 변수를 선언과 동시에 초기화하는 것. 가장 기본적, 간단한 초기화 방법이며 우선적 고려 대상.

초기화 블럭 : 명시적 초기화보다 복잡한 작업일 때 사용. '클래스 초기화 블럭'과 '인스턴스 초기화 블럭' 두 가지 종류.

클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용.

인스턴스 초기화 블럭 : 인스턴스변수의 복잡한 초기화에 사용.

 

728x90