[Java] 자바 super 키워드의 사용
super 키워드
- 재정의 하기 전(부모)의 메서드를 호출할 때 사용한다.
- 많은 신입 분들이 super가 수퍼 클래스를 가리키는 것이라고 오해를 한다.
- 정의
1) 자신을 뺀 조상 클래스에서 메서드를 찾는다.
2) 그 중 가장 가까이에 있는 메서드를 가리킨다.
m1(), m2(), m3() 메서드를 가진 A class 예제
public class A {
int a;
public void m1() {
System.out.println("A.m1()");
}
public void m2() {
System.out.println("A.m2()");
}
public void m3() {
System.out.println("A.m3()");
}
}
m1(), m2() 메서드를 재정의 하고 m4() 메서드를 추가한 B class 예제
public class B extends A{
int b;
public void m1() { // A클래스의 m1() 재정의
System.out.println("B.m1()");
}
public void m2() { // A클래스의 m2() 재정의
System.out.println("B.m2()");
}
public void m4() { // 새로 추가
System.out.println("B.m4()");
}
}
B의 m2() 메서드와 A의 m3() 메서드를 재정의한 C class 예제
public class C extends B{
int c;
public void m2() { // B클래스의 m2() 재정의
System.out.println("C.m2()");
}
public void m3() { // A클래스의 m3() 재정의
System.out.println("C.m3()");
}
public void m5() { // 새로 추가
System.out.println("C.m4()");
}
public void test1() {
m1(); // B.m1()
m2(); // C.m2()
m3(); // C.m3()
}
public void test2() {
super.m1(); // B.m1() <-- 재정의 하지 않았으면 상속 받은 메서드를 가리킨다.
// super는 무시된다.
super.m2(); // B.m2()
super.m3(); // A.m3()
m4(); // B.m4()
super.m4(); // B.m4(); <-- 재정의 하지 않았으면 super는 무시된다.
m5(); // C.m5();
// super.m5(); // 재정의하거나 상속 받은 메서드가 아니기 때문에, 컴파일 오류!
// 조상 중에 m5() 메서드가 없다.
}
}
인스턴스 생성 및 메서드 호출 코드
public static void main(String[] args) {
C obj = new C();
obj.test1();
System.out.println("------------------------------");
obj.test2();
System.out.println("------------------------------");
}
- 실행 결과 :
B.m1()
C.m2()
C.m3()
------------------------------
B.m1()
B.m2()
A.m3()
B.m4()
B.m4()
C.m4()
------------------------------
'Programming > java' 카테고리의 다른 글
[Java] 컬렉션 클래스 - [Set] HashSet (java.util.Hashset) (0) | 2017.05.16 |
---|---|
[Java] 캡슐화(encapsulation), 접근 제어자(private, default, protected, public) (0) | 2017.05.15 |
[Java] 상속과 super() 메서드 (0) | 2017.05.15 |
[Java] final 명령어 (public static final ...) (0) | 2017.05.15 |
[Java] 컬렉션 클래스 - List, Set, Map의 개념 정리 (3) | 2017.05.12 |