Object-Oriented Programming 시각적으로 이해하기
각 개념의 아키텍처를 애니메이션 다이어그램으로 살펴보세요. 카드를 클릭하면 더 깊은 내용을 확인할 수 있습니다.
Class
객체 설계의 기본 단위
클래스는 객체가 공통으로 따라야 할 상태 구조와 동작 계약을 정의하는 타입입니다. 인스턴스를 여러 개 만들어도 어떤 필드를 가지고 어떤 메시지에 응답하는지는 클래스가 정합니다.
Object
실행 중인 구체적 인스턴스
객체는 클래스에서 정의한 구조가 런타임에서 실제 상태와 정체성을 가진 형태로 만들어진 인스턴스입니다. 같은 클래스에서 나왔더라도 각 객체는 다른 값을 들고 있고, 그 차이가 메서드 결과를 바꿉니다.
Constructor
객체 초기 상태를 세우는 생성 루틴
생성자는 객체가 처음 만들어질 때 필요한 값을 채우고 곧바로 사용 가능한 상태로 만드는 초기화 경로입니다. 어떤 인자가 필수인지, 시작 시점에 어떤 불변 조건을 만족해야 하는지를 여기서 확정합니다.
Encapsulation
상태를 숨기고 메서드로 통제하는 원칙
캡슐화는 객체 내부 상태를 외부에 그대로 노출하지 않고 정해진 메서드를 통해서만 읽고 바꾸게 하는 원칙입니다. 요점은 숨김 자체가 아니라 상태 변경 규칙을 상태의 소유자인 객체 안에 두는 데 있습니다.
Abstraction
본질만 남기고 세부 구현을 숨기는 모델링
추상화는 구현 세부를 그대로 드러내지 않고 이 문제를 다루는 데 필요한 핵심 개념과 연산만 남기는 모델링 작업입니다. 객체지향에서 추상화는 코드를 감추는 기술이라기보다 호출자가 이 대상을 어떤 역할로 이해해야 하는지 정하는 설계 결정에 가깝습니다.
Interface
구현 없이 행위를 약속하는 계약
인터페이스는 구현 방식과 무관하게 어떤 연산을 제공해야 하는지만 선언하는 계약입니다. 호출자는 구체 클래스가 아니라 이 계약에 의존함으로써 구현체가 바뀌어도 코드 구조를 크게 흔들지 않을 수 있습니다.
Abstract Class
공통 구현과 확장 지점을 함께 가진 기반 클래스
추상 클래스는 공통 동작과 공통 상태는 상위 타입에서 제공하고 일부 단계는 하위 클래스가 구현하도록 남겨 두는 기반 클래스입니다. 인터페이스가 계약만 정의한다면 추상 클래스는 계약과 기본 구현을 함께 제공합니다.
Inheritance
기존 타입을 확장해 새 타입을 만드는 관계
상속은 기존 클래스의 상태와 동작을 이어받아 더 구체적인 하위 클래스를 만드는 관계입니다. 하위 클래스는 부모가 제공한 공통 규칙을 기반으로 동작을 추가하거나 일부를 재정의합니다.
Association
객체 간 참조 관계를 나타내는 연결
연관은 한 객체가 다른 객체를 참조하거나 알고 있는 관계입니다. 객체지향 모델링은 객체 하나의 내부만 정의해서 끝나지 않고, 객체들이 서로 어떤 연결을 맺는지도 함께 설명해야 도메인을 제대로 담아낼 수 있습니다.
Composition
작은 객체를 조합해 더 큰 객체를 만드는 방식
합성은 객체가 다른 객체들을 협력자로 가지고 있으면서 필요한 일을 그 객체들에게 위임해 전체 동작을 만드는 방식입니다. 재사용의 중심을 상속 계층이 아니라 협력 객체의 조합에 두는 설계라고 보면 됩니다.
Message Passing
객체가 메서드 호출로 협력하는 방식
메시지 전달은 객체가 다른 객체의 내부 상태를 직접 조작하지 않고 메서드 호출이라는 요청을 보내 협력하는 방식입니다. 보내는 쪽은 무엇을 원하는지만 말하고, 실제 처리 방식은 받은 객체가 자기 상태와 규칙을 기준으로 결정합니다.
Polymorphism
같은 호출이 타입에 따라 다르게 동작하는 성질
다형성은 호출자가 같은 계약으로 객체를 다뤄도 실제 실행되는 동작은 전달된 구체 타입에 따라 달라질 수 있는 성질입니다. 호출자는 같은 메서드를 부르지만 어떤 구현이 선택될지는 실제 객체의 타입이 결정합니다.