OOP 개념

hoon·2025년 1월 13일

JAVA

목록 보기
2/21

OOP (객체지향 프로그래밍) 개념

  • *객체지향 프로그래밍(OOP)은 데이터와 데이터를 조작하는 메서드를 객체**라는 단위로 묶어 프로그램을 설계하는 방식입니다. OOP는 프로그램을 구조화하고 유지보수를 쉽게 하며, 코드 재사용성을 높이는 데 도움을 줍니다.

다음은 객체지향 프로그래밍의 4가지 핵심 원칙입니다:


1. 캡슐화 (Encapsulation)

캡슐화는 데이터(필드)와 데이터를 조작하는 메서드를 하나의 단위(클래스)로 묶는 것을 의미합니다. 외부에서 객체의 데이터를 직접 접근하지 못하도록 막고, 대신 메서드를 통해 접근하거나 수정하도록 합니다.

주요 특징:

  • 정보 은닉: 객체 내부의 데이터를 private로 선언하여 외부에서 직접 접근하지 못하게 합니다.
  • 접근 메서드 제공: gettersetter 메서드를 통해 데이터를 안전하게 관리합니다.
  • 안전성: 잘못된 데이터나 예기치 못한 동작을 방지합니다.

예제:

public class Person {
    private String name;  // 필드 은닉
    private int age;

    // getter와 setter 메서드로 데이터 접근
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException("나이는 0 이상이어야 합니다.");
        }
        this.age = age;
    }
}

2. 상속 (Inheritance)

상속은 기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스)에 물려주는 기능입니다. 이를 통해 코드의 재사용성확장성을 높일 수 있습니다.

주요 특징:

  • 부모 클래스의 필드와 메서드를 자식 클래스가 그대로 사용할 수 있음.
  • 자식 클래스는 부모 클래스의 기능을 확장하거나 수정(오버라이딩)할 수 있음.
  • 코드 중복을 줄이고 유지보수를 쉽게 만듦.

예제:

// 부모 클래스
public class Animal {
    public void eat() {
        System.out.println("먹는 중...");
    }
}

// 자식 클래스
public class Dog extends Animal {
    public void bark() {
        System.out.println("멍멍!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();  // 부모 클래스의 메서드 사용
        dog.bark(); // 자식 클래스의 메서드 사용
    }
}

3. 다형성 (Polymorphism)

다형성은 같은 메서드나 객체가 다양한 방식으로 동작할 수 있도록 만드는 기능입니다. 주로 메서드 오버로딩메서드 오버라이딩, 그리고 상속 관계에서 동적 바인딩(dynamic binding)을 통해 구현됩니다.

주요 특징:

  • 메서드 오버로딩: 같은 이름의 메서드를 매개변수에 따라 다르게 정의.
  • 메서드 오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 재정의.
  • 다형성 활용: 부모 클래스 타입의 변수로 자식 클래스 객체를 참조하여 동적으로 동작.

예제:

// 부모 클래스
public class Animal {
    public void sound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

// 자식 클래스
public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("멍멍!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog(); // 부모 타입으로 자식 객체 참조
        animal.sound();            // 출력: 멍멍! (동적 바인딩)
    }
}

4. 추상화 (Abstraction)

추상화는 필요한 정보만 보여주고 불필요한 세부사항은 감추는 것입니다. 이는 주로 추상 클래스와 인터페이스를 통해 구현됩니다. 추상화는 설계의 명확성을 높이고, 객체의 중요한 특징만 드러나도록 합니다.

주요 특징:

  • 추상 클래스: 공통 속성과 메서드를 정의하며, 구체적인 구현은 자식 클래스에서 합니다.
  • 인터페이스: 클래스가 가져야 할 동작(메서드)을 정의만 하고, 구현은 각 클래스에서 수행합니다.

예제:

// 추상 클래스
abstract class Animal {
    abstract void sound(); // 추상 메서드

    public void eat() {
        System.out.println("먹는 중...");
    }
}

// 자식 클래스
class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("멍멍!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.sound(); // 출력: 멍멍!
        dog.eat();   // 출력: 먹는 중...
    }
}

OOP의 장점

  1. 재사용성: 상속과 캡슐화를 통해 코드 재사용이 용이.
  2. 유지보수성: 코드 구조가 명확해 변경 사항이 있어도 관리가 쉬움.
  3. 확장성: 다형성과 추상화를 통해 새로운 기능을 쉽게 추가 가능.
  4. 모듈화: 객체 단위로 코드를 설계하여 프로그램을 논리적으로 분리.

OOP의 단점

  1. 복잡성: 절차지향에 비해 설계와 구현 과정이 복잡할 수 있음.
  2. 초기 비용: 설계 단계에서 많은 시간과 노력이 필요.
  3. 성능: 작은 프로그램에서는 절차지향보다 성능이 떨어질 수 있음.

요약

원칙설명예제
캡슐화데이터를 숨기고 메서드를 통해 관리private 필드 + getter/setter
상속부모 클래스의 속성과 메서드를 자식 클래스에 전달class Child extends Parent
다형성객체가 여러 형태로 동작할 수 있도록 설계메서드 오버로딩, 오버라이딩
추상화중요한 정보만 노출, 불필요한 세부사항 숨김추상 클래스, 인터페이스

0개의 댓글