본문 바로가기
  • 꾸준히 앞으로
정리 log/용어 · 개념

[면접준비] 객체 지향 프로그래밍

by lijly 2020. 5. 7.

 

 

💡 객체 지향 프로그래밍(OOP, Object Oriented Programming)이란?

인간 중심적 프로그래밍 패러다임
즉, 현실 세계를 프로그래밍으로 옮겨와 프로그래밍 하는 것을 이야기한다.

주요 개념

추상화

현실 세계의 사물들을 객체라고 보고
그 객체로부터 개발하고자 하는 애플리케이션에 필요한 특징들을 뽑아와 프로그래밍 하는 것이다.

캡슐화

객체가 내부적으로 기능을 어떻게 구현하는지를 감추는 것이다.
내부 기능 구현이 변경되더라도, 그 기능을 사용하는 코드는 영향을 받지 않도록 해준다.

 

장점

  1. 작성한 코드에 대한 재사용성이 높다
  1. 버그 발생을 줄일 수 있다.

    라이브러리를 각종 예외 상황에 맞게 잘 만들어두면 개발자가 사소한 실수를 하더라도
    그 에러를 컴파일 단계에서 잡아낼 수 있으므로 버그 발생이 줄어든다.

  1. 생산성이 높아진다.

    내부적으로 어떻게 동작하는지 몰라도 개발자는 라이브러리가 제공하는 기능들을 사용할 수 있기 때문이다.

  1. 디버깅이 쉽고, 유지보수에 용이하다.

    객체 단위로 코드가 나눠져 작성되기 때문이다.

  1. 요구사항을 보다 명확하게 파악하여 프로그래밍 할 수 있다.

    데이터 모델링을 할 때, 객체와 매핑하는 것이 수월하기 때문이다.

 

설계 원칙

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)가 무엇인지 생각해 봐야 한다.

🤫
식당을 객체 지향적으로 설계한다면 핵심 객체는?
→ Table, Guest, Party, Order, Meal, Employee, Server, Host 등

3. 관계 분석

이제 객체 사이의 관계를 분석해야 한다.

  • 어떤 객체가 어떤 객체에 속해 있는가(member)?
  • 다른 객체로부터 상속(inherit) 받아야 하는 객체는 있나?
  • 관계는 다-대-다(many-to-many) 관계인가 아니면 일-대-다(one-to-many) 관계인가?
🤫
식당 문제에서 관계 분석을 한다면?
• Party는 Guests 배열을 갖고 있어야 한다.
• Server와 Host는 Employee를 상속받는다.
• 각 Table은 Party를 하나만 가질 수 있지만, 각 Party는 Tables을 여러 개 가질 수 있다.
• Restaurant에 Host는 한 명뿐이다.

4. 행동 분석

객체가 수행해야 하는 핵심 행동(core action)들에 대해서 생각하고,
이들이 어떻게 상호작용해야 하는지 따져 보는 것이다.

그러다 보면 깜박 잊은 객체가 있을 수도 있고, 상황에 따라 설계를 변경해야 할 수도 있다.

🤫
식당 문제에서 Party가 Restaurant에 입장하고 한 Guest가 Host에게 Table을 부탁한 경우,
→ Host는 Reservation을 살펴본 다음 자리가 있으면 해당 Party에게 Table을 배정할 것이다.
→ 자리가 없다면 Party는 Reservation 리스트 맨 마지막에 추가될 것이다.
→ 한 Party가 식사를 마치고 떠나면 한 Table이 비게 되고, 그 테이블은 리스트의 맨 위 Party에게 할당될 것이다.
  • 디자인 패턴

    설계 문제에서는 보통 디자인 패턴은 범위 외로 치지만, 디자인 패턴을 알아두면 면접 볼 때 특히 유용하다!

    특히 유용한 두가지 디자인 패턴을 소개한다.

    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;
        }
    }

 

 


⍞ 참고 자료

  • 도서 : 코딩인터뷰 완전 분석, 게일 라크만 맥도웰 저 / 이창현 역, 인사이트

 

댓글