super는 상위라는 의미로 superclass라고 하면 부모 클래스를 말한다. 자식 클래스는 subclass라고 한다.
super는 자식클래스에서 부모클래스의 멤버에 접근할 때 사용하고, super()는 자식클래스의 생성자 함수가 부모클래스의 생성자 함수를 호출할 때 사용한다.
※ 참고
this : 멤버변수(field)와 일반 지역변수를 구분하기 위해 사용
this() : 자신의 생성자함수가 자신의 생성자함수를 호출할 때 사용
실습을 통해 super에 대해 알아보자. 아래와 같이 class를 설계하였다.
package oop0915;
class School {
String name = "학교";
public School () {
System.out.println("School()...");
}
}//class end
class MiddleSchool extends School {
public MiddleSchool() {
//상속관계에서 부모 생성자 함수 호출 명령어
super(); //생략가능하다
System.out.println("MiddleSchool()...");
}
public void disp() {
System.out.println(name); //학교. 부모가 물려준 값 그대로
}//disp() end
}//class end
class HighSchool extends School {
public HighSchool() {
super();
System.out.println("HighSchool()...");
}
}//class end
MiddleSchool과 HighSchool 생성자 함수를 보면 super()가 있다. 우리는 이전에 super() 없이 사용했다.
super()가 없음에도 사용할 수 있었던 것은 super()은 생략할 수 있기 때문이다.
MiddleSchool 클래스의 disp()를 보면 name을 출력하도록 되어있다. 하지만 MiddleSchool 클래스에는 name이 없다. 그럼 이 name은 어디에 있을까? 바로 부모 클래스인 School 클래스에 있다. MIddleSchool 클래스는 School 클래스를 상속받았기 때문에 name 필드도 그대로 받았다. 따라서 이를 출력하면 "학교"가 나오는 것이다.
class School {
String name = "학교";
public School () {
System.out.println("School()...");
}
}//class end
class MiddleSchool extends School {
public MiddleSchool() {
//상속관계에서 부모 생성자 함수 호출 명령어
super(); //생략가능하다
System.out.println("MiddleSchool()...");
}
public void disp() {
System.out.println(name); //학교. 부모가 물려준 값 그대로
}//disp() end
}//class end
class HighSchool extends School {
String name = "고등학교";
public HighSchool() {
super();
System.out.println("HighSchool()...");
}
public void disp() {
String name = "강남고등학교";
System.out.println(name); //강남고등학교 지역변수
System.out.println(this.name); //고등학교 나의 멤버변수
System.out.println(super.name); //학교 부모의 멤버변수
}
}//class end
HighSchool 클래스의 disp()는 3가지의 name에 접근할 수 있다. 하나는 dips 함수가 가지고 있는 name 변수인 "강남고등학교"이다.
다른 하나는 HighSchool 클래스의 필드인 name의 "고등학교"이다. disp()에서는 this로 접근할 수 있다.
마지막은 HighSchool 클래스는 School 클래스로부터 상속받고 있기 때문에 School 클래스의 필드인 name의 "학교"이다. super를 사용하여 접근할 수 있다.
package oop0915;
class Parent {
int one, two;
public Parent() {}
public Parent(int one, int two) {
this.one = one;
this.two = two;
}
}//class end
class Child extends Parent {
int three;
public Child() {
super(); //생략가능
}//end
public Child(int a, int b, int c) {
super(a, b); //상속받은 멤버면수(one, two)에 초기값 전달.
this.three = c;
}//end
}//class end
public class Test02_super {
public static void main(String[] args) {
// super, super()와 this, this() 활용
Child child = new Child(10, 20, 30);
System.out.println(child.three); //30
System.out.println(child.one); //10
System.out.println(child.two); //20
}//main() end
}//class end
Parent 클래스와 Child 클래스를 설계하여 Child 클래스는 Parent 클래스를 상속받게 하였다. Child 생성자 함수에서 super()를 통해 one, two에 값을 전달할 수 있다. super()는 매개값의 타입과 일치하는 부모 생성자를 호출한다.
super()는 반드시 자식 생성자 첫 줄에 위치하여야 한다. 그렇지 않을 경우 에러가 발생한다.
'웹개발 교육 > Java' 카테고리의 다른 글
[35일] Java (38) - 추상 클래스 (0) | 2022.09.15 |
---|---|
[35일] Java (37) - 다형성 (0) | 2022.09.15 |
[35일] Java (35) - 연습 문제 (0) | 2022.09.15 |
[34일] Java (34) - 주민 번호 유효성 검사 (0) | 2022.09.14 |
[34일] Java (33) - Object 클래스 (0) | 2022.09.14 |