쯔이's Dev

객체지향 프로그래밍(Object-Oriented Programming, OOP)의 3대 특징 본문

카테고리 없음

객체지향 프로그래밍(Object-Oriented Programming, OOP)의 3대 특징

jjhim531 2025. 1. 17. 00:54
반응형

1. 캡슐화 (Encapsulation)

  • 정의: 데이터(속성)와 그 데이터를 조작하는 메서드(행동)를 하나의 클래스 안에 묶는 것을 말합니다.
  • 목적: 데이터의 은닉성을 높이고, 외부에서 객체의 내부 구현을 알지 못해도 사용할 수 있도록 인터페이스를 제공합니다.
  • 특징
    • 접근 제어자: private, protected, public 등을 사용하여 데이터의 접근 범위를 제한합니다.
    • 외부에서는 객체의 속성에 직접 접근하지 않고, getter와 setter 메서드를 통해 간접적으로 접근합니다.
public class Person {
    private String name;  // 외부에서 직접 접근 불가
    private int age;

    public String getName() {
        return name;      // 외부에서 name 값 가져오기
    }

    public void setName(String name) {
        this.name = name; // 외부에서 name 값 설정
    }
}

2. 상속 (Inheritance)

  • 정의: 기존 클래스(부모 클래스 또는 슈퍼클래스)의 속성과 메서드를 다른 클래스(자식 클래스 또는 서브클래스)가 물려받는 것을 말합니다.
  • 목적: 코드의 재사용성을 높이고, 계층적 관계를 통해 확장성을 제공합니다.
  • 특징
    • 부모 클래스의 공통적인 기능을 자식 클래스에서 재사용합니다.
    • 자식 클래스는 부모 클래스의 기능을 그대로 사용하거나, 필요에 따라 오버라이딩(재정의)하여 동작을 변경할 수 있습니다.
public class Animal {
    public void eat() {
        System.out.println("This animal eats food.");
    }
}

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("This dog eats dog food.");
    }
}

3. 다형성 (Polymorphism)

  • 정의:
    • 같은 이름의 메서드나 연산자가 상황에 따라 다르게 동작하도록 만드는 것.
    • 같은 타입으로 여러 객체를 참조하거나 다양한 방식으로 동작할 수 있는 능력
  • 목적 : 유연한 설계를 가능하게 하고, 코드의 가독성과 확장성을 높인다.

특징

.*  오버로딩 (Overloading)

  • 같은 이름의 메서드를 매개변수의 타입이나 개수에 따라 다르게 정의하는 것
  • 상속과 무관하게 클래스 내부에서 같은 이름의 메서드를 여러 개 정의하는 것. 정적 다형성( 컴파일 시점의 다형성(Compile-time Polymorphism))

특징:

  • 같은 클래스 내에서 이루어집니다.
  • 메서드 이름은 같지만 매개변수의 시그니처(타입, 개수, 순서)가 다릅니다.
  • 상속과는 직접적인 관련이 없습니다.
public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

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

 

* 오버라이딩 (Overriding)

  • 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하여 사용하는 것.
  • 상속 관계에서 부모 클래스의 메서드를 재정의하여, 동적 다형성을 구현하는 방법(런타임 다형성)

특징:

  • 상속 관계에서 이루어집니다.
  • 부모 클래스의 메서드를 자식 클래스에서 재정의(동일한 이름, 동일한 매개변수 시그니처)합니다.
  • 객체의 실제 타입에 따라 동작이 결정됩니다.
  • 오버라이딩다형성을 구현하는 방법이며, 업캐스팅과 함께 자주 사용 - 업캐스팅이 된 상태에서 호출되는 메서드는 오버라이딩된 메서드
public class Animal {
    public void sound() {
        System.out.println("Animal makes a sound");
    }
}

public class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("Cat meows");
    }
}

참조 변수의 타입이 Dog나 Cat처럼 특정 클래스를 의미하므로, 이를 해당 클래스로 이해하셔도 됩니다.

상속 vs 다형성

  • 상속은 클래스 간의 관계를 정의하여 재사용성을 높이는 개념입니다.
  • 다형성은 상속 또는 인터페이스를 기반으로 같은 이름의 메서드가 다양한 방식으로 동작하도록 구현하는 것입니다.

>> 객체지향 프로그래밍(OOP)의 4대 특징으로 이야기할 때는 **추상화(Abstraction)**까지 포함해서 설명한다.

4. 추상화 (Abstraction)

  • 정의: 복잡한 시스템에서 꼭 필요한 핵심적인 속성과 동작만을 드러내고, 불필요한 세부 사항은 숨기는 것을 말합니다.
  • 목적: 복잡한 시스템을 단순화하고, 객체가 제공해야 할 최소한의 인터페이스만 드러냅니다.
  • 특징:
    • 추상 클래스(Abstract Class)와  인터페이스(Interface)를 통해 구현.
    • 추상화를 사용하면 개발자는 구체적인 구현보다는 객체가 수행해야 하는 행동에 집중할 수 있습니다.

 

