[JAVA] 상속(Inheritance)[부모(슈퍼)클래스/ 자식(서브)클래스]1

@욕심쟁이

·

2020. 8. 31. 16:41

반응형

상속(Inheritance)이란?

 - 부모가 물려준 것을 자연스럽게 이용

 - 슈퍼 클래스(부모클래스, 상위 클래스)가 가진 멤버(변수, 메서드)를 서브클래스(자식클래스, 하위 클래스)가 물려받아  선언 없이 사용할 수 있도록 하는 것

 - 서브클래스를 정의 할 때  물려받을 슈퍼클래스를 지정하여 표현

 - 상속을 통해 슈퍼클래스의 멤버를 물려받기 때문에 직접 메서드는 변수를 생성할 필요가 없어서 코드 중복 최소화

  또한, 슈퍼클래스이 멤버를 수정하면 서브클래스에는 슈퍼클래스에서 수정된 내용이 그대로 적용되므로 유지보수용이

- 다중상속 불가(여러 개의 부모 클래스를 상속 X) → 부모는 단 하나

- private접근 제한을 갖는 필드와 메서드는 상속 대상에서 제외

- 자식이 부모를 선택(어떤 슈퍼클래스를 상속받을 것인지 결정 후 extends 기술)

- private접근제한자가 적용된 멤버나 생성자는 상속 불가

- 아무 클래스도 상속받지 않은 클래스는 자동으로 Object클래스를 상속

  → 모든 클래스의 최상위 클래스가 Object클래스이다!

  → 즉, 모든클래스에서는 Object 클래스의 멤버에 접근가능

클래스 간의 관계 2가지 

1. Has-a 관계(포함)

 - A has a B(a가 b를 포함한다)

 - 어떤 클래스 내에서 또 다른 특정 클래스를 포함시켜 사용

   (다른 클래스의 인스턴스를 생성하여 사용하는 것)

 - 가장 일반적인 클래스 간의 관계

 - ex) 자동차 has a 엔진, 자동차 has a 에어컨, 자동차 has a 라디오

2. Is-a(상속)

 - A is a B(A는 B이다 = B를 상속받아 A를 구현한다.)

 - 어떤 클래스가 또 다른 특정 클래스로부터 상속받아 사용

   (다른 클래스가 가진 멤버들은 아무런 선언 없이 상속받아 사용)

 - 객체지향에서의 핵심적인 클래스 간의 관계

   ex) 초등학생 is a 학생, 스마트폰 is a 핸드폰

상속에 필요한 작업

1) 추상화(일반화)

 - 대상 객체의 공통된 특성을 추출하여 상위 개 개념을 정의하는 것 (공통된 특성만 추출

 ex) 초등학생, 중학생, 고등학생 → 학생

예시) 갤럭시 S : 삼성 제조, 지문인식, 카메라, 전화, 문자, 카톡, 삼성 페이

       아이폰 : 애플 제조, 지문인식, 카메라, 전화, 문자, 카톡, 애플 페이

→ 두 대상의 공통점(카메라, 전화, 문자, 카톡...)을 추출하여 

   추상화 결과인 스마트폰 (SmartPhone) 이 추출됨

 

2) 구체화 

 - 대상 객체의 특성에 추가적인 특징을 결합하여 하위 개념을 정의하는 것

 ex) 학생 + 수능 → 고등학생 / 학생 + 동아리 → 대학생

예시) 

- 자동차 : 엔진, 에어컨, 라디오, 전진, 후진

→ 자동차의 기본 기능 + 손님 태우기 기능을 추가하여 택시(Taxi) 정의 가능 

<상속 적용 기본 문법>

class 서브클래스 명 extends 슈퍼 클래스명{}

예시)

public class Test {

	public static void main(String[] args) {
		
		DmbCellPhone dcp = new DmbCellPhone("자바폰","검정",10);
		System.out.println( "모델 : "+dcp.model);
		System.out.println( "색상 : "+dcp.color);
		System.out.println("채널 : " + dcp.channel);
		
		dcp.powerOn();
		dcp.bell();
		dcp.sendVoice("여보세요");
		dcp.receiveVoice("안녕하세요! 저는 홍길동인데요.");
		dcp.sendVoice("아~ 예 방갑습니다.");
		dcp.hangUp();

		dcp.turnOnDmb();
		dcp.changeChannelDmb(12);
		dcp.turnOffDmb();
		
	}

}

class CellPhone{

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

class DmbCellPhone extends CellPhone{
	
	int channel;
	
	public DmbCellPhone(String model, String color, int channel) {
		this.model =model;
		this.color = color;
		this.channel = channel;
	}
	
	public void turnOnDmb() {
		System.out.println("채널 " + channel + "번 DMB반송 수신을 시작합니다.");
	}
	public void changeChannelDmb(int channel) {
		this.channel = channel;
		System.out.println("채널" + channel + "번으로 바꿉니다.");
	}
	
	public void turnOffDmb() {
		System.out.println("DMB방송 수신을 멈춥니다.");
	}
	
}

/*
<출력결과>
모델 : 자바폰
색상 : 검정
채널 : 10
전원을 켭니다.
벨이 울립니다.
자기: 여보세요
상대방 : 안녕하세요! 저는 홍길동인데요.
자기: 아~ 예 방갑습니다.
전화를 끊습니다.
채널 10번 DMB반송 수신을 시작합니다.
채널12번으로 바꿉니다.
DMB방송 수신을 멈춥니다.

*/

반응형