※상속(Inheritance) 개념

  • 부모 클래스의 필드와 메서드를 물려 받는다.
    즉 자식 클래스에서는 상속 받은거 +@가 가능하므로 개발 시간을 절약할 수 있다.
  • 단!! 부모클래스의 private는 상속 대상에서 제외 됨
          default 또한 부모 클래스와 자식 클래스가 -> 다른 패키지에 존재할 경우 제외 됨

 

※상속의 장점

  1. 반복된 코드를 줄임
  2. 유지 보수 편리성
    (클래스의 수정을 최소화 시킬 수 있다. -> 부모 클래스의 수정으로  모든 자식 클래스 들의 수정 효과를 가져오기 때문임)
  3. 객체 다형성 구현 가능
  4. 일대다 관계 가능

 

※접근 제어자  (접근 제한자)

- private : 같은 클래스 내에서만 접근이 가능하다. 
- default : 같은 패키지 내에서만 접근이 가능하다.      (default는 생략 가능)
- protected : 같은 패키지와 다른 패키지의 상속관계에서 접근이 가능하다. 
- public : 접근 제한이 없어 어디서든 접근이 가능하다.

 

※상속 방법

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

}

    cf. 주의!~! 중복 상속은 안 된다. extends <부모클래스 명1>, <부모클래스 명2>

 

▼상속 코드 보기 Tv▼

더보기
package com.javastudy.ch05.inheritance;

public class Tv {
	
	protected String name;
	protected boolean power =true;
	protected int channel;
	
	public Tv(String name) {
		this.name = name;
	}
	
	// TV 전원을 ON/OFF 하는 메서드
	public void power() {
		power = !power;
	}
	
	// TV 채널을 1씩 증가하는 메서드
	public int channelUp() {
		return ++channel;
	}
	
	// TV 채널을 1씩 감소하는 메서드
	public int channelDown() {
		return --channel;
	}
}

package com.javastudy.ch05.inheritance;

/* 자바에서 다른 클래스를 상속 받기 위해서는 클래스 이름 뒤에 extends를 이용해 
 * 상속 받을 클래스를 명시하면 된다. 
 * 아래와 같이 Tv 클래스를 상속받게 되면 
 * Tv 클래스가 정의한 모든 속성(필드)과 모든 기능(메서드)을 상속받아
 * 자기 자신의 것과 마찬가지로 자유롭게 사용할 수 있게 된다.
 * 
 * 클래스 간의 관계는 크게 상속과 포함이라는 관계가 존재 한다.
 * 상속 관계는-> 기존에 존재하는 것에 더하여 새로운 기능을 추가 할 경우에 적합하다고 
 * 할 수 있다.
 * SmartTv는 기존의 Tv 기능을 포함하여 웹 서핑 기능과 현재 방송 중인 영화 정보 검색 기능을
 * 추가로 구현해 SmartTv를 제작해야 한다면 상속 관계가 적절하다고 볼 수 있다.
 * 두 클래스 간의 관계는 "~는 ~ 이다."로 풀 수 있다. (SmartTv는 Tv이다.)
 * 
 * 
 * 두 클래스 간에 관계에서 본질적으로 동일한 속성과 기능을 갖지 않는 경우가 있을 경우에는
 * 상속 관계 보다는 포함 관계를 유지하는 편이 더 효율적이라 할 수 있다. 
 * 이는 클래스 간에 연관성을 가질 수는 있지만 
 * 본질적으로 같은 속성과 기능을 갖지 않는다고 볼 수 있으며 이런 경우 클래스 간에 
 * "has ~ a" 관계로 풀어서 "~는 ~를 가지고 있다." 즉 포함 관계를 유지하는 것이 보다 효율적이다.
 * 
 * 예를 들어 삼각형과 점의 관계를 살펴보면 "has ~ a" 관계로 풀 수 있다. 
 * "삼각형은 3개의 꼭지 점을 가지고 있다."라고 할 수 있으므로 두 클래스 간에는
 * 상속 관계보다는 포함 관계를 맺는 것이 보다 효율적인 방법이라 할 수 있다.
 **/

// SmartTv는 TV 이다. - TV를 상속 받아서 스마트 TV의 속성과 동작을 정의한 클래스
public class SmartTv extends Tv {
	boolean isInternet;
	
	// 상속 받은 power() 메서드를 자신에 맞게 재정의 하는 것을 메서드 오버라이딩이라고 함
	@Override
	public void power() {
		power = !power;
		if(power) {
			isInternet = true;
		}else {
			isInternet=false;
		}
	}
	
	public SmartTv() {
		/* Object 클래스를 제외하고 자바의 모든 클래스의 생성자는 맨 첫 줄에
		 * 자신의 다른 생성자 또는 조상의 생성자를 호출해야 한다.
		 * super();를 안 적을 경우 보이지는 않지만 컴파일러에 의해 있음
		 **/
		
		//super("기본생성자 TV");  
		this("기본 생성자 TV");   // 자신의 다른 생성자를 호출
	}
	
	public SmartTv(String name) {
		super(name);
	}
	
	// 새로운 메서드를 추가
	public void internet() {		
		if(isInternet) {
			System.out.println("요청 사이트로 이동 중...");
		} else {
			System.out.println("인터넷 연결을 확인해주세요");
		}
	}
	
