STUDY

객체지향 언어의 특징

Lim임 2025. 11. 7. 16:13

객체지향 언어 (OOP) 특징 정리

간단한 정의
객체지향 프로그래밍(OOP, Object-Oriented Programming)은 데이터(속성)와 그 데이터를 처리하는 메서드(동작)를 하나의 단위인 객체로 묶어 소프트웨어를 구조화하는 패러다임입니다. 현실 세계의 개념을 모델링하기에 적합하며, 유지보수성과 재사용성을 높이는 데 유리합니다.


1. 핵심 개념

  • 클래스(Class)와 객체(Object)
    • 클래스: 속성과 메서드를 정의한 설계도
    • 객체: 클래스의 인스턴스(실제 데이터와 동작을 가진 실체)
  • 캡슐화(Encapsulation)
    • 데이터와 내부 구현을 숨기고, 공개된 인터페이스로만 접근하도록 제한
    • 접근 제어자(private/protected/public) 사용
  • 상속(Inheritance)
    • 기존 클래스의 특성(속성, 메서드)을 재사용하고 확장
    • 코드 중복 감소, 계층적 설계 가능
  • 다형성(Polymorphism)
    • 같은 인터페이스/부모 타입으로 서로 다른 객체를 동일하게 다루는 능력
    • 오버라이딩(런타임 다형성), 오버로딩(컴파일 타임 다형성)
  • 추상화(Abstraction)
    • 핵심적인 특징과 행동만 모델링하여 복잡도 감소
    • 인터페이스나 추상 클래스로 구현

2. 관련/추가 개념

  • 메시지 전달 / 메서드 호출: 객체 간 상호작용의 기본 수단
  • 동적 바인딩(런타임 바인딩): 호출 시점에 실제 객체 타입에 맞는 메서드가 결정
  • 인터페이스 및 추상 클래스: 계약(메서드 시그니처)을 통해 일관성 제공
  • 생성자/소멸자: 객체의 초기화와 자원 정리
  • 조합(Composition) vs 상속(Inheritance)
    • "상속 대신 조합" 권장: 유연성과 변경에 대한 안정성 측면에서 조합 선호
  • 디자인 패턴: OOP 설계에서 반복되는 문제에 대한 검증된 해법(팩토리, 싱글턴, 전략 등)

3. 장점

  • 현실 세계 모델링이 자연스러움
  • 코드 재사용성 및 유지보수성 향상
  • 모듈화로 팀 분업 및 대규모 시스템 관리에 유리
  • 인터페이스 기반 설계로 확장성 확보

4. 단점 / 한계

  • 지나친 상속 구조는 복잡도 증가 및 유지보수 악화 초래
  • 오브젝트 오버헤드로 성능/메모리 비용 발생 가능
  • 설계가 부실하면 코드가 비효율적이고 읽기 어려워짐
  • 모든 문제에 최적의 패러다임은 아님(함수형 등 대안 존재)

5. 설계 원칙(간단 정리)

  • SOLID 원칙 (요약)
    • S: 단일 책임 원칙 (Single Responsibility)
    • O: 개방-폐쇄 원칙 (Open/Closed)
    • L: 리스코프 치환 원칙 (Liskov Substitution)
    • I: 인터페이스 분리 원칙 (Interface Segregation)
    • D: 의존성 역전 원칙 (Dependency Inversion)
  • 테스트 가능하고 변경에 강한 구조를 목표로 설계

6. 간단 예제

Java (클래스, 상속, 다형성)

class Animal {
    public void speak() { System.out.println("..."); }
}
class Dog extends Animal {
    @Override
    public void speak() { System.out.println("멍멍"); }
}
public class Main {
    public static void main(String[] args) {
        Animal a = new Dog(); // 다형성
        a.speak(); // 출력: 멍멍
    }
}

Python (캡슐화(관습), 인터페이스 역할)

class Animal:
    def speak(self):
        raise NotImplementedError

class Dog(Animal):
    def speak(self):
        return "멍멍"

def make_sound(animal: Animal):
    print(animal.speak())

make_sound(Dog())  # 출력: 멍멍

7. 실무에서의 팁

  • 상속은 IS-A 관계에만 사용(강한 의미의 "이다")
  • 코드 재사용이 목적이라면 우선 조합(composition)을 고려
  • 인터페이스나 추상화를 통해 의존성을 줄이고 테스트 용이성 확보
  • 설계 원칙(SOLID)을 염두에 두고 작은 단위로 리팩터링

8. 추가로 참고할 주제

  • 디자인 패턴(GoF 패턴)
  • 객체지향 설계의 안티패턴
  • 병렬/동시성 환경에서의 객체 설계
  • 함수형 프로그래밍과의 혼용(예: 불변성, 순수 함수)

원하시면 위 내용을 기반으로

  • 특정 언어(Java, Python, C++, C# 등) 예제 확장,
  • SOLID 원칙별 실전 예시,
  • 자주 쓰이는 디자인 패턴 정리
    중 어느 것을 먼저 만들어드릴지 알려주세요.

'STUDY' 카테고리의 다른 글

타입스크립트  (0) 2025.11.10
C 언어 핵심 개념 요약 + 예시  (0) 2025.11.10
c언어 개념 정리  (0) 2025.11.06
변수와 상수  (0) 2025.11.05
블로그 포스팅하면서  (0) 2025.10.15