Java/CS

객체 지향 언어/ 객체 지향 프로그래밍(OOP)

吳버플로우 2025. 2. 1. 04:36

객체 지향 언어 / 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)

현실 세계의 사물과 개념을 프로그래밍에서 객체로 표현하며 객체를 중심으로 프로그램을 설계하고 구현하는 방식을 말합니다.

 

객체

현실 세계의 사물이나 개념을 소프트웨어 세계에서 표현한 것을 말합니다.

ex)  "자동차"라는 객체에는 속성(색상, 속도)과 행동(가속, 브레이크)이 있음.

 

클래스

객체 지향 관점에서 보는 클래스는, 객체를 만들기 위한 설계도 같은 것이라고 비유할 수 있습니다. 

ex) "자동차 클래스"로부터 다양한 자동차 객체를 생성할 수 있음

 

4가지 주요 원칙

1. 캡슐화(Encapsulation) 

객체의 데이터와 이를 조작하는 메서드를 하나로 묶고, 외부에서 직접 접근하지 못하도록 보호하는 것을 의미합니다.

class Person {
    private String name; // private 변수로 직접 접근 차단

    public Person(String name) {
        this.name = name;
    }

    public String getName() { // Getter 메서드
        return name;
    }

    public void setName(String name) { // Setter 메서드
        this.name = name;
    }
}

 

2. 상속(Inheritance)

기존 클래스의 속성과 기능을 물려받아 새로운 클래스를 만드는 것을 의미합니다.

ex) "자동차" 클래스에서 "스포츠카" 클래스를 만들고, 여기에 추가 속도를 더하는 기능을 추가

class Animal {
    String name;

    void makeSound() {
        System.out.println("Some sound...");
    }
}

// Dog 클래스가 Animal 클래스를 상속받음
class Dog extends Animal {
    void makeSound() {
        System.out.println("Bark! Bark!");
    }
}

 

3. 다형성(Polymorphism)

같은 메서드나 객체가 상황에 따라 다르게 동작하는 것을 의미합니다.

메서드 오버로딩(Overloading)과 오버라이딩(Overriding)으로 구현 가능합니다. 

* 오버로딩: 같은 메서드 이름이지만 매개변수가 다름

* 오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 재정의

 

ex) "동물" 클래스의 "소리내기()" 메서드는 고양이 객체에서는 "야옹", 개 객체에서는 "멍멍" 소리를 냄.

// 오버로딩: 같은 메서드 이름이지만 매개변수가 다름
class MathUtils {
    int add(int a, int b) {
        return a + b;
    }

    double add(double a, double b) {
        return a + b;
    }
}

 

// 오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 재정의
class Parent {
    void showMessage() {
        System.out.println("Hello from Parent!");
    }
}

class Child extends Parent {
    @Override
    void showMessage() {
        System.out.println("Hello from Child!");
    }
}

 

4. 추상화(Abstraction)

객체의 필요한 부분만 드러내고 불필요한 세부사항은 숨기는 것을 의미합니다.

추상 클래스(Abstract Class)와 인터페이스(Interface)를 사용하여 구현 가능합니다.

구현을 강제하여 설계의 일관성을 유지하고, 코드의 유지보수를 용이하게 한다. 

 

ex) 자동차를 탈 때, 내부의 엔진 작동 원리를 몰라도 페달을 밟으면 움직이는 것처럼...

abstract class Animal {
    abstract void makeSound(); // 추상 메서드 (구현 없음)
}

// Dog 클래스는 Animal 클래스를 상속받고 makeSound()를 반드시 구현해야 함
class Dog extends Animal {
    void makeSound() {
        System.out.println("Bark! Bark!");
    }
}

 

객체지향 프로그래밍의 장점

  • 유지보수 용이: 객체 단위로 문제를 해결하니 변경이나 수정이 쉬움.
  • 재사용성: 클래스와 객체를 재사용해 코드 중복을 줄임.
  • 가독성: 객체와 메서드가 역할별로 나뉘어 있어 코드 이해가 쉬움.

대표적인 객체 지향 프로그래밍 언어

  • Java: 객체 지향 언어의 대표적인 예로, 캡슐화, 상속, 다형성을 적극 활용
  • C++: 절차 지향(C) + 객체 지향(OOP)을 혼합한 언어
  • Python: 동적 타이핑을 지원하면서도 객체 지향 개념을 충실히 따름
  • C#: 마이크로소프트에서 개발한 OOP 언어로, .NET 프레임워크와 함께 사용
  • Kotlin: Java보다 더 간결한 문법을 제공하는 객체 지향 언어

절차 지향 언어와의 차이