this를 기억하시나요?
super역시 this와 비슷한 기능을 하는 녀석입니다.
하지만, 그 적용대상이 다를 뿐!!
this는 자기 자신의 형(Type)에게만 적용되지만
super는 자신의 부모형(Type)에게 적용하는 녀석이죠
음, 녀석이라는 말보다 이제는 참조변수라고 얘기를 합시다. (this도 참조하는 참조변수입니다)
멤버변수와 지역변수의 이름이 같을경우 this를 이용해서 구분했음을 기억하시나요?
이렇듯 상속받은 멤버와 자신의 클래스에서 정의된 멤버의 이름이 같다면 super를 이용해 구분 할 수가 있는겁니다.
Parent.java
1 2 3 4 5 6 7 8 9 10 | /* * Parent.java */ public class Parent { public void hello(){ System.out.println("Parent의 hello() 입니다."); } } | cs |
Son.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /* * Son.java */ public class Son extends Parent { public void hello(){ System.out.println("Son의 hello()입니다."); } public void testHello(){ super.hello(); } public static void main(String[] args) { Son son = new Son(); son.hello(); son.testHello(); } } | cs |
이 코드를 가지고 super가 뭔지 알아보도록 합시다.
Parent클래스에는 hello메소드를 만들었구요
Son클래스에는 hello메소드를 오버라아딩하고 testHello메소드를 만들었습니다.
그리고 Son클래스는 Parent클래스를 상속받고 있습니다.
이 상태에서 Son클래스에서 Parent클래스의 hello메소드를 호출을 하려고 합니다.
제가 testhello메소드에서 super.을 제외하고 썼다면 자기 자신클래스의 오버라이딩된 hello메소드를 호출합니다
하지만 저는 부모의 hello메소드를 호출하고 싶습니다.
바로 이럴때 super키워드를 이용하여 부모의 hello메소드를 호출을 할 수가 있는겁니다.
결과는 다음과 같이 출력 됩니다.
this()를 사용해 같은 클래스내의 생성자를 호출 할 수 있었듯이 super()를 이용하면 부모의 생성자를 호출 할 수가 있습니다.
바로 예제를 통해서 확인해보겠습니다.
SuperParent.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * SuperParent.java */ public class SuperParent { String name; SuperParent(String name){ this.name = name; System.out.println("SuperParent의 생성자"); } } | cs |
SuperSon.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /* * SuperSon.java */ public class SuperSon extends SuperParent{ SuperSon(String name) { super(name); System.out.println("SuperSon의 생성자"); } public static void main(String[] args) { SuperSon son = new SuperSon("Sogom"); System.out.println(son.name); } } | cs |
SuperSon클래스는 SuperParent클래스를 상속받고 있습니다.
Superson 객체를 만들기 위해서는 부모의 생성자를 호출하고 자신의 생성자를 호출해야만 완전한 객체가 생성이 됩니다.
그러나 지금 SuperParent생성자에는 하나의 매개변수를 넣어주어야 합니다.
넣어주지 않는다면 SuperParent생성자가 호출이 되지 않겠죠.
그래서 이때 Super키워드를 사용하여 부모의 생성자에 매개변수를 넣어주고 호출하게 됩니다.
그 후 자신의 생성자를 호출하여 하나의 객체를 만들게 되는겁니다.
이상 super 끝~!!
'프로그래밍 > Java' 카테고리의 다른 글
[Java] 20. 제어자(Modifier) - static (0) | 2015.05.16 |
---|---|
[Java] 19. 접근제어자(Access Modifier) (0) | 2015.05.13 |
[Java] 17. 오버라이딩(Overriding) (0) | 2015.04.21 |
[Java] 16. 상속(Inheritance) (0) | 2015.04.08 |
[Java] 15. this (0) | 2015.03.30 |