'자바 Basic/자바언어의핵심'에 해당되는 글 14건

  1. 2007.11.30 자바공부-11.생성자와 초기화

자바에서 객체는 만들어질 때 멤버변수가 초기화 된 채로 만들어지는 것이 안전하고

바람직합니다. 질럿과 BigRib햄버거의 예를 살펴보면 그 이유가 명확합니다.

자바는 객체가 만들어질 때 멤버변수를 초기화 할 수 있는 아주 적절한 방법을 제공하고

있는데 그 것은 생성자 메소드(이하 생성자, Constructor)를 이용하는 방법입니다.

 

생성자는 클래스 정의에 일반 메소드처럼 존재합니다.

생성자는 프로그래머가 new 키워드를 이용해서 객체를 만들 때 자바 버추얼 머신이 반드시

수행해주는 메소드 입니다. 

, 객체를 만든 다음에 레퍼런스를 이용해서 객체의 메소드를 호출하는 형태가 아니라

생성자는 자바 버추얼머신이 객체를 만들 때 실행을 시켜주기 때문에 생성자 안에서 객체의

멤버변수를 초기화를 수행한다면 객체가 만들어 졌을 때는 언제나 생성자를 수행한 다음

일 테고, 생성자 안에서 일어나는 초기화는 항상 보장 받을 수 있는 것입니다.

 

 클래스에는 여러가지 메소드들이 있는데 , 그 여러 메소드들중에 생성자는 독특한 이름을

갖고 있습니다. 생성자의 이름은 반드시 클래스의 이름과 같아야 합니다.

 , 클래스의 이름과 같지 않은 메소드는 생성자가 아닙니다. 물론 클래스와 이름이

같은 메소드는 무조건 생성자라는 것도 맞는 말입니다.

 

예제 1 - 15 Zealot 클래스에다 초기화를 수행하는 생성자를 추가한 모습입니다.

 

             class Zealot {

                           int strength;                                                               // 질럿의 체력

                           int shields;                                                                // 질럿의 쉴드

       Zealot() {                                                                  // Zealot 클래스의 생성자

                                        strength = 100;                                 // 멤버변수 strength 100으로 초기화

                                        shields = 100;                                  // 멤버변수 shields 100으로 초기화

       }

                           . . .

             }

예제 1 - 15

 

예제 1 - 15 Zealot 클래스를 통해서 만들어지는 모든 질럿은 체력과 쉴드가 100으로

초기화 된채로 만들어 집니다.

 

Zealot 클래스의 생성자는 Zealot이고,BigRib클래스의 경우 생성자의 이름은 BigRib일텐데,

예제 1 - 8 BigRib클래스에는 같은 이름의 생성자가 보이지 않습니다.

하지만 BigRib클래스에 BigRib으로 시작하는 메소드, 즉 생성자가 안 보인다고 해서

BigRib 클래스에는 생성자가 없는 것이 아닙니다. 다만 BigRib클래스에서는 생성자를

명시적으로 기록하지 않았을 뿐입니다. 예제 1 - 7 Zealot클래스 역시 마찬가지 입니다.

생성자가 없는 것이 아니라 명시적으로 생성자를 기록하지 않았다고 하는 것이 옳습니다.

 

생성자는 주로 객체의 멤버변수를 초기화 하는데 사용되는, 예제 1-7 Zealot클래스,

예제 1- 8 BigRib클래스에서 처럼 클래스를 정의할때 명시적으로 생성자를 써주지

않아도 클래스에는 생성자가 묵시적으로 존재하게 되는데 이런 생성자를 기본생성자

(Default Constructor, 디폴트 생성자)라고 부릅니다. 디폴트 생성자는 메소드의 인자가

없는 것이 특징입니다. 즉 생성자에 인자가 있는 것은 디폴트 생성자가 아니라는 말이지요.

 

 

예제 1- 8 BigRib 클래스의 경우는 멤버변수 price의 초기화를 생성자에서 하지 않고

멤버변수를 선언함과 동시에 초기화를 수행하고 있는데, 이렇게 멤버변수를 선언함과

동시에 초기화를 수행하더라도 상관은 없습니다.

다만 이렇게 메범변수를 초기화 할경우 객체가 만들어 질 때 생성자 메소드보다 초기화

과정이 먼저 수행이 됩니다. 약간의 미묘한 차이가 있습니다만 어떤 방법으로 초기화를

수행하더라도 무난하다고 생각합니다. 필자는 생성자의 존재이유를 멤버변수의 초기화로

생각하기 때문에 멤버변수는 일반적으로 생성자에서 초기화합니다.

 

 

class            BigRib  {

       int price;

       String description;

       BigRib() {                          // 초기화를 담당하는 BigRib클래스의 생성자

                    price = 2500;

                    description = “best selling burger in 2002”;

       }

       int getPrice() {

                    return price;

       }

}

예제 1 - 16

 

예제 1 - 16은 예제 1 - 8과 같은 내용의 클래스입니다.

다만 생성자에서 멤버변수인 price description을 초기화하고 있습니다

Posted by
,