The Debugging Chronicles : "코드의 미학"

동물의 숲 예제로 알아보는 클래스 본문

JAVA/자바 수업 내용

동물의 숲 예제로 알아보는 클래스

sweetseonah1004 2024. 7. 4. 11:46
[예제]

class 주민

            String 타입; //무조건 있음 

            String 이름; // 주민을 생성할 때, 이름을 반드시 설정하면서 만들어야함

hello()

           행복함 /  무난함/ 슬픔/ 화남  중에 1개를 랜덤으로 출력함

                              , 고양이 는 야옹

                              ,개구리는 개굴

action (String 도구)

                              잠자리채 >> 곤충채집

                             낚시대 >> 생선 낚시

                            삽 >> 땅파기

class 고양이 extends 주민
class 개구리 extends 주민

main ()

           주민[] datas = new 주민[3];

          datas[i] = new  고양이 (히죽);

                           new 고양이 (1호);

                           new 개구리(레이니);

                           new 개구리(아이다);

클래스(타입, 자료형):주민, 고양이 ,개구리

객체(변수,값,실제 메서드 수행 주체 ): 히죽, 1호, 레이니, 아이다,…. 

 

 


 

1. 주민  class 부분

>> 내가 쓴 코드

//
class Citizen {
	String type;
	String name;
	Citizen(String type){
		this(type, "이름 없음");
	}
	Citizen(String type,String name){
		this.type = type;
		this.name = name;
	}
	void hello(){
		Random rand = new Random();
		String[] emotions = {"행복함","무난함","슬픔","화남"};
		System.out.println(emotions[rand.nextInt(4)]);
	}
	@Override
	public String toString() {
		Random rand = new Random();
		String[] emotions = {"행복함","무난함","슬픔","화남"};
		return emotions[rand.nextInt(4)];
	}
	void action(String tool) {
		String[] tools = {"잠자리채","낚시대","삽"};
		if(tool.equals(tools[0])) {
			System.out.println("곤충채집");
		}else if(tool.equals(tools[1])) {
			System.out.println("생선 낚시");
		}else if(tool.equals(tools[2])) {
			System.out.println("땅파기");
		}
	}
}

>> 고쳐야 할 부분 &  더 생각할 부분

코드를 어떻게 하면 더 효율적으로 쓸 것인가에 대한 생각이 필요한 것 같다.
일단 무조건 한글로 코딩을 어떻게 할 것인가 적자! 그리고 나서 하드 코딩을 한다.

그리고 내가 배운 것들 안에서 어떻게 효율적으로 바꿀지에 대해 한번 더 생각해봐야겠다.

>> 강사님이 쓰신 코드

class Animal {
	String type;
	String name;
	static String[] datas = {"행복","무난","슬픔","화남"}; //final은 더이상 데이터 추가가 안될 때 
	static Random rand; 
	Animal(String type, String name){
		this.type = type;
		this.name = name;
		//this.rand = new Random(); 
	}
	void hello () {
//		String[] datas = {"행복","무난","슬픔","화남"};
//		Random rand = new Random();// 인사를 할 때 마다 반복
		int randNum = Animal.rand.nextInt(Animal.datas.length);
		System.out.println(Animal.datas[randNum]);
	}
}

>>> 생각해보기

    1. 힙 메모리에 저장되는 new 연산자는 적게 쓸 수록 좋다. 

    여기서 hello 연산자 함수 안에 Random을 선언 한다면 오버라이딩 될 어 hello 생성자 함수를 변경 할 때마다 선언 해줘야한다.

   이럴때 생각해야하는게 클래스 함수로의 선언이다. Static으로 멤버 변수 선언부에 써주면 효율적으로 코드를 쓸 수 있다.

   위 와 같은 맥락에서 주민들의 감정또한 고양이든 개구리든 같은 감정을 느끼도록 설정해 두었기에 부모 클래스 안에 클래스 변수로 선언     해서 어디서든 사용  가능하도록 한다.

   2. 하드 코딩 하지 말기

   emotions[rand.nextInt(4)] 로 쓰는게 아니라 datas.length로 써서 하드 코딩을 하지 말자.

 

2. action (String 도구) 부분

