디자인 패턴
어댑터 패턴(Adapter Pattern):
서로 호환되지 않는 인터페이스를 맞춰주는 패턴.
스프링 예시: HandlerAdapter는 다양한 컨트롤러를 처리하기 위해 사용됨.
다양한 컨트롤러를 처리할 수 있도록 호환성을 높여, 유연한 구조를 제공.싱글톤 패턴(Singleton Pattern):
하나의 인스턴스만 생성하여 사용하는 패턴.
스프링 예시: 스프링 빈은 기본적으로 싱글톤으로 관리됨.
메모리 효율성을 높이고, 전역적으로 동일한 객체를 재사용하여 리소스를 절약.템플릿 메소드 패턴(Template Method Pattern):
알고리즘의 구조를 정의하고, 세부 구현을 하위 클래스에서 처리하는 패턴.
스프링 예시: JdbcTemplate 클래스는 데이터베이스 작업의 기본 흐름을 정의.
중복된 코드 없이 공통 로직을 재사용하고, 필요한 부분만 오버라이드 가능.팩토리 메소드 패턴(Factory Method Pattern):
객체 생성을 서브클래스에서 정의하는 패턴.
스프링 예시: BeanFactory는 빈 객체 생성을 관리.
객체 생성 로직을 캡슐화해 유연성을 증가시킴.옵저버 패턴(Observer Pattern):
객체 상태 변화를 구독자들에게 알리는 패턴.
스프링 예시: ApplicationListener로 이벤트 리스너를 구현.
이벤트 기반 시스템에서 확장성과 유지보수를 용이하게 함.스트레티지 패턴(Strategy Pattern):
실행 중에 알고리즘을 선택할 수 있게 하는 패턴.
스프링 예시: PlatformTransactionManager는 트랜잭션 전략을 변경 가능.
상황에 맞는 트랜잭션 전략을 선택하여 유연한 처리가 가능.컴포지트 패턴(Composite Pattern):
객체를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴.
스프링 예시: ViewResolverComposite는 여러 ViewResolver들을 조합하여 사용.
복잡한 뷰 처리 구조를 간결하게 유지하고 관리 가능.SOLID : 객체지향 5원칙
SRP (단일 책임 원칙):
클래스는 하나의 책임만 가진다, 도메인간 영향을 주면 안된다.
OCP (개방-폐쇄 원칙):
소프트웨어는 확장에는 열려있고, 주변의 변화에는 닫혀 있어야 한다, 기능 추가시 다른 코드들을 건드리지 않아도 된다.
LSP (리스코프 치환 원칙):
서브클래스는 부모 클래스를 대체할 수 있어야 한다, 코드의 재사용성을 위한 다형성을 지키기 위함
ISP (인터페이스 분리 원칙):
인터페이스를 사용에 맞게 끔 각기 분리해야 한다, 인터페이스에 불필요한 기능이 존재할 시 클라이언트가 불필요한 메소드를 구현해야 한다.
DIP (의존성 역전 원칙):
고수준 모듈은 자기보다 변하기 쉬운 저수준 모듈에 의존하면 안 된다, 모듈간 결합도를 줄여 변경에 영향을 최대한 덜받는다.
sorting 알고리즘
n: 입력 크기, k: 숫자의 최대값, d: 자릿수
거품 정렬:
인접한 두 요소를 비교하여 자리를 바꿔가며 정렬하는 방식, 반복할수록 큰 값이 뒤로 이동.
시간 복잡도: O(n²)
공간 복잡도: O(1)
선택 정렬:
배열에서 가장 작은 값을 찾아 맨 앞의 요소와 교환하는 방식.
시간 복잡도: O(n²)
공간 복잡도: O(1)
삽입 정렬:
정렬된 부분에 새로운 요소를 삽입하여 정렬하는 방식.
시간 복잡도: O(n²) (최선: O(n))
공간 복잡도: O(1)
퀵 정렬:
피벗을 기준으로 왼쪽은 작은 값, 오른쪽은 큰 값으로 분할 정렬.
시간 복잡도: O(n log n) (최악: O(n²))
공간 복잡도: O(log n)
병합 정렬:
배열을 반으로 나누어 각각 정렬한 후 합치는 방식.
시간 복잡도: O(n log n)
공간 복잡도: O(n)
힙 정렬:
힙 자료구조를 이용해 최대값이나 최소값을 정렬.
시간 복잡도: O(n log n)
공간 복잡도: O(1)
기수 정렬:
자릿수를 기준으로 순차적으로 정렬.
시간 복잡도: O(d * (n + k))
공간 복잡도: O(n + k)
계수 정렬:
배열 요소의 빈도를 계산해 정렬, 숫자 범위가 작을 때 효과적.
시간 복잡도: O(n + k)
공간 복잡도: O(n + k)
Reference