728x90
이번 글에서는 객체지향의 개념에 대해서 정리하고자 한다.
객체지향의 개념에는 Abstraction(추상화), Encapsulation(캡슐화), Inheritance(상속), Polymorphism(다형성) 이 있다,
다형성 같은 경우는 예시 코드와 함께 다음 글에서 살펴보도록 하자.
객체 지향의 등장 배경 및 목적
- SW modulization (소프트웨어 모듈화)
- HW의 부품처럼 SW도 모듈화해서 각 모듈이 서로 독립적으로 동작하도록 설계하였다.
- 개발과정
- 전체 기능을 모듈 단위로 분해 → 각 모듈의 인터페이스 정의 → 각 모듈 독립적 개발 → 통합
- 서로 간의 의존성을 획기적으로 감소시킨다.
- 재사용, 유지보수 및 코드 분석이 용이하다.
- 전체 기능을 모듈 단위로 분해 → 각 모듈의 인터페이스 정의 → 각 모듈 독립적 개발 → 통합
여기서 말하는 module(모듈)은 SW 설계에서 독립적인 기능 및 개발 단위를 말한다.
Abstraction (추상화)
- 특정 관점에서 필요하거나 중요한 것만 포함하는 표현 형태이다.
- 구체적인 예시에서 공통적인 특성을 추출하여 일반화된 개념을 만드는 과정이다.
- 객체지향에서..
- 각 객체애 대해 시스템에 반드시 필요한 상태(state)와 행위(behavior)를 추출한다.
- Object (객체)
- 문제 영역에서 어떤 것의 추상화로, 정보를 보관(attribute)하고 기능을 제공(operation)할 수 있다.
- 동일한 대상에 대해 관점(perspective)에 따라 abstraction 결과가 달라진다.
- 지도를 예시로 들어보자.
- 도로 지도 (도로와 장소)
- 지질 지도 (암석과 지표)
- 또 다른.. 학생을 예시로 들어보자.
- 대학생 : 학과 소속, ID, 이름, 학점, 수강 과목, 평점 등
- 동아리 회원 : ID, 이름, 기술, 경력 등
- 지도를 예시로 들어보자.
- 유무형의 모든 것들이 객체로 abstraction이 가능하다.
- 예) TV, 카메라, 컴퓨터, 회원, 교수, 강의 등
- 다양한 용어가 혼용되어 사용되고 있다.
- state & behavior
- attribute & operation
- property & method
- data member & member function
- Class
- 클래스는 속성, 연산, 연결 등의 유사한 특징과 의미를 가진 객체 집합의 정의이다.
- 논리적 유사성을 추상적으로 기술한다.
- Object
- 객체는 클래스의 인스턴스로서 상태와 행위를 가진다.
Encapsulation (캡슐화)
- Message-passing (메시지 전달)
- 여러 객체가 시스템 동작을 위해 협력하며, 서로 메시지를 주고 받는다.
- 각 객체는 다른 객체의 내부 세부사항을 알 필요가 없다.(정보 은닉)
- 외부 객체는 유효한 연산 시그니처를 통해서만 연산 호출이 가능하다.
- 객체의 데이터는 자신의 연산을 통해서만 접근이 가능하다.
- 객체의 데이터는 아래의 그림과 같이 양파 껍질과 비슷하게.. 숨겨진다.

- 캡슐화는 객체 지향의 가장 핵심적인 개념이다.
- 다음 글에서 설명할 polymorphism도 class 차원의 encapsulation 구조이다.
- 객체의 외부 인터페이스에 집중한다.
- 내부의 구체적인 구현 내용은 숨긴다.
- 외부에서 객체 내부 데이터에 접근하는 것을 제한한다.
- Object, component 및 subsystem 간의 interface(public function)를 정의하는 데에 필수적인 개념이다.
- 캡슐화의 원칙
- 최소화 : 외부에 필요한 기능만 공개하고, 나머지는 숨긴다.
- 무변경 : 외부에 공개되는 부분은 변경하지 않도록 최대한 일반화한다.
- 유지해야 할 것(공개 함수/인터페이스)과 변해도 되는 것(내부 구조 등)을 분리해서 관리한다.
- 장점
- 내부를 몰라도 객체를 쉽고 안전하게 재사용 가능하다.
- 객체/컴포넌트가 모듈화되어 독립적으로 구현이 가능하여, 코드의 의존성이 감소한다.
- 이 객체를 호출하는 다른 객체의 코드 수정 가능성이 감소하게 된다.
728x90
Generalization and Specialization (일반화와 특수화)
분류는 아래처럼 계층적 구조이다.

- Specialization은 추가 정보를 더한다.

Inheritance (상속)
- 객체지향 프로그래밍 언어에서 generalization/specialization을 구현하는 방법이다.
- 상위 클래스(부모/기본 클래스)의 속성과 연산이 모든 하위 클래스(자식/파생 클래스)에 적용된다.
- 장점
- 기존에 작성한 superclass의 재사용(reuse)가 가능하다.
상속 구조를 찾는 방법
- Bottom-up approach (상향식)
- 클래스들 사이의 유사성을 찾는다.
- 유사성을 통합할 수 있는 superclass를 작성한다.
- Top-down approach (하향식)
- superclass와 subclass(들)이 이미 생성되어 있는 경우
- 추가적인 subclass 생성이 가능하다.
- "a kind of" 관계
- superclass와 subclass(들)이 이미 생성되어 있는 경우


객체 사이의 두 가지 관계
- IS-A
- 객체 사이의 inheritance 관계
- "is a kind of"
- HAS-A
- 자신의 객체 내에 다른 객체의 instance를 포함하는 관계

이번 글에서는 객체 지향에서도 추상화, 상속에 대해 알아보았다.
다음 글에서는 polymorphism에 대해 코드와 함께 알아보고자 한다.
728x90
'CS > Software Engineering' 카테고리의 다른 글
| [소프트웨어공학/Software Engineering] 객체지향과 인터페이스 (0) | 2026.04.10 |
|---|---|
| [소프트웨어공학/Software Engineering] Polymorphism 다형성 (0) | 2026.04.10 |
| [소프트웨어공학/Software Engineering] 애자일 소프트웨어 개발 (0) | 2026.04.07 |
| [소프트웨어공학/Software Engineering] 소프트웨어 프로세스 (2) (2) | 2026.04.03 |
| [소프트웨어공학/Software Engineering] 소프트웨어 프로세스 (1) (0) | 2026.04.02 |