본문 바로가기

CS

[CS] 객체 지향

객체지향(Object Oriented)

실세계의 개체를 속성과 메서드가 결합한 객체 형태로 나타내는 패러다임으로, 컴퓨터 프로그램을 단순히 명령 목록으로 보는 것에서 벗어나 여러 독립된 객체들의 모임 및 메시지 기반 상호작용으로 간주한다.

객체지향의 장점

  • 재사용과 확장이 용이하다.
  • 유지보수가 쉬운 편이다.
  • 복잡한 구조를 단계적 / 계층적으로 표현한다.
  • 현실세계를 모형화하여 이해하기 쉽다.

객체지향 구성요소

  • 클래스
    • 공통의 속성(프로퍼티) 및 연산(메서드)를 가지는 객체의 집합
      • 속성(프로퍼티): 객체가 가진 데이터를 나타내는 속성들
      • 메서드: 객체가 메시지를 받아 실행하는 구체적인 연산
    • 실제 세상의 데이터를 추상화하는 단위(개 => Dog 클래스)
  • 객체
    • 물리적, 추상적으로 외부 요소와 식별되는 대상. 독립적인 이름을 가진다.
    • 각각의 객체는 자신만의 상태를 가질 수 있으며, 상태는 시간에 따라 변할 수 있다. (프로퍼티 값 바뀌는거)
    • 인스턴스: 클래스에 속한 각각의 "실제" 객체로, 메모리에 할당된다.
  • 메시지
    • 객체 간 상호작용에 사용되는 수단.
    • 객체에게 특정 행위를 하도록 지시하는 명령 또는 요구사항
※ 절차적 프로그래밍: 프로시저(함수, 메서드, 루틴 등)를 기반으로 수행해야 하는 연속적 계산 과정을 묘사하는 패러다임. 적절한 크기로 프로시저를 설정하여 모듈화 하는 것이 중요함.

객체지향의 특징 4가지

캡슐화

서로 연관된 데이터와 함수를 하나로 묶는 것 ( 클래스 )

  • 정보 은닉: 외부에 필요한 인터페이스만 드러내는 개념으로, 외부에서의 접근이 제한되어 파급효과가 적다.
  • 파급효과: 모듈 간 결합도가 높아 한 모듈에서의 변경이 다른 모듈에 영향을 주는 것
  • 결합도 ↓ / 재사용 ↑
  • 최소한의 인터페이스만 외부에 공개하여 단순한 구조를 가진다.

추상화

객체의 공통적인 성질을 추출하는 것 ( 추상 클래스, 인터페이스 )

  • 추상 클래스: 클래스의 공통점을 모아 추상화한 클래스. 상속 기반 확장이 목적이다.
    • 추상 클래스만으로는 객체를 생성할 수 없다.
    • 모든 메서드가 추상 메서드(선언만 하는 메서드)일 필요는 없다. 즉, 구현된 메서드를 가질 수 있다.
    • 상속 기반으로 동작하므로, 대부분의 언어에서 단일 상속만 지원한다.
    • 각 필드 및 메서드는 접근제어자를 가질 수 있다.
    • 공통된 코드나 상태를 묶어 "클래스"라는 형태로 관리하고 싶거나, 서브 클래스가 공통 구현 메서드를 가져야 할 때 사용한다.
  • 인터페이스: 추상 메서드의 집합으로, 클래스가 어떤 메서드를 제공해야 하는지 정의한다.
    • 인터페이스는 기본 구현을 (거의 대부분의 언어에서) 가질 수 없다.
    • 인터페이스는 일종의 스펙으로, 객체간의 결합도를 낮춘다.
    • 한 클래스는 여러개의 인터페이스를 구현할 수 있다.
    • 클래스가 특정 동작을 지원함을 약속할 때, 또는 다중 상속이 필요할 때 사용한다.

상속

이미 존재하는 클래스의 속성과 메서드를 하위 클래스에서 물려받아 사용하게 하는 것

  • 상위 클래스에 정의된 속성과 메서드를 사용하여 코드의 재사용성을 높인다.
  • 클래스 간 계층 구조를 정의하여 관리를 용이하게 만든다.

재사용성이라는 면에서 상속은 큰 가치를 가지지만, 상속 레벨이 깊어지는 경우 다음과 같은 문제가 발생할 수 있다.

  • 복잡성 증가: 클래스 간 관계를 이해하기 어려워진다. 코드의 디버깅 및 유지보수가 어렵다.
  • 의존성 증가: 부모 클래스의 변경이 하위 클래스에 영향을 미칠 수 있다.
  • 다이아몬드 문제: 상위 클래스에서 다중 상속 시 같은 메서드나 속성을 가져 충돌이 발생할 수 있다.

 위와 같은 문제로, 상속은 객체지향의 근본이 되는 원리이기는 해도 남용하면 유지보수에 큰 문제를 가져온다. 상속의 규모가 깊어질 것 같다면 합성, 인터페이스 또는 디자인 패턴을 적용하여 상속 레벨을 낮출 수 있도록 리팩토링이 필요하다.

  • 합성(composition): 상속 대신 복합 구조를 통해 코드를 구성하는 방법. 객체를 조합하여 새로운 객체를 만든다.
    • ex) 캐릭터 => HP 클래스, MP 클래스 등을 조합한다.
    • 객체를 동적으로 바꿀 수 있어 유연성이 높다.
    • 클래스 간 의존성이 낮아 코드를 변경하거나 확장하기 쉽다.
    • 객체를 재사용하기 좋다. ( HP / MP )

다형성

메시지에 의해 객체가 연산을 수행할 때, 각 객체가 가진 고유한 방법으로 응답할 수 있는 능력

  • 오버로딩:매개변수의 유형과 개수를 다르게 하여 같은 이름의 메서드를 여러개 가지는 방법
    • 매개변수 타입, 개수, 순서 중 최소 하나는 달라야 한다.
    • 반환형만 다른 경우는 오버로딩이 될 수 없다.
    • ex) 덧셈 / 뺄셈 오퍼레이터를 각 클래스 별로 다르게 구현
  • 오버라이딩: 상위 클래스에서 정의한 구현을 하위 클래스에서 재정의하는 방법. 상속 관계에서 발생한다.
    • 오버라이딩 된 메서드는 부모 클래스의 메서드와 동일한 시그니처(이름, 매개변수 타입, 타입 순서)를 가진다.

'CS' 카테고리의 다른 글

객체 지향 프로그래밍의 배경  (1) 2024.02.19
[CS] DIP / IoC / DI  (0) 2023.10.23
[batch] cron 표현식  (0) 2023.08.23
[네트워크] HOL(Head Of Line) blocking  (0) 2023.08.03
[암호학] 서론  (0) 2022.09.16