객체 지향 프로그래밍 (Object Oriented Programming)
in Web
본 글은 로버트 C.마틴 저자(송준이 엮음)의 [클린 아키텍처: 소프트웨어 구조와 설계의 원칙] 도서를 읽고 작성하였습니다.
1. 정의
- 프로그래밍에 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 패러다임
2. 용어
2.1. 클래스(Class)
- 객체를 만들어 내기 위한 설계도 혹은 틀
- 연관되어 있는 변수와 메서드의 집합
2.2. 객체(Object)
- 소프트웨어 세계에 구현할 대상. 클래스에 선언된 모양 그대로 생성된 실체
- ‘클래스의 인스턴스’라고도 함
- 모든 인스턴스를 대표하는 포괄적인 의미를 가짐
- OOP 관점에서 클래스의 타입으로 선언되었을 때 ‘객체’라고 부름
2.3. 인스턴스(Instance)
- 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체
- 객체를 소프트웨어에 실체화한 것을 ‘인스턴스’라고 함
- 실체화된 인스턴스는 메모리에 할당됨
- 객체에 포함된다고 볼 수 있음
- OOP 관점에서 객체가 메모리에 할당되어 실제 사용될 때 ‘인스턴스’라고 부름
- 추상적인 개념 혹은 명세와 구체적인 객체 사이의 관계에 초점을 맞출 경우에 사용
- ‘A의 인스턴스’의 형태로 사용
- 객체 간의 링크는 클래스 간의 연관 관계의 인스턴스
- 실행 프로세스는 프로그램의 인스턴스
- 즉, 인스턴스라는 용어는 반드시 클래스와 객체 사이의 관계로 한정 지을 필요가 없음
- 인스턴스는 어떤 원본(추상적인 개념)으로부터 ‘생성된 복제본’을 의미
2.4. 클래스, 객체, 인스턴스 차이
- 클래스는 ‘설계도’, 객체는 ‘설계도로 구현한 모든 대상’을 의미
- 클래스의 타입으로 선언되었을 때 객체라고 부르고, 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 함
- 객체는 ‘실체’, 인스턴스는 ‘관계’에 초점을 둠
2.5. 추상화 기법
- 분류(Classification) : 객체 → 클래스
- 실재하는 객체들은 공통적인 속성을 공유하는 범주 또는 추상적인 개념으로 묶는 것
- 인스턴스화(Instantiation) : 클래스 → 인스턴스
- 분류의 반대 개념
- 범주나 개념으로부터 실재하는 객체를 만드는 과정
- 클래스 내의 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음, 그것을 물리적인 어떤 장소에 위치시키는 등의 작업을 통해 인스턴스를 만드는 것
3. 프로그래밍 구조
3.1. 프로퍼티(property)와 메서드(method)
- 프로퍼티
- 클래스 내부에 만드는 변수
- 주로 객체 내부에서 사용하는 일반적인 정보와 객체 내부 함수(메서드)에서 처리한 결과값이 저장
- OOP에서 흔히 말하는 getter/setter 메서드의 역할을 수행하면서 마치 데이터 멤버(필드)에 접근하듯이 사용할 수 있는 class member
- 메서드
- 클래스에 만드는 함수. 멤버 함수라고도 함
- 객체의 프로퍼티 값을 변경하거나 알아내는 기능(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