[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방송 수신을 멈춥니다.
*/
'IT > JAVA' 카테고리의 다른 글
[JAVA] 형변환(기본형변환/참조형변환[upcasting/downcasting]) (0) | 2020.09.07 |
---|---|
[JAVA] FINAL 키워드 (0) | 2020.09.02 |
[JAVA] this키워드 (0) | 2020.08.21 |
[JAVA] 생성자 오버로딩(생성자 다중정의) (0) | 2020.08.21 |
[JAVA] 생성자 필드(멤버변수) 초기화 (0) | 2020.08.21 |