상속(super)

Eunjeon_g·2023년 3월 1일
0
post-thumbnail

1. 상속

부모 클래스가 자식 클래스에게 물려주는 것이다. 자식 클래스는 부모 클래스에 있는 코드를 사용할 수 있다. 단, private은 제외다. (private은 상속되지 않는다.)

상속을 하게 되면 중복되는 코드를 줄여주고, 이후 수정을 최소화 할 수 있다는 장점이 있다. (부모 클래스가 바뀌면 자식 클래스도 동일하게 적용되기 때문이다.)

2. 상속받기

자식 클래스는 extends 를 통해 상속 받을 부모 클래스를 하나 선택할 수 있다.

	public class Child extends Parent { ... }
  • 자식 클래스는 상속을 한 번 받을 수 있지만, 부모 클래스는 다수의 클래스에게 상속할 수 있다.(부모는 한개, 자식은 여러개 존재.)
	//불가능 : 부모는 하나만
	public class Child extends Parent1,Parent2 { ... }
    
    //가능 : 자식은 n개 가능
    public class Child1 extends Parent { ... }
    public class Child2 extends Parent { ... }
    public class Child3 extends Parent { ... }
  • 자식이 부모 클래스를 선택하기 때문에 부모는 누가 자식 클래스인지 알 수 없다.

3. super( ) : 부모 생성자 호출

부모 객체가 없으면 자식 객체도 있을 수 없다.
따라서 자식 객체를 생성하면 부모 객체가 먼저 생성된 후 자식 객체가 생성된다.

부모 생성자는 자식 생성자의 맨 첫 줄에 숨겨져 있는 super에 의해 호출되어 생성된다.

public class Child extends Parent{
	Child(){
    	super();
    }
}

super( )를 생략해도 된다. 코드상 보이지 않더라도 컴파일 과정에서 자동으로 추가되기 때문이다. 그렇기 때문에 맨 첫줄에만 올 수 있다.

 //부모 클래스
 public class Parent{
 
    Parent(){ }
} 
//Parent를 상속받은 자식 클래스
public class Child extends Parent{
	String school;

	Child(String school){
		super();	//생략가능, 생략해도 자동으로 호출된다.
       this.school = school;
       //불가능 : 이미 첫 줄에서 호출했다.
       //super();
   }
}

만약 부모 클래스에 기본 생성자가 없고, 매개변수를 갖는 생성자만 있다면 다음과 같이 매개변수를 직접 전달해줘야 한다.

//부모 클래스
public class Parent{
	String name;
   int age;
   
   //default 생성자 : 매개변수를 갖지 않는 생성자
   //생성자를 따로 정의하지 않으면 작성하지 않아도 기본으로 생성된다.
   //Parent(){ }
   
   //매개변수를 갖는 생성자를 정의하였기 때문에 default 생성자가 존재하지 않는다.
	Parent(String name, int age){
   		this.name = name;
       this.age = age;
   }
}
//Parent를 상속받은 자식 클래스
public class Child extends Parent{
	String school;
   
	Child(String name, int age, String school){
   	//부모 클래스에 default 생성자 없기 때문에 알맞는 매개변수를 직접 전달해줘야 한다.
   	super(name, age);
    this.school = school;
   }
}

0개의 댓글