본문 바로가기

BackEnd/Java

0926 JAVA - 상속 is-a , has-a

728x90
반응형

상속(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);
}

}

 

728x90
반응형