-- 기타 --/일반 개념

[객체 지향 프로그래밍] 상속, 캡슐화, 다형성, 추상화

JunKang 2023. 12. 14. 12:23

객체 지향 프로그래밍의 상속, 캡슐화, 다형성, 추상화,, 들어도 들어도 헷갈려서 정리했습니다

 

상속

상속은 OOP의 중요한 특징 중 하나로, 기존 클래스의 특성을 그대로 이어받아 새로운 클래스를 생성하는 메커니즘입니다

상속을 통해 코드의 재사용성을 높일 수 있고, 코드 중복을 최소화할 수 있습니다

부모 클래스의 속성과 메서드를 자식 클래스가 물려받아 사용할 수 있으며, 자식 클래스에서는 필요에 따라 새로운 기능을 추가하거나 부모 클래스의 기능을 재정의할 수 있습니다

 

class Animal {
    void speak() {
        System.out.println("Animal speaks");
    }
}

class Dog extends Animal {
    void speak() {
        System.out.println("Dog barks");
    }
}

// 사용 예시
Dog myDog = new Dog();
myDog.speak();  // 출력: Dog barks

 

캡슐화

캡슐화는 객체의 상태와 행위를 하나로 묶고, 외부에서의 접근을 제어하는 것을 의미합니다

이는 정보 은닉을 통해 객체의 내부 구현을 외부로부터 숨기고, 오직 정의된 인터페이스를 통해서만 객체와 상호작용할 수 있도록 하는 것입니다

캡슐화는 코드의 모듈성을 높이고, 객체 간의 결합도를 낮춰 시스템을 유연하게 만듭니다

 

class Car {
    private int speed;  // 속성을 비공개로 설정

    int getSpeed() {
        return speed;
    }

    void setSpeed(int newSpeed) {
        if (newSpeed > 0) {
            speed = newSpeed;
        }
    }
}

// 사용 예시
Car myCar = new Car(60);
System.out.println(myCar.getSpeed());  // 출력: 60
myCar.setSpeed(80);
System.out.println(myCar.getSpeed());  // 출력: 80

 

다형성

다형성은 같은 인터페이스를 공유하면서 다양한 구현을 가질 수 있는 능력을 의미합니다

다형성은 코드의 유연성을 향상시키면, 동일한 메서드 호출에 대해 다른 동작을 수행할 수 있도록 합니다

이는 메서드 오버로딩과 메서드 오버라이딩을 통해 구현됩니다

 

abstract class Shape {
    abstract double area();
}

class Circle extends Shape {
    private double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    double area() {
        return 3.14 * radius * radius;
    }
}

class Rectangle extends Shape {
    private double length;
    private double width;

    Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    double area() {
        return length * width;
    }
}

// 사용 예시
Circle circle = new Circle(5);
Rectangle rectangle = new Rectangle(4, 6);
System.out.println(circle.area());      // 출력: 78.5
System.out.println(rectangle.area());   // 출력: 24

 

추상화

추상화는 복잡한 시스템에서 중요한 부분을 간추려 표현하는 과정입니다

이는 사용자에게 필요한 정보만을 제공하고 나머지는 숨겨짐으로써 시스템을 더 이해하기 쉽게 만듭니다

추상화는 클래스와 인터페이스를 통해 구현되며, 불필요한 세부사항을 숨기고 핵심 기능에만 집중할 수 있도록 도와줍니다

 

abstract class Shape {
    abstract double area();
}

class Circle extends Shape {
    private double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    double area() {
        return 3.14 * radius * radius;
    }
}

class Rectangle extends Shape {
    private double length;
    private double width;

    Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    double area() {
        return length * width;
    }
}

// 사용 예시
Circle circle = new Circle(5);
Rectangle rectangle = new Rectangle(4, 6);
System.out.println(circle.area());      // 출력: 78.5
System.out.println(rectangle.area());   // 출력: 24