💡 객체 지향 프로그래밍(OOP, Object Oriented Programming)이란?
인간 중심적 프로그래밍 패러다임
즉, 현실 세계를 프로그래밍으로 옮겨와 프로그래밍 하는 것을 이야기한다.
주요 개념
추상화
현실 세계의 사물들을 객체라고 보고
그 객체로부터 개발하고자 하는 애플리케이션에 필요한 특징들을 뽑아와 프로그래밍 하는 것이다.
캡슐화
객체가 내부적으로 기능을 어떻게 구현하는지를 감추는 것이다.
내부 기능 구현이 변경되더라도, 그 기능을 사용하는 코드는 영향을 받지 않도록 해준다.
장점
- 작성한 코드에 대한 재사용성이 높다
- 버그 발생을 줄일 수 있다.
라이브러리를 각종 예외 상황에 맞게 잘 만들어두면 개발자가 사소한 실수를 하더라도
그 에러를 컴파일 단계에서 잡아낼 수 있으므로 버그 발생이 줄어든다.
- 생산성이 높아진다.
내부적으로 어떻게 동작하는지 몰라도 개발자는 라이브러리가 제공하는 기능들을 사용할 수 있기 때문이다.
- 디버깅이 쉽고, 유지보수에 용이하다.
객체 단위로 코드가 나눠져 작성되기 때문이다.
- 요구사항을 보다 명확하게 파악하여 프로그래밍 할 수 있다.
데이터 모델링을 할 때, 객체와 매핑하는 것이 수월하기 때문이다.
설계 원칙
1. SRP(Single Responsibility Principle; 단일 책임 원칙)
클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 한다.
2. OCP(Open-Closed Principle; 개방-폐쇄 원칙)
확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.
3. LSP(Liskov Substitution Principle; 리스코프 치환 원칙)
상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
4. ISP(Interface Segregation Principle; 인터페이스 분리 원칙)
인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
5. DIP(Dependency Inversion Principle; 의존 역전 원칙)
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.
🖋 객체 지향 설계 문제
객체들을 구현하는 클래스와 메서드를 대략적으로 그려보는 문제로 출제된다.
접근법
1. 모호성의 해소
누가 그것을 사용할 것이며 어떻게 사용할 것인지에 대한 질문을 던져야 한다.
질문에 따라서는 육하원칙에 따른 질문을 던져야 할 때도 있다.
누가,무엇을, 어디서, 언제, 어떻게, 왜.
2. 핵심 객체의 설계
무엇을 설계할 것인지 이해했으니, 시스템에 넣을 ‘핵심 객체’(core object)가 무엇인지 생각해 봐야 한다.
3. 관계 분석
이제 객체 사이의 관계를 분석해야 한다.
- 어떤 객체가 어떤 객체에 속해 있는가(member)?
- 다른 객체로부터 상속(inherit) 받아야 하는 객체는 있나?
- 관계는 다-대-다(many-to-many) 관계인가 아니면 일-대-다(one-to-many) 관계인가?
4. 행동 분석
객체가 수행해야 하는 핵심 행동(core action)들에 대해서 생각하고,
이들이 어떻게 상호작용해야 하는지 따져 보는 것이다.
그러다 보면 깜박 잊은 객체가 있을 수도 있고, 상황에 따라 설계를 변경해야 할 수도 있다.
디자인 패턴
설계 문제에서는 보통 디자인 패턴은 범위 외로 치지만, 디자인 패턴을 알아두면 면접 볼 때 특히 유용하다!
특히 유용한 두가지 디자인 패턴을 소개한다.
Singleton Class(싱글톤 클래스)
어떤 클래스가 오직 하나의 객체만을 갖도록 하며, 프로그램 전반에 걸쳐 그 객체 하나만 사용되도록 보장해야 한다.
정확히 하나만 생성되어야 하는 전역 객체(global object)를 구현해야 하는 경우에 특히 유용하다.
public class Restaurant { private static Restaurant _instance = null; protected Restaurant() { ... } public static Restaurant getlnstance() { if (_instance == null) { _instance = new Restaurant(); } return _instance; } }
많은 사람들이 싱글톤 디자인 패턴을 좋아하지 않고 심지어 ‘안티-패턴’이라고 부르기도 한다.
싱글톤을 싫어하는 이유 중 하나는 싱글톤이 단위 테스트(unit test)에 방해되는 요인이기 때문이다.Factory Method(팩터리 메서드)
어떤 클래스의 객체를 생성하기 위한 인터페이스를 제공하되,
하위 클래스에서 어떤 클래스를 생성할지 결정할 수 있도록 도와준다.구현 방법 1.
Factory 메서드 자체에 대한 구현은 제공하지 않고 객체 생성 클래스를 abstract로 선언하고 놔두는 것이다.구현 방법 2.
Factory 메서드를 실제로 구현한 Creator 클래스를 만드는 것이다.
이 경우에는 Factory 메서드에 생성해야 할 클래스를 인자로 넘겨줘야 한다.public class CardGame { public static CardGame createCardGame(GameType type) { if (type == GameType.Poker) { return new PokerGame(); } else if (type == GameType.Blackjack) { return new BlackJackGame(); } return null; } }
⍞ 참고 자료
- 도서 : 코딩인터뷰 완전 분석, 게일 라크만 맥도웰 저 / 이창현 역, 인사이트
'정리 log > 용어 · 개념' 카테고리의 다른 글
[OS] 메모리 관리 전략 (0) | 2020.05.28 |
---|---|
[네트워크] 프로토콜 (0) | 2020.05.25 |
[네트워크] OSI 참조 모델, TCP/IP 모델 (0) | 2020.05.18 |
[네트워크] 인터넷, IP 주소, 서브네팅 (0) | 2020.05.17 |
[OS] 프로세스(Process) vs. 스레드(Thread) (0) | 2020.05.10 |
댓글