Adorable Cake Smiley
본문 바로가기

C++

OOP / 객체지향 프로그래밍

 

 

객체지향 프로그래밍(OOP)란 무엇인가

→ 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법

 

 

장점

  1. 코드 재사용이 용이하다
  2. 남이 만든 클래스를 가져와서 이용할 수 있고, 상속을 통해 확장해서 사용할 수 있다
  3. 유지보수가 쉽다
  4. 대형 프로젝트에 적합하다
  5. 클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트 개발에 업무 분담하기가 쉽다

→ 1, 2, 3의 이유

객체지향 접근 방식이 잘 변화하지 않는 데이터를 기준으로 데이터를 정의했기 때문에 객체를 단위로 재사용이 이루어질 수 있기 때문이고, 다른 하나는 클래스 상속을 통해 기존 클래스를 재사용하여 확장하면서도 이전 프로그램을 수정할 필요가 없기 때문이다

 

 

단점

  1. 처리 속도가 상대적으로 느리다
  2. 객체가 많으면 용량이 커질 수 있다
  3. 설계시 많은 시간과 노력이 필요하다
  4. 실행속도가 느리다

 

 

클래스와 인스턴스(객체)

클래스

→ 특정 목적을 가지는 데이터를 만들기 위해 추상화를 거쳐 변수와 함수들을 하나로 정의한 것

→ 객체를 만들기 위한 정보

인스턴스 (객체)

→ 클래스에서 정의한 것을 토대로 실제 메모리에 할당된 것으로 실제 프로그램에서 사용되는 데이터

 

 

OOP의 4가지 특징 (추상화 캡슐화 다형성 상속)

 

추상화

→ 객체의 공통적인 속성과 기능을 추출하여 정의하는 개념

프로그래밍에서는 클래스들의 공통된 특징을 파악하고 추출하여 하나의 추상화 클래스로 만드는 것으로 볼 수 있다 (차들이 가지고 있는 엔진, 바퀴 등 공통 속성 기능들을 묶어 Car라는 클래스를 만들 수 있다 )

공통된 것을 묶어 구현하므로 코드의 중복을 줄이고, 생산성을 증가시킨다.

 

캡슐화

→ 특정한 목적을 위해 필요한 변수나 메소드를 클래스 하나로 묶고 세부 구현 내용은 클래스 안으로 숨기는 것

외부에서 객체 내부 속성에 직접 접근하거나 조작할 수 없도록 한다

중요한 정보를 누가 함부로 변경해서는 안되기 때문에 접근 지시자를 private로 해서 데이터를 보호할 수 있다

 

상속성

→ 이미 만들어놓은 객체의 특징을 새로운 객체가 이어받아 사용할 수 있도록 하는 것

기존 클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어상속을 통해 기존 클래스에 기능을 추가하거나, 재정의하여 새로운 클래스를 만들 수 있다 → 코드의 중복을 피하고, 코드의 재사용성을 높일 수 있다

 

다형성

→ 어떤 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질

상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다

코드의 재사용, 코드 길이 감소가 되어 유지보수가 용이하다

다형성을 구현하는 방법 : 오버로딩, 오버라이딩, 함수형 인터페이스

 

OOP 객체 지향 설계의 5원칙 SOLID

→ 객체지향 설계에서 지켜줘야 할 5개의 소프트웨어 개발 원칙을 말한다

(SRP / OCP / LSP / ISP / DIP)

 

SRP / 단일 책임 원칙 / Single Responsibility Principle

→ 작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어 있어야 한다

 

OCP / 개방 폐쇠 원칙 / Open Closed Principle

→ 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다

 

LSP / 리스코프 치환 원칙 / Listov Substitution Principle

→ 서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다

 

ISP / 인터페이스 분리 원칙 / Interface Segregation Principle

→ 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다

 

DIP / 의존 역전 원칙 / Dependency Inversion Principle

→ 추상성이 높고 안정적인 고수준의 클래스는 구체적이고 불안정한 저수준의 클래스에 의존해서는 안 된다

구체적인 클래스에 의존하지 말고 최대한 추상화한 클래스에 의존하라는 뜻 (interface를 적극적으로 활용하라 )