// 문제 : 아래가 실행되도록 해주세요.
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("로켓파워로 날아갑니다.");
}
}