이 글은 Computer Science에 관한 앎의 지평을 넓히기 위해
초보자를 위한 면접 질문 깃허브를 보며 공부한 내용을 정리한 것입니다.
객체지향 프로그래밍이란?
Object-oriented Programming
현실 세계의 사물들을 객체라고 보고, 현실 세계를 컴퓨터 상에 모델화하여 문제를 해결하기 위한 프로그래밍 기법.
(과거처럼 컴퓨터 중심이 아니라) 인간중심적 프로그래밍 패러다임이라고 할 수 있다.
즉, '객체를 정의'하고, '객체 사이의 상호작용을 분석'하는 것을 가리킨다.
객체 = 자료구조 + 함수, 프로그램 = 객체 + 객체
1. 기본 개념
객체(Object)
- 현실세계에 존재할 수 있는 유형·무형의 모든 대상을 가리킬 수 있다.
- '속성'과 '메서드'로 정의된다.
속성(attribute)
객체가 가지고 있는 특성. 객체의 상태를 의미한다.
- 속성은 객체의 상태, 성질, 분류, 식별, 수량 등을 표현한다.
클래스(class)
공통된 행위와 특성을 갖는 객체의 집합.
- 클래스는 동일한 타입의 객체들의 메서드와 변수들을 정의하는 템플릿이다.
- 클래스 내의 모든 객체들은 속성의 "값"만 달리할 뿐, 동일한 속성과 행위를 갖는다.
❓ 추상 클래스(abstract class)
서브 클래스들의 공통된 특성을 하나의 슈퍼 클래스로 추출하기 위한 클래스
- 재사용 부품을 이용해 확장할 수 있는 개념
- 일반 클래스와는 달리, 객체를 생성할 수 없다.
메시지(message)
한 객체가 다른 객체의 메서드를 부르는 과정. 즉, 외부에서 하나의 객체에 보내지는 메서드의 요구.
일반 프로그래밍에서 함수 호출에 해당한다.
메서드(method)
객체가 어떻게 동작하는지를 규정한 것.
- 속성의 값을 변경한다.
메시지에 의해 불리는 제어와 절차적 구성요소이다.
2. 특징
추상화(abstraction)
객체로부터 개발하고자 하는 애플리케이션에 필요한 특징들을 뽑는 것. 모두 표현하기 보다는 요구 사항에 따라 모델의 필요한 정보와 행위만 추려 모델링하는 과정.
정보은닉(information hiding)
객체의 세부내용을 외부로부터 숨기고, 메시지만으로 객체와의 상호작용을 하게 하는 것.
- 외부에서 알아야 하는 부분만 공개하고 그렇지 않은 부분은 숨김으로써 대상을 단순화하는 효과가 있다.
- 높은 독립성, 유지보수성, 향상된 이식성을 제공한다.
캡슐화(encapsulation)
객체를 정의할 때 서로 관련이 높은 데이터와 연관된 함수들을 하나로 묶는 것.
- 하나로 묶인 데이터구조와 동작들은 하나의 명세나 프로그램 컴포넌트로 재사용을 용이하게 해준다. (모듈화, modularity)
내부에 변수, 외부에는 메서드들이 변수를 둘러싸서 보호하도록 결합시켜 부품화한 것이다.
다형성(polymorphism)
같은 메시지에 대해 각 클래스가 가지는 고유한 방법으로 응답할 수 있는 능력.
- 둘 이상의 클래스에서 똑같은 메시지에 대해 객체가 서로 다르게 반응하는 것이다.
- 각 객체가 갖는 메서드의 이름은 중복될 수 있으며, 실제 메서드 호출은 인자에 의해 구별된다.
- 예) dance(person), dance(person, song)
상속성(inheritance)
새로운 클래스를 정의할 때, 기존 클래스의 속성을 받아 사용하는 방법
- 하위 계층은 상위 계층의 특수화(specialization) 계층이 되고, 상위 계층은 하위 계층의 일반화(generalization) 계층이 된다.
- overriding: 상속받은 하위 클래스가 상위 클래스의 속성과 메서드를 수정하거나 확장하여 사용하는 것
3. 설계원칙 (SOLID 원칙)
SRP (Single Responsibility Principle; 단일 책임 원칙)
클래스는 오직 하나의 책임을 가져야 하며, 클래스를 변경하는 이유는 오직 하나여야 한다.
OCP (Open-Closed Principle; 개방-폐쇄 원칙)
확장에는 열려있어야 하지만, 변경에는 닫혀있어야 한다.
LSP (Liskov Substitution Principle; 리스코프 치환 원칙)
상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
즉, B가 A의 자식이면, A를 사용하는 부분에서 B로 치환해도 동작해야 한다. (예: A는 직사각형, B는 정사각형)
ISP (Interface Segregation Principle; 인터페이스 분리 원칙)
인터페이스는 그를 사용하는 클라이언트를 기준으로 분리되어야 한다. 객체는 자신이 호출하지 않는 메소드에 의존하지 않아야 한다.
즉, 객체가 불필요한 기능을 상속 · 구현하는 것을 방지하는 것이다.
DIP (Dependency Inversion Principle; 의존 역전 원칙)
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 된다.
4. 장점
- 재사용성 높음 (예: 자주 사용하는 로직을 라이브러리로 만들어 사용) → 속도 향상, 품질 향상
- 생산성 향상
- 객체 단위로 코드가 나눠져 작성되므로 디버깅과 유지보수가 쉽다 — 모듈화된 프로그램의 개발 용이성
그 외에도:
확장 용이성, 안정성, 신뢰도, 신속한 설계, 설계 독립성, 상호 연동성, 무결성, 동적인 생명주기, 개발자와 관리자간의 효율적인 의사소통, 대량의 분산처리 지원
5. 단점
- 객체 간 정보교환이 모두 메시지 교환을 통해 이루어지므로, 실행 시스템에 많은 오버헤드*가 발생한다.
- but, 하드웨어의 발전으로 많은 부분 보완되었다.
오버헤드(overhead) : 어떤 처리를 하기 위해 들어가는 간접적인 처리시간이나 메모리 등을 말함
- 객체가 상태를 가지므로, 객체가 예측할 수 없는 상태를 가졌을 때 애플리케이션 내부에서 버그를 발생시킬 수 있다.
- 함수형 프로그래밍 패러다임의 등장
참조
- Interview Question for Beginner 中 'Object-Oriented Programming'
- <2022 박미진 컴퓨터일반> chapter 6. 객체지향 패러다임
- 객체 지향 프로그래밍(Object-Oriented Programming)이란?
-
[SOLID] 리스코프 원칙 법칙이란 (Liskov Substitution Principle, LSP)
- [OOP] 객체지향 5원칙(SOLID) - 인터페이스 분리 원칙 (Interface Segregation Principle)
'Computer Science > 개발상식' 카테고리의 다른 글
TDD (Test-driven development) (0) | 2022.03.21 |
---|---|
RESTful API (0) | 2022.03.17 |