본문 바로가기

프로그래머/Java Managed Programming

[개체지향 프로그래밍] 개체지향 프로그래밍이란? | 개체지향 프로그래밍의 필요성 | 개체지향 프로그래밍 특성

Ch03. 개체지향 프로그래밍의 필요성

구조체의 한계

  1. 데이터의 비인간화
  2. 데이터가 많아지면 관리가 힘듦
    • 실수할 여지가 증가
    • 보완책 : 구조체 사용
      • 한계1 : 여전히 데이터왕 동작이 분리되어 있음
      • 한계2 : 어떤 구조체가 어떤 함수랑 연관 있는지 찾기 복잡함

사람이 세상을 인지하는 법

  • 사람은 세상을 물체(object)의 집합으로 인지
    • 물체는 상태를 가질 뿐만 아니라 동작도 할 수 있음
  • 상태와 동작
    • 상태 - 변수
    • 동작 - 함수
  • 모든 것이 개체는 아니다!

개체지향 프로그래밍

  • OOP

  • 프로그래밍을 구성하는 기본 요소를 개체로 보려는 노력

  • OOP에서 프로그램이란?

    • 상호작용하는 개체들의 집합
    • 절차적 프로그래밍은 실행할 명령어의 목록을 프로그램으로 봤음
  • 절차적 프로그래밍은 매우 객관적

    • 어떤 프로그램이라도 최종적으로는 절차적으로 돔
  • 개체지향 프로그램은 사람이 기준

    • 매우 주관적

OOP 토론 시 피해야 할 사람

  1. 처음 듣는 주장을 하며 '그건 올바른 OOP가 아니야!'라는 사람
  2. '이건 순수(pure) OOP 언어가 아니야'라는 사람
  3. '모든 프로그램은 OOP로 만들어야 해!'라는 사람
  4. ~한 ~가 이리 말했으니 너는 틀려!'라는 사람
  5. '이 방법만 따르면 문제가 해결되!'라는 사람
  • 개체(object)
  1. 개체란 서로 연관 있는 상태와 동작을 가지고 있다
  2. 사람들은 기본적으로 세상을 개체들의 모음으로 본다

OOP의 특성

  • 캡슐화(encapsulation), 상속(inheritance), 다형성(polymorphism)
  • 데이터 추상화(data abstraction)
  • 연관(association), 컴포지션(composition), 집합(aggregation)
  1. 캡슐화
  • 데이터와 그 데이터에 작용하는 메서드를 하나로 묶음
  • 정보 숨기기(data hiding): 개체 안에 있는 데이터를 외부로부터 보호
  1. 상속
  • 이미 존재하는 개체를 기반으로 확장된 개체를 만드는 방법
    • 엄밀히 말하면 클래스
  • 확장된 개체
    • 기존의 개체에 속한 데이터와 동작을 모두 물려 받음
    • 여기에 다른 데이터나 동작을 추가할 수 있음
  • 실용적 용도: 코드 중복을 막음
  • 사람에게는 점진적 학습이 가장 효율적
  1. 다형성
  • 많은 사람들이 OOP의 핵심이라 여기는 특징

  • 같은 지시를 내렸는데 다른 종류의 개체동작을 달리하는 것

    • 같은 지시: 동일한 함수 시그내처 호출
  • 절차적 언어에서 이런 일을 하려면 if문을 사용해야 했음

  • 어떤 함수 구현이 실행될지는 실행 중에 결정됨

    • 늦은 바인딩(late binding)
  • 일반적인 함수 호출은 이른 바인딩(early binding)

    • 컴파일 중 결정
  • 다형성의 혜택을 받으려면 상속 관계가 필요

    • 부모 개체에서 함수 시그내처를 선언
    • 자식 개체에서 그 함수를 다르게 구현(overriding)
  • 실용적인 용도: 다른 종류의 개체를 편하게 저장 및 처리 기능

    • 예: 부모의 형(type)을 저장하는 배열에 모든 자식 개체를 저장
      • for 문 하나로 모든 개체를 순회하며 동일한 함수를 호출
      • 그러면 각 개체가 자신의 종류에 따라 다른 동작을 함
  • 참고 : 다른 두 형태의 다형성

    1. ad-hoc 다형성
      • 함수 오버로딩, 연산자 오버로딩
      • 즉, 함수명은 같은데 매개변수 목록이 다름
    2. 매개변수 다형성
      • C#과 java의 제네릭(Generic)
      • C++의 템플릿
    • 허나 둘 다 일반적으로 다형성이라고 안 부름
    • OOP와도 상관 x
  1. (데이터) 추상화
  • 추상화
    • 수학: 일반화란 의미
    • OOP: 개체 속에 있는 실제 데이터나 함수 구현 방법에 종속되지 않겠다는 뜻
  • 데이터 추상화
    • 개체 사용 시 그 안에 정확히 어떤 데이터가 있는지 알 필요 없음
    • 개체 안에 있는 데이터에 직접 접근 불가
      • 개체의 함수를 통해 접근
    • 즉, 캡슐화는 데이터 추상화를 이루는 방법 중 하나
  • 추상화
    • 다형성을 통한 추상화
    • 추상 클래스(abstract class)나 인터페이스(interface)를 사용하는 추상화
  1. 연관
  • 어떤 개체가 제공하는 기능을 다른 개체가 이용하는 관계
  • 종종 상속과 비교해서 설명
    • 상속은 자식 개체가 부모 개체의 모든 것을 내포하는 관계
    • 연관은 한 개체가 다른 개체를 참조하는 관계
  • 세부적으로 다시 집합컴포지션으로 나누기도 함
    • UML 다이어그림을 그릴 때
    • 이 셋을 구분하지 않고 다 합쳐서 컴포지션이라 하기도 함
  1. 컴포지션
  • 함성, 조합, 조립, 구성 등 다양한 번역어가 존재
  • 여러 개의 부품(그 자체로 개체)을 조립해서 새 개체를 만드는 방법
  • 집합과의 차이
    • 부품 그 자체로는 존재 의의가 없음
    • 조립품이 소멸할 때 부품도 같이 소멸
  1. 집합
  • 역시 여러 개체를 모아 다른 개체를 만들지만 별도로도 존재 가능
  • 컴포지션과의 차이
    • 각 개체들이 따로따로 살아남을 수 있음
    • 예: A 대학이 문을 닫아도 학생들은 여전히 다른 대학에 등록 가능