Cute Running Puppy

Language/[Java] 혼자 공부하는 자바

[혼자공부하는자바] chapter 07. 상속

R.silver 2021. 7. 19. 19:48
반응형

07-1. 상속

부모 클래스의 내용을 자식 클래스에게 물려주어 중복되는 코드를 줄일 수 있도록 하는 것

클래스 상속

//클래스 상속하는 법

class 자식클래스 extends 부모클래스 {
    //필드
    //생성자
    //메소드
}

상속의 특징 

  1. 여러 개의 부모 클래스를 상속할 수 없다. 
  2. 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다. 
  3. 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면  default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외된다. 

예시

부모 클래스

 

package sec01.exam01;

public class Juice {

	//필드
	String ingredient;
	int price;
	
	//생성자
	
	//메소드
	void makeJuice() { System.out.println("주스를 만들겠습니다."); }
	void finishJuice () { System.out.println("주스가 완성되었습니다."); }
	void addIngredient (String add) { System.out.println(add + "를 추가합니다."); }
}
자식 클래스

 

package sec01.exam01;

public class MyJuice extends Juice{
	
	//필드
	String name;

	//생성자
	MyJuice (String ingredient, int price, String name) {
		this.ingredient = ingredient;
		this.price = price;
		this.name = name;	
	}
	
	//메소드
	void startJuice() {
		System.out.println(name + "나왔습니다.");
	}
	
}
자식 클래스 사용

 

package sec01.exam01;

public class MyJuiceExample {

	public static void main(String[] args) {
		
		//MyJuice 객체 생성
		MyJuice myjuice = new MyJuice("딸기", 5000, "시원한딸기주스");
		
		//Juice 클래스로부터 상속받은 필드
		System.out.println("재료: " + myjuice.ingredient);
		System.out.println("가격: " + myjuice.price);
		
		//MyJuice 클래스의 필드
		System.out.println("쥬스이름: " + myjuice.name);
		
		//Juice 클래스로부터 상속받은 메소드 호출
		myjuice.makeJuice();
		myjuice.finishJuice ();
		myjuice.addIngredient ("키위");
		
		//MyJuice 클래스로부터 상속받은 메소드 호출
		myjuice.startJuice();
	}

}

실행 결과

재료: 딸기
가격: 5000
쥬스이름: 시원한딸기주스
주스를 만들겠습니다.
주스가 완성되었습니다.
키위를 추가합니다.
시원한딸기주스나왔습니다.

부모 생성자 호출

모든 객체는 클래스의 생성자를 호출해야만 생성된다. 

부모 객체도 생성자를 호출해야 한다. 

만약 생성자가 명시적으로 선언되지 않았다면 컴팔일러는 기본 생성자를 생성한다. 

//컴파일러사 생성한 기본 생성자

public MyJuice() {
    super();
}

 

만약 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶다면 아래와 같이 작성하면 된다. 

자식클래스 ( 매개변수선언, ... ) {
    super( 매개값, ... );
    ....
}

메소드 재정의

상속된 일부 메소드를 자식 클래스에서 수정하는 것 

메소드 재정의 규칙
  1. 부모와 메소드의 동일한 시그너처(리턴 타입, 메소드 이름, 매개변수목록)를 가져야 한다. 
  2. 접근 제한을 더 강하게 재정의할 수 없다. 
  3. 새로운 예외를 throws 할 수 없다.  
반응형