🧱 객체지향 프로그래밍 (OOP): 현실 세계를 코드로 옮기기

2025. 9. 23. 15:23·Computer Science/Programming Paradigm

객체지향 프로그래밍(OOP, Object-Oriented Programming)은 우리가 사는 세상을 바라보듯, 프로그램을 독립적인 '객체'들의 모임으로 보고 이들의 상호작용으로 시스템을 표현하는 패러다임입니다. 데이터를 별개의 것으로 취급하는 대신, 데이터와 그 데이터를 처리하는 메서드(Method)를 하나의 객체로 묶어 관리하죠.

OOP는 잘 설계하면 코드의 재사용성과 유지보수성을 크게 높일 수 있지만, 초기 설계에 많은 시간이 소요되고 다른 패러다임보다 상대적으로 속도가 느릴 수 있다는 특징이 있습니다.

// 최댓값을 찾는 로직 (OOP 스타일)
const initialList = [1, 2, 3, 4, 5, 11, 12];

class List {
  constructor(list) {
    this.list = list;
    // 생성 시점에 최댓값을 계산해서 속성으로 저장
    this.mx = list.reduce((max, num) => (num > max ? num : max), 0);
  }

  // 최댓값을 반환하는 메서드
  getMax() {
    return this.mx;
  }
}

const a = new List(initialList);
console.log(a.getMax()); // 12

List라는 '설계도(클래스)'를 만들고, 이 설계도를 바탕으로 a라는 실제 '객체(인스턴스)'를 만들어 그 객체의 기능(getMax)을 호출하는 방식입니다.


✨ 객체지향 프로그래밍의 4가지 핵심 특징

객체지향 프로그래밍을 떠받치는 4개의 기둥이라고 불리는 핵심적인 특징들입니다.

1. 추상화 (Abstraction) 복잡한 내부 구현은 숨기고, 사용에 필요한 핵심 기능만 외부에 노출하는 것을 의미합니다. 예를 들어, 우리가 자동차를 운전할 때 엔진의 원리는 몰라도 핸들과 페달만으로 조작할 수 있는 것과 같습니다.

2. 캡슐화 (Encapsulation) 데이터(속성)와 그 데이터를 다루는 함수(메서드)를 하나의 객체 안에 묶어두는 것입니다. 또한, 중요한 데이터는 외부에서 직접 접근하지 못하도록 막아 안전하게 보호합니다. (정보 은닉)

3. 상속 (Inheritance) 부모 클래스의 특징(속성과 메서드)을 자식 클래스가 그대로 물려받는 것입니다. 코드를 재사용하고, 더 나아가 기능을 추가하거나 확장하는 데 매우 유용합니다.

4. 다형성 (Polymorphism) '여러 가지 형태를 가질 수 있는 능력'을 의미합니다. 즉, 같은 이름의 메서드라도 객체의 종류나 매개변수에 따라 다르게 동작할 수 있습니다. 대표적인 예로 오버로딩과 오버라이딩이 있습니다.


🔍 다형성 깊이 보기: 오버로딩 vs 오버라이딩

오버로딩 (Overloading) 하나의 클래스 안에서 같은 이름의 메서드를 여러 개 정의하는 것입니다. 단, 메서드의 매개변수 타입이나 개수가 달라야 합니다. 컴파일 시점에 어떤 메서드를 호출할지 결정됩니다.

class Person {
    // 매개변수가 1개인 eat 메서드
    public void eat(String a) {
      System.out.println("I eat " + a);
    }

    // 매개변수가 2개인 eat 메서드
    public void eat(String a, String b) {
      System.out.println("I eat " + a + " and " + b);
    }
}

// 실행 코드
Person a = new Person();
a.eat("apple"); // "I eat apple"
a.eat("tomato", "phodo"); // "I eat tomato and phodo"

 

오버라이딩 (Overriding) 자식 클래스가 부모 클래스로부터 상속받은 메서드를 자신에게 맞게 다시 정의(재정의)하는 것입니다. 프로그램 실행 중에(런타임) 어떤 메서드가 호출될지 결정됩니다.

class Animal {
  public void bark() {
    System.out.println("mumu! mumu!");
  }
}

class Dog extends Animal {
  @Override // 부모의 메서드를 재정의한다는 의미
  public void bark() {
    System.out.println("wal!!! wal!!!");
  }
}

// 실행 코드
Dog d = new Dog();
d.bark(); // "wal!!! wal!!!"

부모 Animal의 bark 메서드가 있었지만, 자식 Dog가 자신만의 bark로 덮어썼기 때문에 "wal!!! wal!!!"이 출력됩니다.


📐 SOLID: 좋은 객체지향 설계의 5가지 원칙

