목표 : 스레드, GUI 를 이용한 알낳기 구현


기존 알낳기 v2에 SOLID 원칙을 적용한 리팩토링을 진행한다.
현재 View라는 클래스에서 닭 까지 같이 움직이고있다.
단일클래스로 분리해보자(SRP 준수를 위해)
JButton을 상속받은 치킨 클래스 파일을 생성했다.
그리고 egg와 마찬가지로, 닭도 뒤에 버튼을 투명화해준다.
완성!

package lab6;
import javax.swing.ImageIcon;
import javax.swing.JButton;
public class Chicken extends JButton{
Chicken(){
System.out.println("치킨이 생성되었어요!");
this.setBounds(27, 22, 140, 150);
this.setBorderPainted(false);
this.setContentAreaFilled(false);
this.setFocusPainted(false);
this.setIcon(new ImageIcon(View.class.getResource("/image/chicken.png")));
}
}
생성된 치킨 클래스.
2. egg에 move 동작들 Moveable 인터페이스 분리시키기.
다른 동물이 생기더라도 해당 Moveable을 해놓으면 확장에 용이하다.
그리고 각방향에 대해 인터페이스를 따로 만들어줌으로써, 닭같은경우== 오른쪽으로만움직인다.
이런식으로 하나의 행동만 가능할경우를 제한둘수도 있어서 좋다. 이에 따라 닭도 같이 리팩토링한다.




치킨에 MoveRight 인터페이스를 구현하게끔 해놓아서, view에서 닭움직이던것까지 컨트롤하던걸 옮겼다.
그런데 문제가생김.
치킨을 JButton으로 생성했더니, 얘가 인식을 못한다.
그래서 강제 다운캐스팅했다....


근데 이렇게 되면 LSP 위반같다... (ㅠㅠ)
구체클래스에 의존하면 안되는데 이걸 어찌할꼬,, 일단 분리시켰으니 분리시킨대로 해보자...
3. Egg에서 Runnable 변경 이후,LSP, SRP 준수시키자.



스레드도 단독 파일로 분리했다. 정상작동하는 모습을 확인할 수 있다.
4. DIP 의존성 역전 법칙 == 세부기능에 의존하지말자.
그럼 지금 View가 닭생성하고, 스레드 생성하고 여러가지일을 복합적으로 하고있고, 각각의 세부기능(닭, 스레드)에 의존하고있다.
이를 리팩토링해보자. GUI같은경우는 MVC패턴이므로 이를 수정한다. 컨트롤러를 생성하고, 거기에서 닭 생성시키고하면 될것같다. 근데 이걸 하려면 전체적인 프로그램 구조를 변경해야해 시간이 많이 소요될 것 같다..... 이건 아이디어만 생각해보고 나중에해보자.
view에서 controller를 주입받는다.
controller에 생성한 contentPanel을 넘겨주고, controller에서 알, 닭 등 버튼을 붙이는 역할을 수행하면 될 것같다.
소감:
SOLID 원칙을 적용하는데, 점점 파일이 많아지고, 구조가 복잡해지는것같아 걱정이 됐다. 유지보수에 용이하려면 그래도 하나의 파일에 하나의기능만 집중하는게 나은것같긴하다..... 근데 사람이 계속해서 모듈화시켜주고싶고, 적게 하고싶다보니 손이 계속 합치는 방향으로 가고있다.... 닭 move right 하는게 그 예시. 이것도 moveable 인터페이스로 가능할것같아보였는데 하다보니까 강제캐스팅(다운캐스팅)을 해야하는 순간이 생긴다. 이러면 안될 것 같다.... solid원칙을 모두 만족시키는 방안은 어떻게 해야하는걸까. 충돌이 일어날 수 있다고이야기하시긴 했지만, 어떤 솔리드 원칙을 만족해야 기존것보다 나은 방향으로 프로그램을 작성하는게 되는것일지 고민이다.(1을 충족하면 다른 1을 충족시키지 못하는 상황) ㅜㅜ 어떤 걸 준수하는게 더 좋은 방향일까?
'컴퓨터공학과 > Java 1 & 2' 카테고리의 다른 글
| java - spring db jpa crud (0) | 2025.11.30 |
|---|---|
| [Java]#12주차 . DB&JDBC 정리 및 실습복기 (0) | 2025.11.16 |
| [Java] SOLID 실습 짱구의 매너전략 (0) | 2025.10.15 |
| [Java] 커피메이커 리팩토링 - SOLID 원칙 적용 +V2,V3 | 추가패턴조사 (0) | 2025.10.11 |
| [Java] Thread (0) | 2025.09.22 |