>>강사님 코드 (삽 부분 생략)

class Tool {
	String name;
	Tool(String name){
		this.name =name;
	}
	void action() {
		System.out.println("액션");
	}
}
class Fishing extends Tool{
	Fishing(){
		super("낚시대");
	}
	@Override
	void action() {
		System.out.println("생선낚시");
	}
}
class DragonFly extends Tool{
	DragonFly(){
		super("잠자리채");
	}
	@Override
	void action() {
		System.out.println("곤충채집");
	}
}
class Animal {
   String type;
   String name;
   static String[] datas= {"행복","무난","슬픔","화남"};
   static Random rand=new Random();
   Animal(String type,String name) {
      this.type=type;
      this.name=name;
   }
   void hello() {
      int randNum=Animal.rand.nextInt(Animal.datas.length);
      System.out.println(Animal.datas[randNum]);
   }
   public void action(Tool tool) {
      tool.action();
   }
}

>>>생각해보기

     1. 도구라는 객체가 있다 라는 관점에서 문제 풀이 (도구 자료형 , 클래스를 만듬)

     아이템은 외부요인에 의해 받아지는 것이므로 주민의 고유한 속성이 아니기 때문에

     Animal 클래스 안에서 메서드로 선언해 주는 것이 아니라 Tool 클래스로 타입을 만든다.

     이때 중요한건 Tool클래스 안에 동일한 동작을 하는 action이라는 메서드들의 이름을 동일하게 맞추는 것이 중요하다.

     2. 그리고 Animal에서 action을 public 메서드로 선언해준다. 이때 인자로 받은 값을 주목!

     원시 타입 변수가 아닌 만들어둔 Tool 클래스로 객체를 만들어서 인자로 선언한 점이다. 

     그리고 선언한 객체 인자에 action 메소드를 호출해준다.

   


전체 코드

package class08;

import java.util.Random;

class Tool {
   String name;
   Tool(String name){
      this.name=name;
   }
   void action() {
      System.out.println("액션");
   }
}
class Fishing extends Tool {
   Fishing(){
      super("낚시대");
   }
   @Override
   void action() {
      System.out.println("생선낚시");
   }
}
class Dragonfly extends Tool {
   Dragonfly(){
      super("잠자리채");
   }
   @Override
   void action() {
      System.out.println("곤충채집");
   }
}
class Animal {
   String type;
   String name;
   static String[] datas= {"행복해요","무난합니다","슬퍼요","화났어요"};
   static Random rand=new Random();
   Animal(String type,String name) {
      this.type=type;
      this.name=name;
   }
   void hello() {
      // [1] 0 -> 행복, 1 -> 무난, ... : if문
      // [2] 감정[] = {행복함 / 무난함 / 슬픔 / 화남} : 배열
      int randNum=Animal.rand.nextInt(Animal.datas.length);
      System.out.print(Animal.datas[randNum]+",");
   }
   void action(Tool tool) {
      tool.action(); // 동적바인딩 -> 다형성 실현
   }
   @Override
   public String toString() {
      return this.type+" 주민 "+this.name;
   }
}
class Cat extends Animal {
   Cat(String name){
      super("고양이",name);
   }
   @Override
   void hello() {
      super.hello();
      System.out.println("야옹");
   }
}
class Frog extends Animal {
   Frog(String name){
      super("개구리",name);
   }
   @Override
   void hello() {
      super.hello();
      System.out.println("개굴");
   }
}

public class Test01 {
   public static void main(String[] args) {
      
      Animal[] datas=new Animal[3];
      datas[0]=new Cat("1호");
      datas[1]=new Frog("레이니");
      datas[2]=new Frog("아이다");
      
      for(int i=0;i<datas.length;i++) {
         datas[i].hello();
      }
      /*
      for(배열의 타입  변수명:배열의 이름) {
         datas[i].hello();
      }
      */
      for(Animal animal:datas) {
         animal.hello();
      }
      
      for(Animal animal:datas) {
//         Tool tool=new Dragonfly();
//         animal.action(tool);
    	  animal.action(new Dragonfly());
      }
      
      for(Animal animal:datas) {
         System.out.println(animal);
         System.out.println(animal.toString());
      }     
   }
}