객체 지향 프로그래밍 (Object Oriented Programming)

본 글은 로버트 C.마틴 저자(송준이 엮음)의 [클린 아키텍처: 소프트웨어 구조와 설계의 원칙] 도서를 읽고 작성하였습니다.


1. 정의

  • 프로그래밍에 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 패러다임

2. 용어

2.1. 클래스(Class)

  • 객체를 만들어 내기 위한 설계도 혹은 틀
  • 연관되어 있는 변수와 메서드의 집합

2.2. 객체(Object)

  • 소프트웨어 세계에 구현할 대상. 클래스에 선언된 모양 그대로 생성된 실체
    • ‘클래스의 인스턴스’라고도 함
  • 모든 인스턴스를 대표하는 포괄적인 의미를 가짐
  • OOP 관점에서 클래스의 타입으로 선언되었을 때 ‘객체’라고 부름

2.3. 인스턴스(Instance)

  • 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체
    • 객체를 소프트웨어에 실체화한 것을 ‘인스턴스’라고 함
    • 실체화된 인스턴스는 메모리에 할당됨
  • 객체에 포함된다고 볼 수 있음
  • OOP 관점에서 객체가 메모리에 할당되어 실제 사용될 때 ‘인스턴스’라고 부름
  • 추상적인 개념 혹은 명세와 구체적인 객체 사이의 관계에 초점을 맞출 경우에 사용
    • ‘A의 인스턴스’의 형태로 사용
    • 객체 간의 링크는 클래스 간의 연관 관계의 인스턴스
    • 실행 프로세스는 프로그램의 인스턴스
    • 즉, 인스턴스라는 용어는 반드시 클래스와 객체 사이의 관계로 한정 지을 필요가 없음
      • 인스턴스는 어떤 원본(추상적인 개념)으로부터 ‘생성된 복제본’을 의미

2.4. 클래스, 객체, 인스턴스 차이

  • 클래스는 ‘설계도’, 객체는 ‘설계도로 구현한 모든 대상’을 의미
  • 클래스의 타입으로 선언되었을 때 객체라고 부르고, 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 함
  • 객체는 ‘실체’, 인스턴스는 ‘관계’에 초점을 둠

2.5. 추상화 기법

  1. 분류(Classification) : 객체 → 클래스

Untitled

  • 실재하는 객체들은 공통적인 속성을 공유하는 범주 또는 추상적인 개념으로 묶는 것
  1. 인스턴스화(Instantiation) : 클래스 → 인스턴스
    • 분류의 반대 개념
    • 범주나 개념으로부터 실재하는 객체를 만드는 과정
    • 클래스 내의 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음, 그것을 물리적인 어떤 장소에 위치시키는 등의 작업을 통해 인스턴스를 만드는 것

3. 프로그래밍 구조

3.1. 프로퍼티(property)와 메서드(method)

  1. 프로퍼티
    • 클래스 내부에 만드는 변수
    • 주로 객체 내부에서 사용하는 일반적인 정보객체 내부 함수(메서드)에서 처리한 결과값이 저장
    • OOP에서 흔히 말하는 getter/setter 메서드의 역할을 수행하면서 마치 데이터 멤버(필드)에 접근하듯이 사용할 수 있는 class member
  2. 메서드
    • 클래스에 만드는 함수. 멤버 함수라고도 함
    • 객체의 프로퍼티 값을 변경하거나 알아내는 기능(getter, setter)클래스를 대표하는 기능이 담기게 됨

3.2. 캡슐화(encapsulation)

  • 객체의 프로퍼티와 메서드를 하나로 묶고
  • 실제 구현 내용 일부를 내부에 감추어 은닉
  • 접근 지정자(public, protected, default, private)를 사용하기도 함

3.3. 상속(inheritance)

  • 새로운 클래스(부모)에서 기존 클래스(자식)의 모든 프로퍼티와 메소드를 사용할 수 있는 것을 의미
  • 상속을 통해 새로운 프로그램의 요구에 맞게 기존 클래스를 수정하여 재사용 할 수 있음
  • 클래스 간의 종속 관계를 형성함으로써 객체의 관계를 조직화할 수 있음

3.4. 다형성(polymorphism)

  • 하나의 객체가 여러가지 타입을 가질 수 있음을 의미
  • 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로, 자식 클래스 타입의 인스턴스를 참조할 수 있도록 구현

4. 간접 참조(Indirection)

  • 컴퓨터 공학에서 “간접 참조”는 값 자체보다 컨테이너, 연결, 별명 등을 사용해서 우회해서 참조하도록 하는 방식을 말함
  • “All problems in computer science can be solvedby another level of indirection” - David Wheeler 컴퓨터 과학의 모든 문제는 다른 수준의 간접 참조로 해결할 수 있다. - 데이비드 휠러 -
  • C언어에서의 간접 참조

    • 포인터 변수가 저장하고 있는 주소를 찾아가서 그 주소에 있는 변수를 사용하는 연산자

      • ‘&’가 변수를 통해 주소를 찾는 연산자라면
      • 간접 참조 연산자는 반대로 주소를 통해 변수를 찾는 연산자
      • C언어에는 간접 참조 연산자로 ‘*’이 있다.

        #include <stdio.h>
        
        int main() {
            int a=13;
            int *p = &a;
            printf("주소 = %p, a = %d, *p = %d\n",p,a,*p);
            *p=11;                                          // 간접 참조
            printf("주소 = %p, a = %d, *p = %d\n",p,a,*p);
            return 0;
        }
        Colored
        

Reference

  • 로버트 C.마틴, 2019, 클린 아키텍처: 소프트웨어 구조와 설계의 원칙
  • https://jongminfire.dev/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80
  • https://studymake.tistory.com/424
  • http://www.tcpschool.com/java/java_polymorphism_concept