자바에서 모든 객체는 new 라는 키워드를 통해서 만듭니다.

아래의 예제 1 - 9는 질럿객체를 만드는 과정을 보여주고 있습니다.

 

 

             Zealot z = new Zealot();

예제 1 - 9

 

결국 질럿이 하나 만들어졌습니다.

이렇게 만들어낸 질럿은 소리를 낼수 있고, 체력과 쉴드 값을 갖고 있습니다.

하지만 궁금한 것은 질럿은 체력과 쉴드의 값이 얼마인 상태로 만들어 졌을까요?

 

 아래의 예제 1 - 10 BigRib 햄버거 객체를 만드는 과정을 보여주고 있습니다.

 

 

             BigRib b = new BigRib();

예제 1 - 10

 

BigRib햄버거가 하나 만들어졌습니다.

BigRib햄버거는 가격을 알려줄 수 있고 가격과 개요(description)를 갖고 있습니다.

그렇다면 BigRib햄버거는 가격이 얼마로 해서 만들어 지겠습니까? 어떤 개요를 갖고

있을까요?

 

질럿을 만들 때 질럿이 가지는 체력과 쉴드의 값은 구체적이고, 적당한 어떤 값을 가지고

있어야합니다. 논리적으로 옳습니다. 스타크래프트 게임에서 체력과 쉴드의 값이 0

되면 질럿은 죽습니다. 그런데 만들어진 질럿의 체력과 쉴드의 값이 0 이 라든지 혹은

임의의 숫자를 가지고 만들어진다면 게임이 이상해지겠지요.

롯데리아 BigRib 햄버거도 마찮가지 입니다. BigRib햄버거는 적당한 가격이 있습니다.

(할인 행사할때는 좀 저렴해지기도 하겠지만) , 그리고 BigRib햄버거 자신에 대한

개요가 있습니다. BigRib 햄버거의 개요에 "치즈가 들어있어요"등의 개요는 어울리지

않습니다.

질럿과 BigRib햄버거의 예에서처럼 클래스의 설계자는 객체가 만들어질때 객체가 갖고

있는 모든 멤버변수가 적절한 값을 가지도록 특별한 노력을 해야 합니다.

객체의 모든 멤버변수가 적절한 값을 가지도록 하는 행위를 초기화라고 하는데,

만약 클래스 설계자(프로그래머)가 이런 노력(객체의 초기화)을 하지 않고 방치한다면

곤란한 상황이 발생할 수 있습니다.

물론 클래스 설계자가 객체의 초기화를 하지 않고 게으름을 피웠다고해서 객체의 멤버변수

가 이상한 값을 가지는 것은 아닙니다.

클래스 설계자가 초기화를 하지 않았더라도 만들어진 객체의 멤버변수는 나름대로 규칙적인

값을 가지게 되는데, 그 이유는 자바가 new 키워드를 이용해서 객체를 만들 때 명시적으로

초기화 하지 않은 멤버 변수인 경우에 그 멤버변수에 일정한 값을 정해주기 때문입니다.

물론 여기에는 기본규칙이 있습니다. 멤버변수가 boolean형이면 false값을 지정해주고

그외 프리미티브형은 0 그리고 객체의 경우는 null 로 정해줍니다.

이를 멤버변수 초기화의 기본값, 디폴트 값이라고 부릅니다.

 

예제 1 - 7 질럿 클래스의 경우 질럿 객체의 체력과 쉴드에 대해서 명시적으로 초기화를

하지 않았기 때문에 체력과 쉴드는 int 데이터형의 디폴트값인 0의 값을 가집니다.

BigRib햄버거의 값은 2500의 값을 가지고, 개요는 “best selling burger in 2002”;라는

값을 가집니다.

 

질럿 클래스에 체력이나 쉴드를 도입한 이유는(스타크래프트를 해본 분은 더욱 쉽게 이해

하겠지만) 만들어진 질럿 객체가 적정한 체력과 쉴드의 값을 가지고 있도록 구현하고자

함인데 이 질럿 객체가 가지는 고유한 상태정보(체력과 쉴드)가 항상 0으로 초기화

된다면 이상할 것입니다. , 질럿이 만들어질 때 원하는 만큼의 체력이나 쉴드를 가지지

않는다면 논리적으로 (적어도 스트라크래프 게임에서는) 질럿을 만든 후에라도 질럿

객체에게 적정한 체력과 쉴드를 넣어주어야 하겠습니다.

 

 

             Zealot z = new Zealot();      // 체력과 쉴드가 0인 질럿을 만들었습니다.

             z.strength = 100;                              // 체력 100으로 초기화

             z.shields = 100;                               // 쉴드 100으로 초기화

예제 1 - 11

 

예제 1 - 11은 질럿을 만든 후에 질럿의 체력과 쉴드를 각각 100으로 초기화하는 것을

