OOP (객체지향 프로그래밍)
특성
- 캡슐화
- 상속
- 추상화
- 다형성
설계원칙 (SOLID)
- Single Responsibility Principle (SRP) : 클래스는 하나의 역할만 해야한다
- Open Close Principle (OCP)
- The Liskov Substitution Principle (LSP)
- Interface Segration Principle (ISP)
- Dependency Inversion Principle (DIP)
디자인 패턴
각 패턴이 무엇이며, 어떤 경우에 사용하는지 예시 정도 알아두기
생성 패턴
1) Singleton
- 객체가 하나만 만들어져야 하는 경우 사용
- e.g) 전체 페이지에 똑같이 적용되는 다크모드
- 클래스 안의 static이 아닌 변수나 메소드들은 객체가 생성될 때마다 메모리 공간을 새로 차지하지만
- static으로 선언된 것들은 객체가 얼마나 만들어지든 메모리의 지정된 공간에 딱 하나씩만 존재함
=> FirstPage에서 변경한 settings가 SecondPage에서 그대로 출력됨
(위 코드는 멀티쓰레드 환경 등에서 오류 발생할 수 있음, 싱글톤을 안전하게 사용할 수 있는 방법들을 언어마다 검색해보기)
- 정적 변수를 쓰지 않고 싱글턴을 쓰는 이유?
- interface의 사용이나 lazy loading 등 싱글턴으로 할 수 있는 것들이 더 많기 때문
2) Factory Method
3) Abstract Factory
4) Builder
5) Prototypef
구조 패턴
1) Adapter
- 서로다른 형식을 호환해주는 도구
- In OOP, 인터페이스가 서로 다른 객체들이 같은 형식 아래 작동할 수 있도록 해주는 도구
2) Proxy
- 인터넷에서 받아와야 해서 시간이 걸리거나 메모리를 많이 차지하거나 하는 등의 이유로 여러 객체로 생성하기가 부담 되는 클래스가 있을 때, 그 클래스의 'Proxy', 대리자 역할을 하는 클래스를 따로 두어서
- 가벼운 일은 비서가 처리하고 무거운 작업을 할 때만 실제 클래스를 생산해서 사용하는 방법
- e.g) 유튜브 썸네일에 마우스 가져가면 프리뷰 재생되는 기능
3) Bridge
행위 패턴
1) Strategy
- 프로그램 실행 중 모드가 바뀔 때마다 검색이 이뤄지는 방식, 즉 전략이 수정됨
- 옵션들마다의 행동들을 모듈화해서 독립적이고 상호 교체 가능하게 만드는 것
전략 패턴 적용 전 코드 : 버튼들이 onClick 될 때마다 조건문으로 현재 mode 변수의 값에 따라 각 동작을 수행
=> SW가 커지고 복잡해질수록 코드 분석 및 관리가 어렵고, 클래스마다 역할지정을 뚜렷이 해서 모듈화된 SW를 구축하는 객체지향의 철학에도 어긋남
전략 패턴은 모드마다의 동작 하나하나를 모듈로 따로 분리해서, 버튼을 누를때마다 실행될 모듈을 갈아끼워주는 방식
- 인터페이스는 그 자체로 객체를 만들 순 없지만 특정 인터페이스를 implement 한 클래스는 해당 인터페이스에서 지정한 메소드를 필수로 선언해야함
2) State
- 특정 상태마다 다르게 할 일, 나아가서 그 상태들 자체를 그 상태마다 실행시 할 일과 함께 모듈화해서 쓰임
- e.g) 앱 화면의 다크 모드 여부를 켰다 껐다 하는 스위치
3) Command
4) Observer
학습 자료
- [유튜브] 객체지향 디자인패턴 1