1. Class들의 관계
우린 상속을 배우면서 class들간의 관계를 배웠다.
class는 상속을 하면서 상위와 하위 클래스라는 관계가 생기고 우린 그 관계를 부모-자식의 관계라 부르기로 했다.
그 중 Super는 관계 중 부모 관계를 뜻한다.
당연히 수많은 클래스들 중에서 부모의 역할을 하면서 자식의 역할을 하는 클래스도 있고, 부모의 역할과 자식의 역할만 하는 클래스도 있을 것이다.
우린 그것들을 묶어서 Superclasses(부모 클래스들), Subclasses(자식 클래스들)이라고 부른다.
super를 사용하기 전에 this를 떠올려보자.
this는 클래스 안에서 멤버변수와 지역변수를 구분해서 사용하기 위해 사용했다.
this()도 생성자 함수가 생성자 함수를 호출할 때 사용했다.
이것처럼 super도 동일하다.
super는 자식 클래스에서 부모 클래스의 멤버에 접근할 때 사용되고,
super()는 자식 클래스의 생성자 함수가 부모 클래스의 생성자 함수를 호출할 때 사용된다.
이 게시물에선 이렇게 super를 사용해서 접근하는 문법에 대해 알아보고자 한다.
2. 상속관계에서 생성자 함수 알아보기
아래의 코드를 봐보자.
package oop0915;
class School extends Object {
String name="학교";
public School() {
System.out.println("School()...");
}
} // class end
class MiddleSchool extends School {
public MiddleSchool() {
System.out.println("MiddleSchool()...");
}
} // class end
class HighSchool extends School {
public HighSchool() {
System.out.println("HighSchool()...");
}
} // class end
public class Test01_super {
public static void main(String[] args) {
MiddleSchool ms = new MiddleSchool();
HighSchool hs = new HighSchool();
} // main() end
} // class end
School이라는 부모 클래스 아래에 MiddleSchool 클래스와 HighSchool 클래스를 자식 클래스로 생성했다.
그리고 생성자 함수가 호출되면 생성자 함수 이름이 호출되도록 코드를 넣어두었다.
그 후 MiddleSchool과 HighSchool의 새로운 인스턴스를 생성한 뒤 출력했다.
어떤 결과가 나올까?
School()이 항상 먼저 나오는 것을 확인할 수 있다.
이는 부모 생성자가 먼저 호출되고 자신의 생성자 함수가 호출된다는 뜻이다.
즉, 자식 클래스의 생성자 함수는 부모 생성자의 함수 호출 명령어를 포함하고 있다는 뜻이다.
3. 상속관계에서 멤버 함수(메소드) 알아보기
1) 부모 클래스의 값 그대로 가져오기
생성자 함수(Constructor)와 마찬가지로 멤버 함수(Method)도 클래스가 상속관계에 있고 부모 클래스가 있다면 함수 안의 지역 변수들은 부모가 갖고 있는 멤버 변수에 영향을 받는다.
먼저 MiddleSchool에 disp() 메소드를 추가하고 name을 출력하게 했다.
어떻게 될까?
출력 결과는 아래와 같다.
여기서 위의 코드를 살펴보면 name은 MiddleSchool이 갖고 있는 값이 아니다.
name은 부모 클래스인 School 클래스가 갖고 있다.
자식 클래스는 부모 클래스의 값을 상속한다.
2) 자식 클래스가 자신의 값 그대로 사용하기
이번엔 자식 클래스 안에 값을 따로 지정해두었다.
이 상태로 HighSchool 클래스에 disp() 함수를 호출하면 강남고등학교가 출력되는 것을 확인할 수 있다.
그런데 여기에다가 또 name 변수를 만들어서 값을 넣으면 어떻게 될까?
이제 name이란 변수가 세 가지가 생긴거다.
disp() 안에 선언된 지역변수 name.
HighSchool 클래스 안에 선언된 멤버 변수 name.
School 부모클래스 안에 선언된 멤버 변수 name.
이 세 변수를 호출하는 방법을 위 사진을 통해 이해해보자.
this와 super는 이런식으로 사용된다.
3. super, super()와 this, this() 활용한 클래스 설계
package oop0915;
class Parent extends Object {
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) {
// 주의) one, two 멤버 변수가 private면 에러가 난다
// super.one=a;
// super.two=b;
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.one);
System.out.println(child.two);
System.out.println(child.three);
} // main() end
} // class end
'⁂ Java > : 기본 익히기' 카테고리의 다른 글
[JAVA] #8-3 추상(Abstract) (0) | 2022.09.15 |
---|---|
[JAVA] #8-2 다형성(Polymorphism) (0) | 2022.09.15 |
[JAVA] #7-3 Object와 toString() (0) | 2022.09.14 |
[JAVA] #7-2 Override (0) | 2022.09.14 |
[JAVA] #7-1 상속(Inheritance) (0) | 2022.09.14 |