오리 문제

인철·2023년 10월 13일
0

algorithm

목록 보기
22/91

상속문제

/* 요구사항
- D1 요구 : 오리를 생성하고 날게하시오.
- D1 완료 : 클래스와 메서드를 만들어서 처리
	class 오리{
	void 날다(){
System.out.println("오리가 날개로 날아갑니다")}}
- D2 요구 : 게임의 디테일을 살리기 위해서 `청둥오리`와 `흰오리`를 생성하고 날게하시오.
- D2 완료 : 클래스와 메서드를 만들어서 처리
	class 흰오리{
	void 날다(){
System.out.println("오리가 날개로 날아갑니다")}}
	class 청둥오리{
	void 날다(){
System.out.println("오리가 날개로 날아갑니다")}}

출력내용
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다

System.out.println("오리가 날개로 날아갑니다")}}
- D3 요구 : 오리 계열의 클래스에 날다 메서드가 중복되었습니다. 중복을 제거해주세요.
- D3 완료 : 상속을 사용해서 처리 extends 상속
	class 오리{
	void 날다(){
System.out.println("오리가 날개로 날아갑니다")}}
	class 흰오리 extends 오리{}
	class 청둥오리 estens 오리{}

출력내용
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다

- D4 요구 : 게임의 재미를 위하여 고무오리를 추가하고 날게 하시오.
- D4 완료 : 클래스와 메서드를 만들어서 처리

	class 오리{
	void 날다(){
System.out.println("오리가 날개로 날아갑니다")}}
	class 흰오리 extends 오리{}
	class 청둥오리 extens 오리{}
	class 고무오리 extends 오리{}

출력내용
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다


- D5 요구 : 주말 주주회의에서 고무오리가 하늘을 날아다니는 것에 대해서 태클이 들어왔습니다. 고무오리 계열은 하늘을 날 수 없게 해주세요.
- D5 완료 : 메서드 오버라이드를 사용해서 처리

class 오리{
	void 날다(){
System.out.println("오리가 날개로 날아갑니다")}}
	class 흰오리 extends 오리{}
	class 청둥오리 extens 오리{}
	class 고무오리 extends 오리{
void 날다(){
System.out.println("오리가 날지 못합니다")}} ----> 오버라이드할때는 println내용을 바꾸기

출력내용
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다
	오리가 날지 못합니다

- D6 요구 : 고무오리가 반응이 좋습니다. 고무2오리를 추가하고 날게 해주세요.
- D6 완료 : 고무오리가 반응이 좋습니다. 고무2오리를 추가하고 날게 해주세요.

class 오리{
	void 날다(){
System.out.println("오리가 날개로 날아갑니다")}}
	class 흰오리 extends 오리{}
	class 청둥오리 extens 오리{}
	class 고무오리 extends 오리{
void 날다(){
System.out.println("오리가 날지 못합니다")}} ----> 오버라이드할때는 println내용을 바꾸기
class 고무2오리 extends 오리{}

출력내용
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다
	오리가 날지 못합니다
	오리가 날지 못합니다

- D7 요구 : 고무오리계열에서 날다 메서드의 중복을 제거해주세요.
- D7 완료 : 상속으로 해결

class 오리{
	void 날다(){
System.out.println("오리가 날개로 날아갑니다")}}
	class 흰오리 extends 오리{}
	class 청둥오리 extens 오리{}
	class 고무오리 extends 오리{
	void 날다(){
System.out.println("오리가 날지 못합니다")}}}
class 고무2오리 extends 고무오리{}
-----> 흰오리, 청둥오리, 고무오리 < 오리 상속
----> 고무2오리 < 고무오리 상속 ----> 복잡한 상속이라고 칭한다

출력내용 
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다
	오리가 날개로 날아갑니다
	오리가 날지 못합니다
	오리가 날지 못합니다

- D8 요구 : 자바에서 다중상속은 불가능 합니다. 상속에는 한계가 있습니다. 복잡한 상속을 사용하지 않고 고무오리계열의 중복을 제거해주세요.
  - 복잡한 상속을 사용하지 않는다는 것의 의미 : 모든 오리 계열 클래스들은 부모클래스가 오리 클래서 여야 한다. 
-----> 불가능한 경우도 발생하다. 최대한 상속을 사용을 할때는 통일을 하는게 좋다
D8, D7은 정답이 같다.
*/

