상속(inheritance)
상속의 장점은 처음에 설명했던 것과 큰 차이가 없다.
중복된 코드를 줄일 수 있고, 유지 보수가 편리하며, 통일성이 있고 다형성을 구현할 수 있다.
[상속의 기본 문법]
class 서브클래스명 extends 슈퍼 클래스명 {}
슈퍼클래스에 해당하는 Parent 클래스 정의
서브클래스 child 인스턴스 생성
Child c = new Child();
서브클래스의 직접 정의한 메서드
c.childPrn();
child 클래스는 자신의 클래스 내의 멤버뿐만 아니라
슈퍼클래스인 Parent 클래스 멤버도 아무런 선언 없이 사용 가능
c.num = 10;
c.parentPrn();
c.showNum();
아버지 클래스의 인스턴스 생성
아버지 아버지 = new 아버지();
아버지 클래스 자신의 멤버
System.out.println("아버지의 자동차: " + 아버지.자동차);
아버지.노래하기();
할아버지 클래스로부터 상속받은 멤버
System.out.println("아버지의 집 :"+아버지.집);
아버지.그림그리기();
나 클래스의 인스턴스 생성
나 나 = new 나();
나 클래스 자신의 멤버
System.out.println("내 폰 : " + 나.폰);
나.프로그래밍();
아버지 클래스로부터 상속받은 멤버
System.out.println("내 자동차 : " + 나.자동차);
나.노래하기();
할아버지 클래스부터 상속받은 아버지 클래스로부터 상속받은 멤버
System.out.println("내 집 : " + 나.집);
나.그림그리기();
class Parent { //(=class Parent extends Object) 와 동일함
int num; //슈퍼클래스의 멤버변수
public void parentPrn() {
System.out.println("슈퍼클래스의 parentPrn()");
}
}
Parent 클래스를 상속받게 되면
Child 클래스에서 선언하지 않은 멤버 (=Parent의 멤버)도 사용 가능해짐
class Child extends Parent {
public void childPrn() {
System.out.println("서브 클래스의 childPrn()");
}
슈퍼클래스의 멤버변수 num에 접근 가능
public void showNum() {
System.out.println("부모로부터 상속받은 멤버변수 num = " + num);
}
}
할아버지 클래스를 상속받는 아버지 클래스 정의
멤버변수 : 자동차 ("스포츠카")
메서드 : 노래하기("노래를 잘한다!" 출력)
class 할아버지 {
String 집 = "고층 아파트";
String 티비 = "최신형 티비";
public void 그림그리기() {
System.out.println("그림을 잘 그린다!");
}
}
class 아버지 extends 할아버지 {
String 자동차 = "스포츠카";
public void 노래하기() {
System.out.println("노래를 잘한다!");
}
}
아버지 클래스를 상속받는 나 클래스 정의
멤버변수, 메서드 하나씩 정의
class 나 extends 아버지 {
String 폰 = "스마트폰";
public void 프로그래밍() {
System.out.println("프로그래밍을 잘 한다!");
}
}
전체 예제
//슈퍼클래스에 해당하는 Parent 클래스 정의
//서브클래스 child 인스턴스 생성
Child c = new Child();
c.childPrn(); //서브클래스의 직접 정의한 메서드
//child 클래스는 자신의 클래스 내의 멤버뿐만 아니라
//슈퍼클래스인 Parent 클래스 멤버도 아무런 선언 없이 사용 가능
c.num = 10;
c.parentPrn();
c.showNum();
System.out.println("=====================================");
//아버지 클래스의 인스턴스 생성
아버지 아버지 = new 아버지();
//아버지 클래스 자신의 멤버
System.out.println("아버지의 자동차: " + 아버지.자동차);
아버지.노래하기();
//할아버지 클래스로부터 상속받은 멤버
System.out.println("아버지의 집 :"+아버지.집);
아버지.그림그리기();
System.out.println("------------------");
//나 클래스의 인스턴스 생성
나 나 = new 나();
//나 클래스 자신의 멤버
System.out.println("내 폰 : " + 나.폰);
나.프로그래밍();
//아버지 클래스로부터 상속받은 멤버
System.out.println("내 자동차 : " + 나.자동차);
나.노래하기();
//할아버지 클래스부터 상속받은 아버지 클래스로부터 상속받은 멤버
System.out.println("내 집 : " + 나.집);
나.그림그리기();
}
}
class Parent { //(=class Parent extends Object) 와 동일함
int num; //슈퍼클래스의 멤버변수
public void parentPrn() {
System.out.println("슈퍼클래스의 parentPrn()");
}
}
class Child extends Parent {
//Parent 클래스를 상속받게 되면
//Child 클래스에서 선언하지 않은 멤버 (=Parent의 멤버)도 사용 가능해짐
public void childPrn() {
System.out.println("서브 클래스의 childPrn()");
}
public void showNum() {
//슈퍼클래스의 멤버변수 nu에 접근 가능
System.out.println("부모로부터 상속받은 멤버변수 num = " + num);
}
}
class 할아버지 {
String 집 = "고층 아파트";
String 티비 = "최신형 티비";
public void 그림그리기() {
System.out.println("그림을 잘 그린다!");
}
}
//할아버지 클래스를 상속받는 아버지 클래스 정의
//멤버변수 : 자동차 ("스포츠카")
//메서드 : 노래하기("노래를 잘한다!" 출력)
class 아버지 extends 할아버지 {
String 자동차 = "스포츠카";
public void 노래하기() {
System.out.println("노래를 잘한다!");
}
}
//아버지 클래스를 상속받는 나 클래스 정의
//멤버변수, 메서드 하나씩 정의
class 나 extends 아버지 {
String 폰 = "스마트폰";
public void 프로그래밍() {
System.out.println("프로그래밍을 잘 한다!");
}
}
문제
[ Account 클래스를 상속받는 ItwillBank 클래스 정의 ]
- Account 기본 기능 (계좌 기본 기능)은 그대로 유지
=> 계좌번호 AccountNo, 예금주명 ownerName , 현재잔고 balance 멤버변수
=> 입금하기 deposit, 출금하기 withdraw, 정보보기 showAccountInfo 메서드
- 멤버변수 추가 : 보험형 (insureName, 문자열)
- 메서드 추가 : 보험계약 (contract()) * => 파라미터 : 보험명
리턴값 : 없음
=> 전달받은 보험명을 멤버변수에 저장 후 "XXX 보험 계약 완료!" 출력
문제
[ 직원(Employee) 클래스 ]
멤버 변수
- 직원 이름 (name, 문자열)
- 연봉 (salary, 정수) * 메서드
- 직원 정보를 문자열로 결합하여 리턴하는 getEmployee() 메서드 정의
(파라미터 없음, 리턴값있음)
=> 직원 이름과 연봉을 문자열로 결합하여 리턴
ex) 홍길동, 4000
-------------------------------------------------------------------------------------------------------------------------------------------------------
[ Employee 클래스를 상속받는 Manager 클래스 정의 ]
- 이름, 연봉, 부서명(depart, 문자열) 멤버변수
- 이름, 연봉, 부서명을 문자열로 결합하여 리턴하는 getManager() 메서드
문제
has-a 관계 (포함) vs is-a 관계 (상속)
1.has-a 관계 (포함)
-A has a B = A가 B를 포함한다 로 표현 가능 한 관계
- 가장 일반적인 객체간의 관계
- 특정 클래스 내에서 다른 클래스의 인스턴스를 생성하여
해당 인스턴스를 다루는 관계
- 예) 자동차 - 엔진, 스마트폰 - 카메라
2.is-a 관계 (상속)
- A is a B = A 는 B이다 로 표현 가능한 관계
- 특정 클래스가 다른 클래스를 상속 받아
해당 클래스의 멤버를 선언 없이 다루는 관계
- 예) 자동차 - 소방차, 핸드폰 - 스마트폰
class Engine {
int cc = 3000; // 배기량
}
자동차와 엔진의 관계는? has-a (포함관계)이다.
=> 자동차는 엔진을 포함한다 = Car has a Engine.
class Car {
//포함관계일 경우 해당클래스의 인스턴스를 통해 접근 가능한 관계
Engine engine = new Engine();
String modelName = "그랜져";
public void showCarInfo() {
//자신의 멤버변수에 접근 시 변수명만으로 접근 가능
System.out.println("모델명 : " + modelName);
//포함관계에 있는 클래스의 멤버에 접근 시 참조변수를 통해 접근 가능
System.out.println("배기량 : " + engine.cc);
}
}
소방차와 자동차의 관계는? is-a 관계 (상속)이다.
소방차가 자동차이다 = 소방차 is a 자동차
class FireEngine extends Car {
int supplyLimit = 10000; //급수량
public void showFireEngineInfo() {
//자신의 멤버에 접근
System.out.println("급수량 : " + supplyLimit);
//부모의 멤버에 접근
System.out.println("모델명 : " + modelName);
//부모와 포함관계인 Engine 객체의 멤버에 접근
System.out.println("배기량 : " + engine.cc);
}
}
'BackEnd > Java' 카테고리의 다른 글
0928 JAVA - 메서드 오버라이딩 (0) | 2022.09.28 |
---|---|
0926 JAVA - 상속 - 생성자 (0) | 2022.09.26 |
0922 JAVA - 자바 싱글톤 클래스(SingletonClass) (1) | 2022.09.22 |
0922 JAVA - package ~ import 키워드 (0) | 2022.09.22 |
0921 JAVA - PASS BY , this 키워드 (1) | 2022.09.21 |