	public void movieInfo() {
		System.out.println("요청한 영화정보 검색 중...");
	}
}

package com.javastudy.ch05.inheritance;

//클래스간 관계설정(상속관계) - 스마트 TV는 TV 이다
public class SmartTvTest {
	
	public static void main(String[] args) {
		
		SmartTv tv = new SmartTv("우리집 TV");
		tv.power();
		tv.channel = 11;
		System.out.println("현재 채널 : " + tv.channelDown());		
		tv.internet();
		System.out.println(tv.name);
		
		System.out.println();
		tv.power();
		tv.channel = 12;
		System.out.println("현재 채널 : " + tv.channelDown());
		tv.internet();
		System.out.println(tv.name);
	}
}

 

▼상속 코드 보기 Phone▼

더보기
package com.mytest;

public class CellPhone {

	// 필드
	String model;
	String color;
	
	
	// 생성자
	
	
	// 메서드
	void powerOn() {
		System.out.println("전원을 켭니다.");
	}
	
	void powerOff() {
		System.out.println("전원을 끕니다.");
	}
	
	void bell() {
		System.out.println("벨이 울립니다.");
	}
	
	void sendVoice(String message) {
		System.out.println("자기 : "+ message);
	}
	
	void receiveVoice(String message) {
		System.out.println("상대방 : " + message);
	}
	
	void hangUp() {
		System.out.println("전화를 끊습니다.");
	}
	
}

package com.mytest;

public class DmbCellPhone extends CellPhone {
	// 필드
	int channel;
	
	// 생성자
	DmbCellPhone(String model, String color, int channel){
		
		//    ↱CellPhone으로 부터 상속받은 필드
		this.model = model;
		this.color = color;
	}
	
	//메소드
	void turnOnDmb() {
		System.out.println("채널 "+ channel + "번 DMB 방송 수신을 시작합니다.");
	}
	void changeChaanelDmb(int channel) {
		this.channel = channel;
		System.out.println("채널 " + channel + "번으로 바꿉니다.");
	}
	void turnOffDmb() {
		System.out.println("DMB 방송 수신을 멈춥니다.");
	}
	
}

package com.mytest;

public class DmbCellPhoneExample {
	
	public static void main(String[] args) {

		// ↱ DmbCellPhone 객체 생성하기
		DmbCellPhone dmbCellPhone = new DmbCellPhone("자바폰", "검정", 10);
		
		// ↱ CellPhone으로부터 상속받은 필드 출력해보기
		System.out.println("모델 : "+ dmbCellPhone.model);
		System.out.println("색상 : "+ dmbCellPhone.color);
		System.out.println();
		
		// ↱ DmbCellPhone의 필드 출력해보기
		System.out.println("채널 : "+ dmbCellPhone.channel);
		System.out.println();
		
		// ↱ CellPhone으로 부터 상속받은 메서드 호출
		dmbCellPhone.powerOn();
		dmbCellPhone.bell();
		dmbCellPhone.sendVoice("여보세오");
		dmbCellPhone.receiveVoice("안녕하세요! 저는 홍길동인데오");
		dmbCellPhone.sendVoice("아!~ 반갑습니다");
		dmbCellPhone.hangUp();
		System.out.println();
		
		// ↱ DmbCellPhone의 메서드 호출
		dmbCellPhone.turnOnDmb();
		dmbCellPhone.changeChaanelDmb(12);
		dmbCellPhone.turnOffDmb();
		
	}
}

 

 


※ 부모 생성자 호출

  • 자식 객체를 생성하면 -> 부모 객체가 먼저 생성되고 그 다음에  자식 객체가 생성 된다.

 

  • ★규칙!★ 부모 클래스에 기본 생성자가 없고 -> 매개 변수가 있는 생성자만 있다면 
    자식 생성자에서 반드시 부모생성자 호출을 위해서는 super(매개값, .....)를 명시적으로 호출 해야 함!!
    ★super(매개값, .....)는 반드시!! 자식 생성자의 첫 줄에 있어야 함!!★

 

▼부모 생성자 코드 보기▼

더보기
package com.mytest;

public class People {
	
	public String name;
	public String ssn;
	
	public People(String name, String ssn) {
		this.name = name;
		this.ssn = ssn;
	}

}

package com.mytest;

public class Student extends People {
	
	public int studentNo;
	
	public Student(String name, String ssn, int studentNo) {
    
		super(name, ssn); // 부모 생성자 호출!~ 없으면 에러남
                                  // 왜냐하면 부모 클래스에 기본생성자가 없기 때문임!!!
                          
		this.studentNo = studentNo;
	}
}

package com.mytest;

public class StudentExample {
	
	public static void main(String[] args) {
		Student st = new Student("홍길동", "12345-67890", 1);
		
		// 부모에서 물려받은 필드사용하기
		System.out.println("name : "+ st.name);
		System.out.println("ssn : "+ st.ssn);
		
		System.out.println("StudentNo : "+ st.studentNo);
	}

}

 

'Java > 상속' 카테고리의 다른 글

추상 클래스 (abstract)  (0) 2021.01.03
오버라이딩, 다형성  (0) 2021.01.02

+ Recent posts