class Main {
  public static void main(String[] args) {
    청둥오리 a청둥오리 = new 청둥오리();
    a청둥오리.날다();
    // 출력 : 오리가 날개로 날아갑니다.
    
    흰오리 a흰오리 = new 흰오리();
    a흰오리.날다();
    // 출력 : 오리가 날개로 날아갑니다.
    
    고무오리 a고무오리 = new 고무오리();
    a고무오리.날다();
    // 출력 : 저는 날 수 없어요. ㅜㅠ
    
    고무2오리 a고무2오리 = new 고무2오리();
    a고무2오리.날다();
    // 출력 : 저는 날 수 없어요. ㅜㅠ
  }
}

class 오리 {
  void 날다() {
    System.out.println("오리가 날개로 날아갑니다.");
  }
}

// 오리 => 부모 클래스
// 흰오리 => 자식 클래스
// 흰오리 extends 오리 => 흰오리가 오리의 능력을 물려 받는다.
// "`흰오리`는 `오리`이다." 라고 자바에게 알려준다.
// `A 는 B 이다.` 테스트에 통과하는 것만 상속이 가능하다.
// 클래스와 객체는 명사이다.
// 메서드는 동사이다.
class 흰오리 extends 오리 {
  
}

class 청둥오리 extends 오리 {
  
}

class 고무오리 extends 오리 {
  // 메서드 재정의 라고 합니다.
  // 메서드 오버라이드 라고도 합니다.
  // 메서드 재정의 => 부모가 물려준 능력을 다시 구현한다.
  void 날다() {
    System.out.println("저는 날 수 없어요. ㅜㅠ");
  }
}

class 고무2오리 extends 고무오리 {
  
}



문제 : 아래와 같이 출력되도록 해주세요.

// 조건 : 소스코드 중복이 없어야 합니다.
// 조건 : 복잡한 상속을 써도 됩니다.

class Main {
	public static void main(String[] args) {
		System.out.println("== 청둥오리 ==");
		청둥오리 a청둥오리 = new 청둥오리();
		a청둥오리.날다(); // 오리가 날개로 날아갑니다.
		a청둥오리.수영하다(); // 오리가 물갈퀴로 수영합니다.
		System.out.println("== 흰오리 ==");
		흰오리 a흰오리 = new 흰오리();
		a흰오리.날다(); // 오리가 날개로 날아갑니다.
		a흰오리.수영하다(); // 오리가 물갈퀴로 수영합니다.
		System.out.println("== 고무오리 ==");
		고무오리 a고무오리 = new 고무오리();
		a고무오리.날다(); // 저는 못 날아요 ㅠㅠ
		a고무오리.수영하다(); // 오리가 물에 둥둥 떠다닙니다.
		System.out.println("== 고무2오리 ==");
		고무2오리 a고무2오리 = new 고무2오리();
		a고무2오리.날다(); // 저는 못 날아요 ㅠㅠ
		a고무2오리.수영하다(); // 오리가 물에 둥둥 떠다닙니다.
		System.out.println("== 로봇오리 ==");
		로봇오리 a로봇오리 = new 로봇오리();
		a로봇오리.날다(); // 오리가 날개로 날아갑니다.
		a로봇오리.수영하다(); // 오리가 물에 둥둥 떠다닙니다.
	}
}
class 오리 {
	void 날다() {
		System.out.println("오리가 날개로 날아갑니다.");
	}
	void 수영하다() {
		System.out.println("오리가 물갈퀴로 수영합니다.");
	}
}
class 흰오리 extends 오리 { }
class 청둥오리 extends 오리 { }
class 고무오리 extends 로봇오리 {
	void 날다() {
		System.out.println("저는 못 날아요. ㅜㅠ");
	}
}
class 고무2오리 extends 고무오리 { }
class 로봇오리 extends 오리{
		void 수영하다() {
		System.out.println("오리가 물에 둥둥 떠다닙니다."); 
	}
}

1. 로봇오리 클래스 추가
2. 오리 클래스 메서드 상속
3. 고무오리 메서드 추가(중복이 됨)
4. 고무오리 로봇오리 상속으로 변경(A = B 불가능)
----> 위 상황처럼 A = B 가 아닌 경우가 있어 무조건 상속으로 해결 하는 방법은 옳지 않다.
profile
같은글이있어도양해부탁드려요(킁킁)

0개의 댓글