[개발 상식] 객체 지향 프로그래밍(OOP)

2018. 8. 21. 20:55CS/개발 상식

반응형
[개발 상식] 객체 지향 프로그래밍(OOP)

해당 시리즈는 Interview_Question_for_Beginner를 기반으로 추가 학습을 진행해 작성하였습니다.

객체 지향 프로그래밍(OOP)이란?

실제 세계를 모델링하여 ‘객체’들의 상호작용으로 서술하는 프로그래밍 기법

  • 인간 중심적 프로그래밍 패러다임
  • 프로그램을 ‘객체’ 단위로 나누어 이들이 연결되도록 함.
  • 객체는 오퍼레이션으로 정의된다.
    • 객체의 핵심은 기능 제공이다.
    • 오퍼레이션 : 객체의 기능
절차지향이란?
순차적인 처리에 따라 프로그램 전체가 유기적으로 연결되도록 만든 프로그래밍 기법

4가지 특징

  1. 추상화(Abstraction)
    : 공통의 속성이나 기능을 묶어 이름을 붙이는 것
    • 현실 세계의 사물 = 객체로 보고 필요한 공통 특징만 다루어 현실의 복잡성을 극복, 목적에 집중할 수 있게 함
    • ex) {떡볶이, 라면, 김밥} => ‘음식’으로 추상화
  2. 캡슐화(Encapsulation)
    : 객체 수행 목적에 따라 데이터 구조 및 처리 방법(변수와 함수)을 결합시켜 묶는 것
    이로써, 외부에 내부 기능 구현 내용을 감추고 이용 방법만 알려줌
    • 객체 기능에 대한 책임을 짐
      내부 기능 구현이 변경되어도 기능을 사용하는 코드에 영향을 주지 않게 함
    • 은닉화
      • 외부로부터 객체 내부에 대한 접근을 제한하기 위해 은닉 혹은 격리 시키는 것
      • 캡슐화의 한 개념으로 더 구체적이다.
      • 변수 접근지정자를 private로 지정하고 setter, getter로 접근, 제어한다.
캡슐화와 은닉화의 차이
은닉화
내부 중요사항이 외부에 노출되지 않도록 막음
캡슐화
은닉화 된 상태에서 외부에서 기능을 사용할 수 있게 제공하고 책임짐
  1. 상속(Inheritance) OOP의 꽃
    : 상위 개념의 특징을 하위 개념이 물려받아 사용하는 것
    • 재 사용으로 코드의 수가 줄어듦
    • 상속으로 인한 단점을 막기 위한 방법
      • 상속을 재 사용 관점이 아닌 기능의 확장 개념으로 사용
      • 객체 조립으로 is - a 관계가 성립될 수 있게 함
  2. 다형성(Polymorphism)
    : 하나의 메소드나 클래스가 다양한 방법으로 동작하는 것
    • 오버라이딩(Overriding)
      : 상속받은 자식클래스에서 부모클래스의 (추상) 메소드의 내부 로직을 재작성
      • 외부 구현 내용(메소드 명, 반환 타입, 매개변수)은 그대로 유지
    • 오버로딩(Overloading)
      : 하나의 클래스에서 같은 이름을 가진 오퍼레이션을 여러개 정의할 수 있다.
      • 매개 변수는 무조건 달라야 한다.
      • 반환 타입은 매개변수가 다르다면 아무 상관없다.
        (매개변수가 같고 반환타입이 다른 경우는 성립X)
    • 클래스 및 인터페이스와 다형성

장점

객체 단위로 나눠져 작성되기 때문에 다음과 같은 장점이 존재한다.

  • 디버깅이 쉽고 유지보수가 용이
  • 요구사항을 명확하게 파악하여 프로그래밍 가능
    데이터 모델링 시 객체와 매핑하는 것이 더 수월하기 때문

자주 사용하는 로직을 모듈화(라이브러리화)하여 사용 가능하여 다음과 같은 장점을 가진다.

  • 높은 재사용성
    완성된 라이브러리 사용 가능
  • 신뢰성 확보
    자주 사용되어 왔으므로 어느정도 보장된다.
    예외처리를 잘 해두었을 경우 에러를 컴파일 단계에서 잡을 수 있어 버그 발생이 줄어듦
  • 높은 생산성
    라이브러리 내부 동작과정을 몰라도 제공되는 기능들을 사용할 수 있으므로

단점

  • 많은 오버헤드(overhead) 발생
    객체간의 정보 교환이 모두 메시지 교환을 통해 일어나기 때문
    • 메시지를 보낸다 : 오퍼레이션의 실행을 요청하는 것
    • 오버헤드(overhead) : 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간∙메모리 등
  • 상태를 가지는 객체로 인한 버그 발생 가능성
    내부 변수로 인해 객체가 예측할 수 없는 상태를 갖게 되기 때문
    • 함수형 프로그래밍 패러다임이 발생하므로서 발생된 치명적인 단점

SOLID : 5대 원칙 디자인패턴

  1. SRP(Single Responsibility Principle) : 단일 책임 원칙
    클래스는 단 하나의 책임을 가져야 하며, 클래스를 변경하는 이유는 단 하나여야 함.
    • 변화에 대한 유연성 확보
    • 낮은 결합도, 높은 응집도 추구
  2. OCP(Open-Closwed Principle) : 개방-폐쇄 원칙
    모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.
  3. LSP(Likov Substitution Principle) : 리스코프 치환 원칙
    상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 함
    • 기반 클래스는 파생 클래스로 대체 가능해야 함
    • 인터페이스를 알면 구현체를 몰라도 사용 가능해야 함
    • 참고 : 코드 예시
  4. ISP(Intefrace Segregation Principle) : 인터페이스 분리 원칙
    인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
  5. DIP(Dependency Inversion Principle) : 의존 역전 원칙
    고수준 모듈은 저수준 모듈 구현에 의존해서는 안된다.
    • 고수준(단일 기능 제공 목적) / 저수준(고수준을 위한 하위 기능 실 구현)
    • 클라이언트는 구체 클래스가 아닌 인터페이스나 추상 클래스에 의존해야 함
    • 인터페이스 / 추상 클래스 간에만 서로 의존관계를 가지며 참조
    • 참고 : 코드 예시

Reference

아래를 제외한 Reference들은 관련 내용 부분에 바로 연결시켜두었습니다.
Reference에 자세한 내용이 설명되어 있으니 참고바랍니다.


반응형