(1) 추상 클래스

추상 클래스는 공통 속성과 동작을 정의하며, 구체적인 하위 클래스가 이를 상속받아 사용합니다.

 
// 추상 클래스
public abstract class Animal {
    private String name;

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

    public String getName() {
        return name;
    }

    public abstract void sound(); // 추상 메서드
}

// 구체적인 클래스
public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    @Override
    public void sound() {
        System.out.println(getName() + " barks");
    }
}

 

(2) 인터페이스

  • 추상화를 구현하기 위한 구체적인 도구 또는 구조
  • 자바에서 인터페이스는 **행동(메서드의 시그니처)**만을 정의하며, 실제 구현은 이를 구현하는 클래스에서 제공
  • 특징:
    • 메서드의 시그니처만 정의하고, 구현은 제공하지 않음(자바 8 이후부터는 default 메서드를 통해 구현 가능).
    • 다중 구현 가능.
    • 인터페이스는 클래스가 아닌 행동 계약을 정의하는 역할이다.
public interface Vehicle {
    void startEngine();
    void stopEngine();
}

public class Car implements Vehicle {
    @Override
    public void startEngine() {
        System.out.println("Car engine started");
    }

    @Override
    public void stopEngine() {
        System.out.println("Car engine stopped");
    }
}

>> 추상 클래스와 인터페이스의 차이

특징  추상 클래스 인터페이스
목적 추상화(공통 속성과 동작을 제공하며 기본 구현 가능) 추상화(구현 클래스가 반드시 따라야 할 "행동 계약" 정의)
구현 추상 메서드와 일반 메서드(구현된 메서드)를 모두 포함 가능 메서드는 기본적으로 추상적이고, 자바 8 이상에서만 default 메서드로 기본 구현 가능
상속 단일 상속만 가능 다중 구현 가능
사용 사례 부모-자식 관계(공통 속성과 동작) 서로 관련 없는 클래스들 간의 공통된 행동 계약 제공
멤버 변수 인스턴스 변수, 정적 변수 모두 가능 public static final로 정의된 상수만 허용
접근 제한자 private, protected, public 등 모든 접근 제한자 사용 가능 메서드는 기본적으로 public abstract, 변수는 public static final
예제 - abstract class Shape
- abstract class Animal
- interface Drawable
- interface Comparable
상속 키워드 extends를 사용하여 상속 implements를 사용하여 구현

>> 추상 클래스와 인터페이스는 언제 사용하나요?

추상 클래스 사용 시점

  1. 부모 클래스에서 기본 구현을 제공해야 할 때.
  2. 클래스 간에 **공통적인 상태나 동작(필드와 메서드)**가 있을 때.
  3. 상속 구조가 분명히 존재하고, 계층적인 관계를 형성할 때.

인터페이스 사용 시점

  1. 클래스 간에 공통적인 행동 계약을 정의해야 할 때.
  2. 다중 구현이 필요할 때.
  3. 서로 관련 없는 클래스들에게 공통된 기능을 강제하고 싶을 때.
    • 예: Flyable, Drawable, Comparable.

 

요약

  • 추상화는 객체지향 설계의 개념으로, 중요한 요소만 노출하고 불필요한 세부 사항을 숨기는 것.
  • 인터페이스는 추상화를 구현하기 위한 도구로, 클래스가 따라야 할 행동 계약을 정의.

둘은 관련이 있지만, 추상화가 더 큰 개념이고 인터페이스는 이를 구현하는 도구라고 보면 됩니다

 


 

4대 특징 요약

 

캡슐화 데이터와 메서드를 하나로 묶고, 데이터의 접근을 제한 정보 은닉, getter/setter
상속 부모 클래스의 속성과 메서드를 자식 클래스에 물려주는 것 코드 재사용성
다형성 같은 이름의 메서드나 객체가 상황에 따라 다른 방식으로 동작하는 것 오버로딩, 오버라이딩
추상화 꼭 필요한 기능만 노출하고, 세부 구현은 숨기는 것 추상 클래스, 인터페이스

 

>> OOP의 3대 특징  vs  4대 특징

  • OOP의 3대 특징으로 이야기할 때는 주로 기본적인 동작 원리(캡슐화, 상속, 다형성)에 초점을 둡니다.
  • OOP의 4대 특징은 추상화를 포함하여 객체지향 설계의 더 큰 그림을 이해하는 데 도움을 줍니다.
728x90
반응형