코딩테스트를 푸는 도중에 다른 사람의 코드가 절반만큼의 시간으로 문제를 푼것을 확인했습니다. 배움을 얻기 위해 코드를 봤지만, 오히려 이해가 되지 않았습니다. 거의 모든 코드가 유사했고, 저는 Array로 그 사람은 List로 자료를 저장 및 접근했다는 차이였습니다. 하지만 List에 저장하는건 O(1) 시간이 걸리지만 접근하는 것은 O(n)의 시간이 필요하기 때문에 왜 내가 더 느린지 이해를 하지 못했습니다. 설마하는 마음에 출력과 관련된 부분을 찾아봤는데 여기서 차이가 생겼습니다.매번 출력 vs 한번에 출력각 출력 호출이 버퍼링 없이 바로 표준 출력 스트림으로 내보내지며, 출력을 할 때마다 I/O 비용이 발생합니다.반면, StringBuilder를 사용하면 메모리 내에서 문자열을 조합하고, 출력 자체..
컴포짓 패턴 (Composite Pattern) 이란?컴포짓(Composite) 패턴은 부분-전체 관계를 동일한 인터페이스로 다룰 수 있도록 구성하는 구조 패턴입니다.단일 객체(Leaf)와 복합 객체(Composite)를 같은 방식으로 처리할 수 있게 해주는 패턴컴포짓 패턴의 핵심은 "트리 구조"를 통해 객체를 구성하고, 클라이언트 코드에서는 그 구조의 세부 사항을 몰라도 되는 구조이다.언제 사용하나?다음과 같은 상황에서 사용됩니다.구조가 트리 형태일 때 (ex. 폴더-파일 구조, 조직도, UI 컴포넌트 등)클라이언트에서 단일 객체와 복합 객체를 구분하지 않고 동일하게 사용하고 싶을 때구성요소가 재귀적으로 포함될 수 있을 때"컴포넌트"라는 공통 인터페이스를 정의하고, 그 하위 구현체가 직접 동작하든 여러..
책임 체인 패턴(Chain of Responsibility Pattern)은 요청을 처리할 수 있는 여러 객체가 존재할 때, 그 객체들을 체인 형태로 연결하고 요청을 순차적으로 전달하면서 처리하는 방식을 제공하는 객체지향 디자인 패턴입니다.왜 사용하는가?요청을 보내는 객체와 처리하는 객체를 분리하기 위해 사용합니다.요청을 처리할 수 있는 객체가 여러 개일 때, 그 처리 순서를 유연하게 구성할 수 있습니다.요청 처리 객체가 동적으로 변경되거나 확장될 때 사용합니다.UML 클래스 다이어그램Client → Handler → ConcreteHandler1 → ConcreteHandler2 → ConcreteHandler3Handler (추상 클래스 또는 인터페이스): 요청을 처리할 수 있는 인터페이스를 정의하고..
프로토타입 패턴이란?기존 객체를 복제(clone) 해서 새로운 객체를 생성하는 생성(Creational) 패턴입니다. 이때 객체 생성 비용이 높은 경우나, 생성 과정이 복잡한 경우에 사용하면 좋습니다. Java에서는 Cloneable 인터페이스와 clone() 메서드를 활용해 구현합니다. 산업에서 프로토타입이라고 하면 일반적으로 테스트를 위한 '시험제작품'정도라고 생각됩니다. 그러나 디자인패턴에서 말하는 프로토타입은 세포분열에 가깝습니다.왜 사용하는가?DB에서 읽어와야 하거나, 복잡한 초기화가 필요한 경우와 같이 객체 생성 비용이 클 때 사용합니다.단순히 new로 생성하는 것보다, 복제해서 빠르게 만드는 게 더 효율적일 때처럼 동일한 객체를 여러 개 생성할 때 사용합니다.런타임에 객체의 타입이 결정되거나..
메멘토 패턴이란?Memento의 뜻은 사전적으로 기억이 되는 물건, 유품, 기념물입니다. 하지만 검색하면서 찾아본 이 단어가 더 좋았습니다. '기억의 증표' 메멘토 패턴(Memento Pattern)은 객체의 내부 상태를 캡슐화하여 저장하고, 나중에 해당 상태로 되돌릴 수 있게 해주는 행동(Behavioral) 디자인 패턴입니다.왜 사용하는가?메멘토 패턴은 다음과 같은 상황에서 사용합니다.사용자가 "되돌리기(Undo)" 기능을 원할 때객체의 상태가 중요한데, 직접 상태를 수정하거나 접근하는 걸 제한하고 싶을 때스냅샷(backup)을 저장해두고 복원할 필요가 있을 때예를 들면, 문서 편집기에서 Ctrl + Z(되돌리기)를 구현할 때 사용합니다.구조 (UML)+----------------+ +-..
커맨드 패턴(Command Pattern)은 행위(Behavioral) 패턴 중 하나로, 요청을 객체의 형태로 캡슐화하여 서로 다른 요청, 큐잉, 로그, 취소 등의 처리를 가능하게 하는 패턴입니다.왜 사용하는가? (사용 목적)요청을 캡슐화하여, 요청자(Invoker)와 수행자(Receiver)를 분리합니다.요청의 로그화, Undo(되돌리기), Redo, 명령 큐, 일괄 처리 등을 가능하게 합니다.런타임 시점에 요청을 동적으로 바꾸고 관리할 수 있습니다.커맨드 패턴 구조역할설명Command (인터페이스)실행할 명령을 정의하는 인터페이스 (execute() 메서드 포함)ConcreteCommand실제 명령을 수행하는 클래스 (Receiver를 포함하며 execute()에서 Receiver의 메서드를 호출)R..
데코레이터 패턴은 기존 객체의 코드를 변경하지 않고도 동적으로 새로운 기능을 추가할 수 있게 해주는 구조적 디자인 패턴입니다. 객체를 감싸는 방식으로 책임(기능)을 덧붙이며, 상속이 아닌 합성(Composition)을 통해 확장을 이룹니다.데코레이터 패턴은 클래스를 수정하거나 새로 만들지 않고, 객체에 기능을 "런타임"에 유연하게 추가할 수 있는 방법입니다.왜 데코레이터 패턴을 사용할까?기존 문제점데코레이터가 해결한 방식기능 추가를 위해 클래스를 상속해야 했음런타임에 기능 조합이 가능함기능 조합이 많아질수록 클래스 수가 매우 많아짐기능을 감싸서 조합하면 클래스 수 증가 없음기능 하나만 바꾸고 싶은데 전체 클래스 수정이 필요함기존 클래스 수정 없이 확장 가능함ex) Coffee 클래스가 있고, 여기에 "우..
객체를 생성할 때, 특히 많은 필드를 가진 클래스에서는 생성자에 너무 많은 파라미터가 필요해지는 문제가 생깁니다. 이런 경우 가독성이 떨어지고, 실수를 유발하기 쉬운 코드가 되며, 유지보수도 점점 어려워집니다. 이 문제를 해결하기 위한 대표적인 디자인 패턴이 바로 Builder 패턴입니다. 요즘 많이 볼 수 있는 서브웨이(Subway)와 비슷하다고 생각합니다. 메뉴선택(builder) -> 재료선택 (필드 값 입력) -> 결재(Build)를 절차대로 진행하면서 다양한 조합으로 '샌드위치(객체)'를 만들 수 있는 점이 똑같지 않나요?빌더 패턴은 왜 등장했을까?너무 많은 생성자 파라미터아래의 User 클래스를 만들었습니다.public class User { private String name; p..
- Total
- Today
- Yesterday
- 부스트코스
- JPA
- Java
- SpringBoot
- SpringFramework
- 개발자공부
- datascience
- oodp
- OOP
- 디자인패턴
- JavaScript
- 정렬
- Test
- Transaction
- URLSearchParams
- string
- hashCode
- equals
- MySQL
- docker
- 보안
- rdbs
- JSON
- ?param=value
- react
- 개발자
- Python
- springsecurity
- 배포
- GIT
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |