2/24(금) 상속보다 구성

정민지·2023년 2월 24일
0

// 문제 : 아래가 실행되도록 해주세요.

class Main {
  public static void main(String[] args) {
    사람 a사람 = new 사람();
    
    a사람.나이 = 20;
    a사람.a왼팔 = new 팔();
  }
}

class 사람 {
  // 클래스안에 변수를 정의 할 수 있다.
  int 나이;
}

담기는 값에 따라 자료형 지정

칼,활을 아우르는 무기 클래스로 전사 a무기 자료형 바꾸기

왼쪽에 점 찍어서 디버깅
어떻게 작동 되는지, 어디가 틀린지 알수 있음
->F6하면 한줄씩 실행 가능

F5를 누르면 한줄 코드 실행하고 자세한 상황 알려줌

클래스를 new 클래스 하자마자 값을 주고 싶을때 생성자 함수 필요,
-> 그게 아니여도 무조건 있어야 됌

생성자 각각 만들고 구성 -> 원래 각 클래스마다 생성자 있는제 맞음

// 문제 : 아래와 같이 출력 되도록 해주세요.
// 조건 : 생성자를 오직 3개만 사용해서 만들어주세요.

class Main {
  public static void main(String[] args) {
    int 엄지손가락_길이 = new 사람().a왼팔.a손.a엄지손가락.길이;
    
    System.out.println(엄지손가락_길이 + "cm");
    // 출력 : 5cm
  }
}

class 사람 {
  팔 a왼팔;
  
  사람() {
    a왼팔 = new 팔();
  }
}

class 팔 {
  손 a손;
  
  팔() {
    a손 = new 손();
  }
}

class 손 {
  손가락 a엄지손가락;
  
  손() {
    a엄지손가락 = new 손가락();
    a엄지손가락.길이 = 5;
  }
}

class 손가락 {
  int 길이;
}

생성자 갯수 하나로 줄이라고 하면 이렇게 (좋은 구조X)

// 문제 : 아래와 같이 출력 되도록 해주세요.
// 조건 : 생성자를 단 1개만 사용해주세요.

class Main {
  public static void main(String[] args) {
    int 엄지손가락_길이 = new 사람().a왼팔.a손.a엄지손가락.길이;
    
    System.out.println(엄지손가락_길이 + "cm");
    // 출력 : 5cm
  }
}

class 사람 {
  팔 a왼팔;
  
  사람() {
    a왼팔 = new 팔();
    a왼팔.a손 = new 손();
    a왼팔.a손.a엄지손가락 = new 손가락();
    a왼팔.a손.a엄지손가락.길이 = 5;
  }
}

class 팔 {
  손 a손;
}

class 손 {
  손가락 a엄지손가락;
}

class 손가락 {
  int 길이;
}

--중복을 없앨땐 상속보다 구성
(결합도를 낮추는것이 좋음, 상속 지양, 클래스에서 다른 클래스 언급 최소화)

https://replit.com/@jangka512/ThreadbareGreenMethods#Main.java


똑같은 코드가 보임- 전사 class를 만들면 됌


-아이템을 바꾸고 싶으면 추상 아이템 클래스로 묶기

자식 클래스 실행전에 부모 클래스 생성자가 먼저 실행되고 실행

오리 예제

package org.example;
// 문제 : 아래가 실행되도록 해주세요.
/* 가정
우리는 게임개발회사에 입사했다.
우리에게는 성격좋은 사수 한명이 있다.
내가 개발할 게임은 오리시뮬레이션 게임이다.
선임이 나의 개발을 도와주진 않지만 조언은 해준다.
*/

/* 요구사항
- D1 요구 : 오리를 생성하고 날게하시오.
- D1 완료 : 클래스와 메서드를 만들어서 처리
- D2 요구 : 게임의 디테일을 살리기 위해서 `청둥오리`와 `흰오리`를 생성하고 날게하시오.
- D2 완료 : 클래스와 메서드를 만들어서 처리
- D3 요구 : 오리 계열의 클래스에 날다 메서드가 중복되었습니다. 중복을 제거해주세요.
- D3 완료 : 상속을 사용해서 처리
- D4 요구 : 게임의 재미를 위하여 고무오리를 추가하고 날게 하시오.
- D4 완료 : 클래스와 메서드를 만들어서 처리
- D5 요구 : 주말 주주회의에서 고무오리가 하늘을 날아다니는 것에 대해서 태클이 들어왔습니다. 고무오리 계열은 하늘을 날 수 없게 해주세요.
- D5 완료 : 메서드 오버라이드를 사용해서 처리
- D6 요구 : 고무오리가 반응이 좋습니다. 고무2오리를 추가하고 날게 해주세요.
- D6 완료 : 고무오리가 반응이 좋습니다. 고무2오리를 추가하고 날게 해주세요.
- D7 요구 : 고무오리계열에서 날다 메서드의 중복을 제거해주세요.
- D7 완료 : 상속으로 해결
- D8 요구 : 상속에는 한계가 있습니다. 상속을 사용하지 않고 고무오리계열의 중복을 제거해주세요.
- D8 요구 : 자바에서 다중상속은 불가능 합니다. 상속에는 한계가 있습니다. 상속을 사용하지 않고 고무오리계열의 중복을 제거해주세요.
- D8 완료 : 상속이 아닌 구성을 써서 해결
- D9 요구 : 현질기능을 추가한다. 로켓비행아이템을 추가하세요.
*/

class Main {
    public static void main(String[] args) {
        청둥오리 a청둥오리 = new 청둥오리();
        a청둥오리.날다();
        // 출력 : 오리가 날개로 날아갑니다.

        흰오리 a흰오리 = new 흰오리();
        a흰오리.날다();
        // 출력 : 오리가 날개로 날아갑니다.

        고무오리 a고무오리 = new 고무오리();
        a고무오리.날다();
        // 출력 : 저는 날 수 없어요. ㅜㅠ

        고무2오리 a고무2오리 = new 고무2오리();
        a고무2오리.날다();
        // 출력 : 저는 날 수 없어요. ㅜㅠ

        a고무2오리.a비행아이템 = new 로켓비행아이템();
        a고무2오리.날다();
        // 출력 : 로켓파워로 날아갑니다.
    }
}

abstract class 오리 {
    비행아이템 a비행아이템;

    오리() {
        a비행아이템 = new 날개비행아이템();
    }

    void 날다() {
        a비행아이템.작동();
    }
}

class 흰오리 extends 오리 {
}

class 청둥오리 extends 오리 {

}

class 고무오리 extends 오리 {
    고무오리() {
        a비행아이템 = new 못나는비행아이템();
    }
}

class 고무2오리 extends 오리 {
    고무2오리() {
        a비행아이템 = new 못나는비행아이템();
    }
}

abstract class 비행아이템 {
    abstract void 작동();
}

class 날개비행아이템 extends 비행아이템 {
    void 작동() {
        System.out.println("오리가 날개로 날아갑니다.");
    }
}

class 못나는비행아이템 extends 비행아이템 {
    void 작동() {
        System.out.println("저는 못 날아요 ㅠㅠ");
    }
}

class 로켓비행아이템 extends 비행아이템 {
    void 작동() {
        System.out.println("로켓파워로 날아갑니다.");
    }
}
profile
꾸준히 성장하는 개발자

0개의 댓글