웹개발 상식

[프로그래밍 패러다임] 객체지향 프로그래밍

lado 2021. 9. 18. 22:53

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

  • 프로그래밍 패러다임. 프로그래밍을 하는 여러가지 방식 중 객체를 컨셉으로 해서 프로그래밍을 해나가는 방식.
    • 명령형 프로그래밍: 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임
      • 절차적 프로그래밍
      • 객체 지향 프로그래밍
    • 선언형 프로그래밍
      • 함수형 프로그래밍

 

 

절차적 VS 객체 지향 ?

  • 절차적 프로그래밍과 객체 지향 프로그래밍을 비교해서 많이 이야기하지만 둘은 반대되는 개념이 아니다.
  • 절차적 프로그래밍은 프로그램의 실행 순서와 흐름을 먼저 세우고 필요한 자료구조와 함수들을 설계하는 방식이고, 객체지향 프로그래밍은 반대로 자료구조와 이를 중심으로 한 모듈들을 먼저 설계한 다음에 이들의 실행 순서와 흐름을 짜는 방식이다.
  • 결론적으로 둘 다 실행 순서와 흐름에 따라 설계하는 방식

 

장단점 비교

패러다임 장점 단점
절차적 컴퓨터 처리구조와 유사하여 실행 속도가 빠름. 실행순서가 정해져 있어 코드 순서가 바뀌면 동일한 결과를 보장 못함.
디버깅이 어려워 유지보수가 어려움.
객체 지향 프로그램 신뢰성이 높아짐.
코드 재사용이 쉬워짐.
업그레이드 쉬움.
디버깅이 쉽고, 직관적인 코드 분석 가능.
처리 속도가 절차적 프로그래밍보다 느림.
설계에 많은 시간이 듦.

 


객체란?

  • 객체지향 프로그래밍에서 객체는 클래스의 인스턴스

 

클래스란?

  • 클래스는 같은 종류의 집단에 속하는 속성과 행위를 정의한 것
  • 클래스는 필드(상태)와 메소드(동작)로 구성된다.

 

출처: https://cloudstudying.kr/lectures/200

  • 클래스는 객체를 만들기 위한 템플릿, 클래스에 실제 데이터를 넣어 실제로 메모리상에 할당한 것이 객체
  • 예를 들면, 어떤 사람이 집에서 살기를 원할 때, 그 집의 청사진(집의 설계도)이나 축소 모형 따위는 전혀 필요가 없다. 필요한 것은 설계에 맞는 실제 집이다. 이 비유에서 청사진은 클래스를, 실제 집은 객체를 나타낸다.

 

객체 지향 프로그래밍의 4가지 특징

캡슐화, 추상화, 상속, 다형성

 

 

캡슐화(Encapsulation)

출처: https://radait.tistory.com/5

관련 있는 변수와 함수들을 하나의 단위로 묶는 것.
접근 제한자를 사용해서 외부에 보일 필요가 없는 데이터를 숨겨 놓는 것

 

  1. 접근 제한자 종류(TS, java)
    • public: 클래스의 외부에서 사용 가능
    • protected: 상속 받은 자식 클래스에게만 노출됨
    • private: 클래스의 내부에서만 사용

 

추상화(Abstraction)

출처: https://radait.tistory.com/5

외부에서는 내부가 어떻게 구현되어 있는지 신경쓰지 않고 외부에 공개된 인터페이스를 이용해서 객체를 사용할 수 있게 하는 것
  • TS에서 'interface'와 연관 있는 개념이다.

 

 

상속(Inheritance)

자식 클래스가 부모 클래스의 특성과 기능을 물려 받는 것
  • TS에서 'extends'나 'implements'를 통해 상속을 구현한다.

 

 

다형성(Polymorphism)

하나의 인터페이스를 이용하여 서로 다른 구현을 제공하는 것

 

  1. (예시) 동일한 interface를 상속해 만든 class라면 동일한 메소드 명으로 조금씩 다른 기능을 하는 함수를 호출할 수 있다.
  2. 오버라이딩(Overriding): 자식 클래스에서 상속 받은 상위 클래스의 기존 메소드를 재정의하는 것. 메소드명, parameter, 리턴 타입이 모두 같아야 한다.
  3. 오버로딩(Overloading): 메소드명이 같지만 parameter가 다른 메소드.

 


객체 지향 프로그래밍 5원칙: SOLID

<Clean Code>의 저자, 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어 기억술로 소개한 것
Single Responsibility Principle: 단일 책임 원칙
Open-Closed Principle: 개방-폐쇄 원칙
Liskov Substitution Principle: 리스코프 치환 원칙
Interface Segregation Principle: 인터페이스 분리 원칙
Dependency Inversion Principle: 의존성 역전 원칙

 

 

  1. 단일 책임 원칙(SRP, Single Responsibility Principle)
    1. 객체는 오직 하나의 책임(기능)을 가져야 한다. 이는 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다는 것.
  2. 개방-폐쇄 원칙(OCP, Open-Closed Principle)
    1. 객체는 확장에는 열려 있고, 변경에는 닫혀있어야 한다. 기존 구성요소는 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다.
  3. 리스코프 치환 원칙(LSP, Liskov Substitution Principle)
    1. 컴퓨터 프로그램에서 자료형 S가 자료형 T의 하위형이라면 필요한 프로그램의 속성(정확성, 수행하는 업무 등)의 변경 없이 자료형 T의 객체를 자료형 S의 객체로 교체(치환)할 수 있어야 한다는 원칙이다.
  4. 인터페이스 분리 원칙(ISP, Interface Segregation Principle)
    1. 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다. 인터페이스 분리 원칙은 큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리시킴으로써 클라이언트들이 꼭 필요한 메서드들만 이용할 수 있게 한다.
  5. 의존성 역전 원칙(DIP, Dependency Inversion Principle)
    1. 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다. 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.

 

 


참고자료

'웹개발 상식' 카테고리의 다른 글

[Generic] 제네릭 개념  (0) 2021.08.08