웹개발 교육/Java

[35일] Java (36) - super

ewok 2022. 9. 15. 11:20

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()는 반드시 자식 생성자 첫 줄에 위치하여야 한다. 그렇지 않을 경우 에러가 발생한다.