일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- MySQL
- JDBC
- SQL
- strpos()
- DTO
- react
- error
- Excel
- explode()
- DOM
- dao
- 배열
- php
- oracle
- 오류
- 정규식
- 현대이지웰java풀스택개발자아카데미6월
- JavaScript
- OOP
- myshortcut
- formula
- 멀티캠퍼스it부트캠프
- node.js
- 노션
- 객체지향
- 함수
- 부트캠프후기
- ES6
- jQuery
- Java
- Today
- Total
코딩짜는 일상
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 9차 - 디자인 패턴 본문
📚 서론
디자인 패턴은 애플리케이션을 설계하는 표준화된 방법론입니다.
몰라도 기능을 구현하는 것에 문제는 없지만
알면 유지보수, 확장에 용의한 어플리케이션을 설계할 수 있고
다른 사람이 만든 어플리케이션의 구조도 쉽게 파악할 수 있습니다.
디자인 패턴에는 참 다양한 종류가 있어서 그걸 전부 이 글 하나로 다뤄볼 순 없겠지만
그중에서도 제가 연습문제를 풀면서 자주 사용했던 패턴 몇 가지만이라도 다뤄보겠습니다.
... 사실... 아직도 좀 햇갈려서 이번주 글 작성이 특히 어렵긴 했습니다.
그래도 완벽주의보단 완성주의를 지향하는 것이 저의 발전에 더 도움된다고 생각하기에 일단 작성해보겠습니다.
🎷 싱글톤 (Singleton) 패턴
이 패턴은 애플리케이션에서 특정 클래스의 객체가 단 하나만 존재해야 할 때 유용합니다.
예를 들어 게임을 개발한다고 가정했을 때,
캐릭터는 전투를 하거나 물건을 사는 등 여러가지 이벤트를 맞닥뜨릴 것이고
결과에 따라 체력, 방어, 공격력 등의 수치가 변해야 할 것입니다.
어느 이벤트를 거치던 캐릭터의 수치값 변동은 누적되어야 하겠죠.
이때 캐릭터 생성 클래스를 싱글톤으로 만들게 되면
어느 이벤트 클래스에서 새로 캐릭터 객체를 생성하더라도
변동된 수치값 그대로 캐릭터 객체값을 받게 됩니다.
저는 값을 수정할 수 있는 전역변수처럼 생각하여 사용하고 있습니다.
싱글톤의 핵심은 클래스 내부에 자신의 객체를 만들고 이것을 get 메서드를 이용해 가져가 쓸 수 있게 하는 것입니다.
객체 생성은 싱글톤 클래스 내부에서만 할 수 있고 외부에선 만들어진 객체에 접근만 할 수 있습니다.
그러므로 자신의 객체와 매개변수, 생성자는 싱글톤 클래스에서만 접근할 수 있도록 private로 만들어야 합니다.
public class Character {
private static Character instance;
private int healing_point;
private int attack;
private int defense;
private Character() {
this.healing_point = 100;
this.attack = 10;
this.defense = 10;
}
public static Character getInstance() {
if(instance == null) {
instance = new Character();
}
return instance;
}
// setter 생략 //
// getter 생략 //
}
위 싱글톤 예제 코드처럼 캐릭터 클래스를 만들면 외부 클래스에선 getInstance() 메서드로 캐릭터 객체를 불러와 사용하고
getter와 setter를 통해서만 매개변수에 접근해야 합니다.
public class Event() {
Character character = Character.getInstance();
// getter를 사용해 매개변수값을 가져오거나
System.out.println(character.getHP);
// setter를 사용해 매개변수값을 수정한다
character.setHP(-20);
}
🎺 전략(Strategy) 패턴
이 패턴은 특정 작업을 하는 방식(=전략)을 여러가지 두고 필요에 따라 선택해서 사용하는 방식입니다.
주로 결제 프로세스에서 결제수단을 다양하게 두고 선택해서 쓸 수 있게 하는 것에 비유합니다.
핵심은 필수로 구현해야할 메서드를 인터페이스에 정의하고
각 전략마다 해당 인터페이스를 상속해 메서드의 세부 내용을 재정의하는 것입니다.
최근에 과제로 제출한 간단한 텍스트 기반 게임을 구현할 땐
전투, 보물상자 발견, 음식 발견 이벤트를 전략으로 두어 Strategy 패턴을 사용했었습니다.
public interface IEvent { // 인터페이스
void eventStart();
}
public class Battle implements IEvent { // 전투 이벤트
public Battle() {
// 생성자
}
@Override
public void eventStart() {
// 구체적인 전투 이벤트 내용 구현
}
}
public class Harvest implements IEvent { // 수확 이벤트
public Harvest() {
// 생성자
}
@Override
public void eventStart() {
// 구체적인 수확 이벤트 내용 구현
}
}
이후 프로세스에서 전략을 사용할 땐 상속한 인터페이스 타입의 객체를 null로 우선 생성하고
선택에 따라 전략 클래스를 new연산자로 생성해 인터페이스 객체에 넣어주면 됩니다.
실행 메서드는 인터페이스에서 정의했으니 전략 클래스 종류에 상관 없이
해당 실행 메서드를 실행하기만 하면 됩니다.
public class AdventureRun {
public static void main(String[] args) {
IEvent event = null; // 빈 객체 생성
switch(eventNum) { // 이벤트 부여
case 1:
event = new Battle();
break;
case 2:
event = new Harvest();
break;
default:
break;
}
if(event != null) event.eventStart(); // 이벤트 실행
}
}
Stratege 패턴을 사용하게 되면 이후 새로운 이벤트를 추가할 때
main클래스에 이벤트 분기점(여기 예제에선 switch)을 추가하고
새로 인터페이스를 상속한 새로운 이벤트 클래스를 추가해주면 됩니다.
다른곳은 건드릴 필요 없어지니까 확장이 간편해집니다.
🔥 결론
이처럼 디자인 패턴을 알게 되면 애플리케이션 구현이 조금 더 쉬워집니다.
물론 처음 익히는 것이 쉽지 않고 익히더라도 활용을 할 수 있어야 하니까 쉬운 일은 아니죠...,
그리고 최근엔 멀티 디자인 패턴으로 설계하는 추세라 각 프로세스마다 적합한 패턴을 선택해 개발된다고 합니다.
우선은 다른 사람의 코드를 이해할 수 있도록 디자인 패턴을 빠르게 훑고
다양한 오픈소스를 읽어 패턴 활용 방법을 눈에 익히는 게 좋겠다는 생각을 했습니다.
'TIL' 카테고리의 다른 글
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 8차 - 알고리즘 입문 (0) | 2025.09.02 |
---|---|
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 7주차 - JDBC를 이용한 JAVA의 데이터베이스 접근과 DTO, DAO를 도입하기 위한 구조도 (4) | 2025.08.26 |
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 30 & 31 & 32 & 33일차 - Oracle, Java (2) | 2025.08.26 |
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 6주차 - JAVA 객체지향으로 코드 리팩토링 해보기 (0) | 2025.08.19 |
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 5주차 - JAVA 객체지향 프로그래밍 (6) | 2025.08.12 |