보여주고 있습니다.

스타크래프트에서 질럿은 만들어질 때 항상 체력과 쉴드의 값은 100이어야 하는데

생각 없는 Zealot 클래스 설계자 때문에 프로그래머는 질럿을 만들 때 마다 항상 체력과

쉴드를 100 으로 초기화 해야 할 운명입니다.

불쌍한 프로그래머는 어떤 때는 실수로 체력과 쉴드의 값을 100으로 만들어주는 초기화

부분을 빠뜨릴 때도 있을수도 있고, 오타등으로 엉뚱한 값 1000으로 초기화 할 수도

있습니다. (당연히 이 경우 배틀넷에서 난리가 나겠지요. 안죽는 질럿이라구요)

혹 상상을 초월하는 꼼꼼함을 가진 프로그래머라서 초기화 과정을 빠뜨리지 않고,

잘 처리한다고 해도 질럿 객체를 만든 다음에 일일히 체력과 쉴드의 값을 지정해주는

초기화를 해야 하는데 이것도 쉬운 일은 아닙니다.

 

하지만 예제 1 - 8 BigRib 클래스를 햄버거의 경우를 보면 price 멤버변수에 2500

값을 클래스에서 할당하고 있습니다.

 

 

          BigRib b = new BigRib();                  // BigRib 햄버거를 만들었습니다.

int p = b.getPrice();                                // BigRib 햄버거의 가격을 알아봅니다.

예제 1 - 12

 

예제 1 - 12의 경우는 BigRib햄버거를 하나 만들고, 가격이 얼마인지 알아보고 있는데

그 값은 2500원입니다. 왜냐하면 BigRib햄버거는 만들어 질때부터 가격이 2500원으로

초기화 되어 있습니다. BigRib 클래스 설계자는 BigRib햄버거를 2500원에 팔려고 했기

때문에 BigRib햄버거가 만들어질 때 가격이 2500원으로 초기화 되어 있는 것이 훨씬

효율적이라고 판단을 했고, 그래서 BigRib 클래스의 가격을 나타내는 멤버변수 price

값을 2500으로 설정했기 때문입니다.

 

일반적으로(거의 절대적입니다.) 질럿 객체를 초기화하는 것처럼 객체를 만든 후에

객체의 멤버변수를 적절한 값으로 초기화하는 것은 좋은 방법이 아닙니다.

 프로그래머의 실수로 초기화를 하지 않을 수도 있고, 초기화 하는 코드가 상당히 번거로운

일이기 때문입니다.

 경험많은 클래스 설계자 혹은 프로그래머는 이런 초기화의 중요성과 성가심을 모두 알고

있기 때문에 나름대로 초기화를 체계적으로 구현하기 위해서 initialize() 등의 메소드를 객체

에 만들고 사용하는 것을 많이 보았습니다.

 

             class Zealot {

                           . . .

                           void initialize(int st, int sh) {

                                        strength = st;        // 체력을 st값으로 정합니다.

                                        shields = sh;                      // 쉴드를 sh값으로 정합니다.

                           }

             }

예제  1 - 13

예제 1 - 13은 예제 1 - 7을 조금 보강한 것으로 void initialize(int , int) 의 메소드를

추가한 클래스입니다. void initialize(int , int)의 메소드는 그 이름에서 알수 있듯이

질럿 클래스에 있는 멤버변수인 strength, shields의 값을 쉽게 초기화 하는데

사용됩니다. 예제 1 - 14 void initialize(int , int )의 활용법을 보여주고 있습니다.

 

 

             Zealot z = new Zealot()                    // 질럿을 하나 만듭니다.

             z.initialize(100,100);                                       // 체력과 쉴드를 각각 100으로 초기화

예제 1 - 14

 

하지만 이와 같은 코드(초기화 함수 void initialize(int,int))는 반복되는 초기화 부분을 체계적

으로 한다는 데는 의의가 있지만 객체 지향적인 생각이 아닙니다.

void initialize(int,int)등의 메소드를 사용한다는 뜻은 일단 객체가 만들어진후 별도로 초기화

를 수행한다는 뜻인데 객체가 만들어지고, 프로그래머의 실수로 초기화를 하지 않을 수 도

있기 때문에 절대 바람직 하지 않습니다.

 

일반적으로 자바에서는 BigRib햄버거의 예와 같이 객체의 멤버변수의 초기화 시점은

객체가 만들어 진후 객체가 사용되기 전이 가장 적절하고, 효율적입니다.

즉 만들어 진 객체는 이미 완전히 초기화가 되어있다면 더 바랄게 없다는 뜻입니다.

그렇게만 된다면 만들어진 객체는 100% 초기화가 완료된 객체이므로 안심하고 사용할 수

있습니다.

Posted by
,