컴퓨터 과학(CS)

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

마달랭 2024. 11. 26. 21:56
반응형

개요

  • 상속: 기존 클래스의 속성과 메서드를 물려받아 재사용하고 확장할 수 있는 개념.
  • 다형성: 동일한 인터페이스(메서드)가 여러 형태로 동작할 수 있게 하는 개념.
  • 캡슐화: 객체의 상태와 행위를 하나의 단위로 묶고, 내부 구현을 숨기고 외부와의 인터페이스만 제공하는 개념.
  • 추상화: 시스템의 복잡한 세부사항을 숨기고 중요한 기능만을 드러내는 개념.

 

상속

기존 클래스에서 정의된 속성과 메서드를 새로운 클래스로 물려받아 재사용할 수 있게 해주는 OOP의 기본 개념

자식 클래스는 부모 클래스의 멤버를 상속받고, 이를 확장하거나 변경할 수 있다.

이를 통해 코드 재사용성을 높이고, 유지보수를 용이하게 만든다.

 

상속을 사용하면 코드 중복을 피할 수 있으며, 일반적으로 "is-a" 관계를 나타낸다.

예를 들어, "자동차"는 "탈 것"이다라는 관계를 표현할 수 있다.

 

 

다형성

하나의 인터페이스가 여러 가지 형태를 가질 수 있는 OOP의 개념

같은 메서드 이름이지만, 다양한 클래스에서 다르게 구현되는 형태를 말한다.

메서드 오버라이딩과 메서드 오버로딩을 통해 구현된다.

  • 오버라이딩 : 부모 클래스의 메서드를 자식 클래스에서 재정의
  • 오버로딩 : 같은 이름의 메서드지만 매개변수의 개수나 타입에 따라 다르게 구현

다형성은 코드의 유연성과 확장성을 높이고, 다양한 객체가 동일한 메시지를 다르게 처리할 수 있게한다.

예를 들어, "동물"이라는 클래스가 있고, 이 클래스를 상속한 "고양이", "개" 클래스가 있을 때, speak()라는 메서드를 각각 다르게 구현할 수 있다.

 

 

캡슐화

객체의 상태(속성)와 행위(메서드)를 하나의 단위로 묶고, 그 내부 구현을 외부에서 숨기고 접근을 제한하는 원칙이다.

이를 통해 데이터 보호와 코드 유지보수를 용이하게 할 수 있다.

 

클래스 내부의 속성(변수)은 private로 설정한다.

외부에서 해당 속성에 접근할 수 있도록 public 메서드(getter, setter 등)를 제공하여 안전하게 데이터를 처리한다.

이를 통해 클래스의 데이터 은닉을 실현할 수 있다.

예를 들어, Account 클래스에서 계좌 잔액을 private로 설정하고, 외부에서는 getBalance() 메서드를 통해 안전하게 확인할 수 있도록한다.

class Account {
private:
    double balance;  // balance는 외부에서 직접 접근할 수 없다.
public:
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }
    double getBalance() const {
        return balance;
    }
};

 

위 코드에서 balance는 private로 설정되어 직접 접근할 수 없고, deposit()과 getBalance() 메서드를 통해서만 상태를 변경하거나 조회할 수 있다.

이렇게 외부에서는 인터페이스를 통해 객체의 상태에 접근하고, 내부의 구현은 숨겨진다.

 

 

추상화

불필요한 세부사항을 숨기고 중요한 정보만을 드러내는 원칙이다.

이를 통해 복잡한 시스템을 단순화하고, 사용자나 다른 개발자가 시스템의 중요한 부분에만 집중할 수 있게 만든다.

보통 추상 클래스와 인터페이스를 사용하여 구현한다.

 

추상화는 "무엇을 해야 하는지"는 정의하고, "어떻게 할지"는 각 구현 클래스에서 결정한다.

예를 들어, Shape라는 추상 클래스에서 draw() 메서드를 정의하고, 이를 상속받은 Circle, Rectangle 클래스에서 각기 다른 방식으로 draw() 메서드를 구현할 수 있다.

class Shape {
public:
    virtual void draw() = 0;  // 추상 메서드, 각 도형의 그리기 방식은 다를 것이다.
};

class Circle : public Shape {
public:
    void draw() override {
        // 원을 그리는 로직
    }
};

class Rectangle : public Shape {
public:
    void draw() override {
        // 직사각형을 그리는 로직
    }
};

 

여기서 Shape는 추상 클래스이고, draw()는 추상 메서드이다.

사용자는 Shape라는 추상 클래스만 알고 있으면 되고, 구체적인 구현은 각 서브클래스에서 결정된다.

해당 예제에서는 다형성 또한 구현되었다.

 

728x90
반응형

'컴퓨터 과학(CS)' 카테고리의 다른 글

네트워크 프록시  (3) 2024.10.23
네트워크 보안  (1) 2024.10.23
네트워크 HTTPS  (1) 2024.10.16
네트워크 기기  (5) 2024.10.09
네트워크 DNS  (0) 2024.10.08