본문 바로가기

Java Programming

상속관계에서 super() 는 어떠한 경우에 사용하는걸까?

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Agile Java
Lesson 6. Inheritance
- chapter 12. More on Constructors


상속에 대해서 배우는 도중에 제가 몰랐던 독특한 부분이 있어서 짧게나마 정리를 배보고자 합니다- 뭐 아시다시피.. 제 블로그는 ㅎㅎ 초보의 자바의 재발견을 하는 부분이기땜에.. 이런걸 포스팅하는걸 상당히 좋아합니다 +_+ ㅋ

먼저 지난번에 상속과 다형성 이야기 하면서, super 키워드를 사용하여 하위 클래스가 상위 클래스의 메소드나 생성자를 불러올수 있다는 걸 이야기 했었습니다. 생성자 같은 경우에는 상위 클래스 생성자에 대한 호출이 하위 클래스 생성자에서 '첫 줄'에 나와야 한다네요-

기본적으로 JVM은 클래스마다 한개이상씩의 생성자를 필요로 한다고 합니다, 하지만 여러분들이 아시다 시피 굳이 생성자를 정의 안해주셔도.. 클래스를 생성할 수 가 있습니다. 왜냐면 자바가 자동으로 argument가 없는 생성자를 제공하기 때문입니다.

이런 특성을 가지고 테스트를 해보겠습니다.

'과연 상속받은 하위클래스는 super를 어떤경우에 사용하는것일까?'

테스트를 하는데 앞서서- 소스코드를 보여드리겠습니다 +_+

MotherClass
public class MotherClass {
   static boolean constructorWasCalled = false;

   MotherClass() {
       constructorWasCalled = true;
   }
}

ChildClass
public class ChildClass extends MotherClass {
   ChildClass() {
   }
}


이 책에서는 테스트를 위해서 JUnit을 사용합니다!
그래서 테스트 코드도 JUnit으로 작성하였습니다.. JUnit에 대해 궁금하시다면..
http://www.junit.org 로 방문하시는게 좋을것 같네용 +_+


import junit.framework.TestCase;

public class Test extends TestCase{
   public void testConstuctorCalls(){
       MotherClass mother = new ChildClass();
       assertTrue(MotherClass.constructorWasCalled);
   }
}


이렇게 테스트를 하고 나면 +_+


사용자 삽입 이미지





이렇게 초록 막대기가 나오면 테스트에 성공했다는 겁니다 +_+ ㅋ

argument가 없는 생성자의 경우에는 상위클래스의 생성자를
기본적으로 호출해 주는군요!









이번엔 ChildClass의 생성자에 argument를 하나 집어 넣고 테스트를 해보겠습니다!

public class ChildClass extends MotherClass {
   ChildClass(String name) {
   }
}

import junit.framework.TestCase;

public class Test extends TestCase{
   public void testConstuctorCalls(){
       MotherClass mother = new ChildClass("잇힝");
       assertTrue(MotherClass.constructorWasCalled);
   }
}


역시나 테스트가 통과하는걸 볼 수 있습니다.
하위클래스에 argument가 있더라도.. 상위클래스의 생성자를 불러옵니다.

하지만 여기서 상위클래스가 argument를 갖게 하면 어떻게 될까용?


MotherClass
public class MotherClass {
   static boolean constructorWasCalled = false;

   MotherClass(String name) {
       constructorWasCalled = true;
   }
}
ChildClass
public class ChildClass extends MotherClass {
   ChildClass(String name) {
   }
}

사용자 삽입 이미지
<공포의 빨강막대기의 등장>

테스트 통과에 실패했습니다.
일단은 ChildClass는 컴파일 조차도 되지 않는군요.

그럼 이 테스트를 통과하려면 어떻게 해야하나요 'ㅅ'?

방법은 하나! 위에서 이야기 했듯이 super 키워드가 그 해답입니다. 이렇게 상위 클래스에서 argument가 있는 생성자를 만들 경우 기본적으로 제공하던 argument가 없는 생성자는 제공하지 않습니다. 그러므로.. 하위클래스도 argument가 없는 생성자를 사용할 수 없게 되는거죠. 이때는 명시적으로 "나 우리 엄마 클래스에 있는 생성자를 사용하겠습니다" 라고 해줘야 합니다.

ChildClass를 아래와 같이 고치면 테스트에 성공하게 됩니다 ^^

public class ChildClass extends MotherClass {
   ChildClass(String name) {
       super(name);
   }
}