자바의 상속 개념과 상속에서 쓰이는 super. / super()에 대해 알아보자.
실생활의 상속 관계를 적용한 Java의 존재하는 개념이다.
새로 생성하려는 클래스에서 이미 존재하는 클래스를 쉽게 재사용하고, 메소드 및 변수를 추가 할 수 있어 코드의 재사용성을 높여주고 코드 작성을 효율적으로 할 수 있도록 도와준다.
상속받은 class를 자식 class, 상속한 class를 부모 class라 부른다.
class 선언구에서 상속 받아 사용하려는 class 명을 extends
뒤에 붙여 사용한다.
코드 예시 :
class Adult{ //부모 class
String name; //부모 class 변수
int age;
public void Print(){
System.out.println("이름과 나이 : "+name+" "+age);
}
}
public class Children extends Adult{//부모 class를 Children class에 상속
String job; //자식 class 변수
Children(){//자식 class 생성
}
public static void main(String [] args){
Children c = new Children();
c.name = "짱구";
c.age = 5;
c.job = "어린이";
c.Print();
System.out.println("직업: "+ c.job);
}
}
output :
이름과 나이 : 짱구 5
직업: 어린이
자식 클래스가 부모 클래스로부터 상속받은 멤버를 참조할 때 사용하는 참조 변수.
자식 클래스 내에 멤버와 부모 클래스내에 멤버가 같은 이름이라면 super 키워드를 사용하여 부모 클래스의 멤버를 구분한다.
//------부모 클래스 ---------
class Parent {
String name;
int age;
Parent(){
System.out.println("부모");
}
void print() {
System.out.println(name);
System.out.println(age);
}
}
//--------자식 클래스 ---------
public class Child01 extends Parent {
String job;
Child01(){
System.out.println("자식");
}
void print() {
super.print(); // 부모클래스의 print를 사용한다.
System.out.println(job);
}
public static void main(String [] args) {
//Object -> Parent -> Child01 순으로 생성
//Parent 객체 생성 시 name, age, 메모리 생성 -> Child 객체 생성시 job메모리 생성
Child01 c = new Child01();
c1.name = "짱구";
c1.age = 5;
c1.job = "유치원생";
c1.print()
}
}
output:
부모
자식
짱구
5
유치원생
=> 부모 클래스가 먼저 호출되고 자식 클래스가 호출된다.
super.를 사용하여 부모 클래스의 멤버로 구분한다.
자식함수 내에서 상속받은 부모의 생성자를 호출하는 메소드.
(생성자는 상속되지 않는 유일한 멤버함수이다.)
생성하려는 자식 클래스 생성자를 호출 할때 부모 클래스의 생성자도 동시에 호출해야 한다.(메모리 상에선 부모 클래스 생성자가 먼저 실행된다.) 그렇기 때문에 자바 컴파일러가 자동으로 자식 클래스의 생성자 첫줄에서 호출 해준다. 이러한 부모 클래스의 생성자 호출은 최종 - Object 클래스까지 올라간다.
위와 같은 코드에 자동 호출되는 super()를 명시해 보았다.
//------부모 클래스 ---------
class Parent {
String name;
int age;
Parent(){
super();// 자동 생성, 부모의 기본 생성자 호출
System.out.println("부모");
}
void print() {
System.out.println(name);
System.out.println(age);
}
}
//--------자식 클래스 ---------
public class Child01 extends Parent {
String job;
Child01(){
super();// 자동 생성, 부모의 기본 생성자 호출
System.out.println("자식");
}
void print() {
super.print(); // 부모클래스의 print를 사용한다.
System.out.println(job);
}
}
예외
부모클래스에 매개변수를 가지는 생성자가 있다면 super()가 자동으로 생성되지 않는다. (<=오버 로딩)
//------부모 클래스 ---------
class Parent {
int age;
Parent(int a){
age = a;
}
}
//------부모 클래스 ---------
class Parent {
int age;
Parent(){
age = 5;
}
Parent(int a){
age = a;
}
}
//------부모 클래스 ---------
class Parent {
int age;
Parent(int a){
age = a;
}
}
//--------자식 클래스 ---------
public class Child01 extends Parent {
int grade;
Child01(){
super(5);// 자동 생성, 부모의 기본 생성자 호출
grade = 1;
}
}
-- 주의 --
만약 부모클래스에 매개변수를 포함한 명시적 생성자 선언이 있었는데,
자식 생성자에서 super() 를 통해 호출하지 않으면 컴파일 에러가 난다.