CS/Software Engineering

[소프트웨어공학/Software Engineering] 객체 지향이란?

binaryroot 2026. 4. 9. 21:56
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" 관계

왼)상향식, 오)하향식

 

객체 사이의 두 가지 관계

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

 

 

이번 글에서는 객체 지향에서도 추상화, 상속에 대해 알아보았다.

다음 글에서는 polymorphism에 대해 코드와 함께 알아보고자 한다.

728x90