spring_2기[본캠프]/과제

[라이브 코딩테스트]

minwoo95 2025. 12. 23. 17:40

Main

public class Main {
    public static void main(String[] args) {
        //챔피언 2명 이상 생성
        Champion a1 = new A1("A1",100,50);
        Champion b1 = new B1("B1",100,70);

        //서로 공격
        a1.basicAttack(b1);
        b1.basicAttack(a1);

        //로그 출력
        log.showLog();
    }
}

Champion

public abstract class Champion {
    private String name;
    private int hp;
    private int attackDamage;
//    private List<String> log = new ArrayList<String>();//별도 클래스로 분리


    public Champion(String name, int hp, int attackDamage) {
        this.name = name;
        this.hp = hp;
        this.attackDamage = attackDamage;
    }


    public int getDamage(){
        return this.attackDamage;
    }
    public String getName(){
        return this.name;
    }
    public int getHp(){
        return this.hp;
    }
//    public void  setHp(int hp){
//        this.hp = hp;
//    }
//    public void addLog(String log){
//        this.log.add(log);
//    }
//    public void showLog(){
//        System.out.println(this.log.get());
//    }


    public abstract void basicAttack(Champion target);

    //[피드백]데미지를 받는 부분을 추상메서드화 takeDamage
    public void takeDamage(int damage){//상대방의 데미지값만 받아와서 내가 체력을 관리
        int finalDamage = this.getHp()-damage;
        if(finalDamage<0){
            finalDamage = 0;
        }
        this.hp=finalDamage;
    }

}

 

A1

target.takeDamage(this.getDamage());

원래는 아래처럼 로직을 구현하였다.

튜터님의 피드백에 따라 [ TDA 명령하라, 그리고 내것은 내가 수정하고, 메서드는 하고자 하는 목표 일만 할수 있도록 설계해라] 

위처럼 수정 하면서 객체지향의 핵심과 JAVA에 대해 느낌표 X 1만개 ㅠㅠ

//        int finalDamage = target.getHp()-this.getDamage();
//        if(finalDamage<0){
//            finalDamage = 0;
//        }
//        target.setHp(finalDamage);
public class A1 extends Champion {

    public A1(String name,int hp,int attackDamage ){
        super(name,hp,attackDamage);
     }

    public void basicAttack(Champion target){
//        System.out.println(this.getName()+"이(가) "+target.getName()+"에게 공격을 합니다.");
        target.takeDamage(this.getDamage());//TDA//내상테는 내가 관리한다.
        //실용주의 프로그래머, 객체지향의 사실과 오해 책사기
        //나중에 스프링 도중에 객체지향 개념 관련 오브젝트책 보기전에 헤드퍼스트에 디자인패턴
        //개념정리->유형정리->두달동안 문제만 풀기

//[피드백] 공격만 하면되지, 왜 상대방의 체력까지 관여할려고 하냐?
//        int finalDamage = target.getHp()-this.getDamage();
//        if(finalDamage<0){
//            finalDamage = 0;
//        }
//        target.setHp(finalDamage);

        //[피드백] 로그를 저장하는것 까지는 좋다. 그럴려면 클래스를 별도 생성하여 로그를 저장하는게 좋다.
//        this.addLog(this.getName()+"이(가) "+target.getName()+"에게 공격을 합니다.");
        log.addLog(this.getName()+"이(가) "+target.getName()+"에게 공격을 합니다.");
    }

B1

public class B1 extends Champion {

    public B1(String name,int hp,int attackDamage ){
        super(name,hp,attackDamage);
    }

    public void basicAttack(Champion target){
        target.takeDamage(this.getDamage());
        log.addLog(this.getName()+"이(가) "+target.getName()+"에게 공격을 합니다.");
    }
}

log

import java.util.ArrayList;
import java.util.List;

public class log {
    private static List<String> logList = new ArrayList<String>();

    public static void addLog(String log){
        logList.add(log);
    }
    public static void showLog(){
        for(int i=0;i<logList.size();i++){
            System.out.println((i+1)+"번째 로그 : "+logList.get(i));
        }
    }
}

 

[튜터님 피드백]

1. 문법에는 개념이 잡혀있으나, 객체지향의 핵심이 부족하다.

2. 객체지향에 대해 개념을 좀더 확고히 하고 코딩을 많이 해보면 충분히 될것같다.

3. TDA 명령하라, 그리고 내것은 내가 수정하고, 메서드는 1가지의 일만 할수 있도록 설계해라

 

[느낀점]

코딩테스트를 해보니, 실제 주어진 시간안에 코딩을 완성해야한다는 압박감에 평소와 같이 코딩을 하지 못하였다.

정말 중요한 경험이였던것 같다.

일단, 앞선 과제들을 해결하면서 내가 한참 부족하다고 생각하고 있었지만, 정확히 어떤부분이 부족한지 명확히 하지 못하였다.

하지만 이번 코딩 테스트를 통하여, [ TDA 명령하라, 그리고 내것은 내가 수정하고, 메서드는 하고자 하는 목표 일만 할수 있도록 설계해라] 

핵심 내용을 한번 듣고 나니, 내가 왜 고민하고 부족하다고 생각했는지 단번에 정리가 되었다.

말씀주신 피드백을 바탕으로 앞선 과제들부터 다시한번 수정하면서 습득 해야할것같다!