본문 바로가기

언어공부/Java

자바 super 레퍼런스, super. 와 super()

자바 super 레퍼런스에 대해서 알아보자.

super 레퍼런스

상속관계에서 자식클래스 영역에서 부모클래스의 메소드가 오버라이딩 된 경우 부모클래스의 메소드를 호출하려면 super를 사용한다. super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다. this가 자기자신을 가리킨다면, super는 상속받은 클래스를 가리킨다. super는 정적메소드 내에서는 사용할 수 없고, 인스턴스 메소드에서만 사용 가능하다.

 

super. 사용하는 경우

super는 조상 클래스를 참조하는 참조변수로, 상속받은 멤버나 메소드가 이름이 같을 때는 super를 붙여서 구별한다.

 

super로 상속받은 멤버변수에 접근할 수 있다.

 

출력화면

 

print()메소드를 호출하면 자손클래스의 멤버변수가 호출되며, print2()메소드를 호출하면 x와 y는 super로 상속받은 멤버변수를 호출하고, z는 자기 자신인 자손클래스의 멤버변수가 호출되어진다.

 

super로 상속받은 메소드에 접근할 수 있다.

 

Child05의 p05메소드가 호출된 출력화면

 

Child05의 p05()메소드를 호출하게 되면, super로 상속받은 메소드 p05가 호출되며, 그 후 println()메소드가 출력된다.

 

super() 사용하는 경우

this()처럼 super()도 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하는데 사용되지만, super()는 조상의 생성자를 호출하는데 사용된다.

 

상속에서의 생성자는 상속되지 않는 유일한 멤버 함수이다. 상속되지 않기 때문에 자손 클래스의 인스턴스가 생성될 때 자신의 생성자가 호출 되면서 부모클래스의 생성자가 연속적으로 자동으로 호출된다. 이때, 자동 호출되는 생성자는 전달인자가 없는 기본(디폴트) 생성자 형태이며 부모클래스 생성자가 먼저 실행되고 자식클래스 생성자가 실행된다. (자식 생성자에는 super();가 생략되어 있다.)

 

부모클래스에서 생성자가 오버로딩되면 자바는 기본생성자를 묵시적으로 제공하지 않으므로 상속에서의 생성자 호출문제가 발생할 수 있으므로 명시적인 기본 생성자를 정의하는 것이 좋다.

 

생성자에서 super()는 생략되어져 있다.

 

출력화면

 

point08에서는 point071과 Point 08의 생성자를 호출하며,  point09에서는 point 071과 point08과 point09 생성자를 호출하게 된다.

 

또한 super(인자값) 으로 조상클래스 오버로딩 된 생성자를 호출하도록 인위적으로 경로를 바꿀 수도 있다. 여기서도 super()를 사용하려면 맨 첫줄에 작성해줘야 한다.

기본 생성자를 호출할 때 자신 및 조상 클래스의 생성자의 기본 생성자 없으면 에러가 난다.

 

Point22의 기본생성자를 호출 했을 때, point21에서 기본생성자가 없을 때 point22 생성자의 super()에서 에러가 발생한다. 해결방법은 point21에서 기본생성자를 생성할 수도 있지만, 오버로딩 된 생성자에 맞춰 super()를 해주면 합리적으로 해결할 수 있다.

 

super()를 이용해서 생성자 호출.

 

출력화면

DicaPhone("갤럭시","010","1024")로 DicaPhone의 생성자를 호출하며, super(model,number)로 조상클래스의 생성자를 호출해 멤버변수를 초기화 한다. pixel은 this.pixel로 멤버변수를 초기화해 prnDicaPhone()메소드를 호출하면 초기화된 변수들이 호출된다.