유지보수와 확장이 쉬운 '좋은' 소프트웨어를 만들기 위해 많은 개발자들이 따르는 5가지 설계 원칙입니다.

  • 단일 책임 원칙 (SRP): 모든 클래스는 단 하나의 책임만 가져야 합니다. 클래스를 변경해야 할 이유는 단 하나여야 합니다.
  • 개방-폐쇄 원칙 (OCP): 소프트웨어 요소는 확장에는 열려 있어야 하지만, 변경에는 닫혀 있어야 합니다. 기존 코드를 바꾸지 않고도 기능을 추가할 수 있어야 합니다.
  • 리스코프 치환 원칙 (LSP): 자식 클래스는 언제나 부모 클래스를 대체할 수 있어야 합니다. 즉, 부모 객체를 자식 객체로 바꿔도 프로그램이 문제없이 동작해야 합니다.
  • 인터페이스 분리 원칙 (ISP): 클라이언트가 사용하지 않는 메서드에 의존하게 해서는 안 됩니다. 하나의 거대한 인터페이스보다, 여러 개의 구체적인 인터페이스가 낫습니다.
  • 의존 역전 원칙 (DIP): 구체적인 것에 의존하지 말고, 추상적인 것에 의존해야 합니다. 예를 들어, 자동차가 '특정 회사 타이어'가 아닌 '타이어 규격'에 의존해야 다양한 타이어를 갈아 끼울 수 있는 것과 같습니다.

1. 객체지향 프로그래밍이란 무엇인지 설명하고 특징을 말해보세요.

 

객체지향 프로그래밍은 프로그램을 독립적인 객체들의 집합으로 보고, 이들의 상호작용으로 시스템을 표현하는 패러다임입니다. 데이터와 이를 처리하는 메서드를 하나로 묶어 관리하며, 재사용성과 유지보수성이 뛰어납니다. 핵심 특징은 네 가지인데요. 첫째, 복잡한 구현을 감추고 필요한 부분만 제공하는 추상화, 둘째, 데이터와 메서드를 객체 내부에 숨기는 캡슐화, 셋째, 부모 클래스의 속성과 기능을 재사용할 수 있는 상속, 마지막으로 같은 이름의 메서드가 상황에 따라 다르게 동작하는 다형성입니다.

 

2. 객체지향 프로그래밍 설계원칙에 대해 말해보세요.

 

객체지향 프로그래밍 설계 원칙에는 SOLID가 있습니다. SOLID는 유지보수성과 확장성을 높이기 위해 지켜야 할 다섯 가지 원칙을 의미합니다. 첫째, 클래스는 하나의 책임만 가져야 한다는 단일 책임 원칙이 있고, 둘째, 소프트웨어는 새로운 기능 확장은 가능하지만 기존 코드를 수정하지 않도록 하는 개방-폐쇄 원칙이 있습니다. 셋째, 자식 클래스는 부모 클래스를 문제없이 대체할 수 있어야 한다는 리스코프 치환 원칙, 넷째, 클라이언트가 사용하지 않는 기능에는 의존하지 않도록 하는 인터페이스 분리 원칙, 마지막으로 구체적인 구현이 아닌 추상화에 의존해야 한다는 의존 역전 원칙이 있습니다.

 

3. 객체지향 프로그래밍과 절차형 프로그래밍의 차이점을 말해보세요.

 

객체지향 프로그래밍은 데이터를 중심으로, 데이터와 이를 처리하는 메서드를 객체 단위로 묶어 관리하는 패러다임입니다. 코드의 재사용성과 유지보수성이 뛰어나지만, 초기 설계에 시간이 많이 들고 실행 속도가 느릴 수 있다는 단점이 있습니다. 반면 절차지향 프로그래밍은 일이 처리되는 순서에 따라 코드를 작성하는 방식으로, 실행 흐름이 단순하고 속도가 빠른 장점이 있지만, 기능을 모듈화하기 어려워 유지보수성이 떨어진다는 특징이 있습니다.

 

'Computer Science > Programming Paradigm' 카테고리의 다른 글

📜 절차지향 프로그래밍: 순서대로 차근차근  (0) 2025.09.23
🧠 선언형 프로그래밍: "무엇을" 할 것인가?  (0) 2025.09.23
💻 프로그래밍 패러다임: 코드를 바라보는 다양한 관점  (0) 2025.09.23
'Computer Science/Programming Paradigm' 카테고리의 다른 글
  • 📜 절차지향 프로그래밍: 순서대로 차근차근
  • 🧠 선언형 프로그래밍: "무엇을" 할 것인가?
  • 💻 프로그래밍 패러다임: 코드를 바라보는 다양한 관점
TECHNING
TECHNING
Hi! I'm techning
  • TECHNING
    TECHNING
    TECHNING
    • 분류 전체보기 (54)
      • Computer Science (45)
        • Design Pattern (11)
        • Programming Paradigm (4)
        • Network (15)
        • Operating System (6)
        • Database (6)
        • Data Structure (3)
      • Algorithm (5)
        • Python (3)
        • Java (1)
      • IT Insight (4)
  • hELLO· Designed By정상우.v4.10.4
TECHNING
🧱 객체지향 프로그래밍 (OOP): 현실 세계를 코드로 옮기기
상단으로

티스토리툴바