[C++] 객체지향 언어 특징

2024. 4. 5. 14:35Programming Language/C++

객체지향 언어 특징

1. 캡슐화(Encapsulation)

캡슐화는 은닉성을 위한 수단이며, 은닉성은 캡슐화의 목표 중 하나이다.

은닉성: 어떤 부분을 외부에 공개 처리할 것인지 말 것인지를 접근제한 지정자를 통해서 지정할 수 있다.

• 객체지향 프로그래밍에서 데이터와 그 데이터를 처리하는 함수를 하나의 단위로 묶는 것

마치 약을 캡슐에 담아 보호하듯, 객체 내부의 데이터를 외부의 간섭으로부터 보호하고, 데이터에 대한 접근을 제한하여 프로그램의 안정성을 높인다.

캡슐화 장점

• 데이터 보호: 외부에서 데이터를 직접 수정하는 것을 방지하여 예기치 않은 오류 발생 가능성을 줄인다.

• 코드 간섭 방지: 각 객체는 독립적으로 작동하므로, 다른 객체와의 의존성을 줄이고 코드의 복잡성을 낮춘다.

• 유지보수성 향상: 코드를 모듈화 하여 관리하기 쉽고, 변경이 필요한 부분을 쉽게 찾아 수정할 수 있다.

C++에서 캡슐화를 지원하는 방법

• 접근 제한자: `public`, `private`, `protected` 키워드를 사용하여 멤버 변수와 함수에 대한 접근 수준을 설정한다.

• 클래스: 클래스는 캡슐화의 기본 단위이다. 클래스 내부에 데이터와 함수를 묶어 하나의 객체로 만들 수 있다.

캡슐화와 상속

부모 클래스에서 데이터를 캡슐화하고, 자식 클래스에서 일을 상속받아 새로운 기능을 추가할 수 있다.

이는 클래스에 캡슐화를 지원해주기 때문에 가능하다.

2. 상속(Inheritance)

• 기존 클래스(부모 클래스)의 특징을 새로운 클래스(자식 클래스)에서 물려받는 것

• 코드 재사용성을 높이고, 계층적인 클래스 구조를 만들 수 있다.

상속받는 클래스의 기능을 상속받을 클래스로 가져온다.

상속받을 클래스는 부모 클래스의 기능을 기본적으로 갖고 있는 상태에서 추가적인 기능을 구현한다.

반복적인 기능을 함수로 묶어놨듯이 클래스도 반복적으로 자주 사용하는 기능을 상속시킴으로써 똑같은 기능을 또 구현할 필요 없게 한다.

• 자식 또는 부모 클래스는 상속 관계에서 다른 클래스의 멤버를 초기화할 수 없다. (값 대입이 아닌 이니셜라이저(초기화) 한정)

  ➜ 각자 자기 할 일은 자기가 하자.

• 생성자 호출 순서 : 자식 → 부모

• 생성자 실행 순서 (생성자 초기화 순서) : 부모 → 자식

상속 장점

• 코드 재사용: 부모 클래스에서 정의된 멤버 변수와 함수를 자식 클래스에서 다시 정의하지 않고 사용할 수 있다.

• 계층 구조 형성: 클래스 간의 관계를 명확하게 나타낼 수 있다.

• 확장성: 새로운 클래스를 만들 때 기존 클래스를 상속하여 기능을 확장할 수 있다.

3. 다형성(Polymorphism)

• 같은 이름의 함수나 연산자가 다른 상황에서 다르게 동작하도록 만드는 것

마치 같은 단어가 문맥에 따라 다른 의미를 가질 수 있는 것과 같다.

다형성 종류

1) 컴파일 타임 다형성

• 컴파일 시점에 함수나 연산자의 호출 방식이 결정된다.

• 대표적인 예: 함수 오버로딩, 연산자 오버로딩

2) 런타임 다형성

• 가상 함수와 상속을 이용하여 실행 시점에 호출할 함수가 결정된다.

다형성이 중요한 이유

• 코드 재사용: 여러 클래스에서 공통된 기능을 가진 함수를 하나의 갓아 함수로 정의하고, 각 클래스에서 필요에 맞게 재정의하여 코드를 재사용할 수 있다.

• 유연성: 프로그램의 구조를 변경하지 않고도 새로운 클래스를 추가하거나 기존 클래스의 기능을 확장할 수 있다.

• 코드 가독성: 코드를 더 직관적이고 이해하기 쉽게 만들 수 있다.

4. 추상화(Abstraction)

• 복잡한 시스템을 단순화하여 핵심적인 개념이나 특징만을 추출하는 과정

즉, 불필요한 세부 사항을 생략하고 중요한 부분만 모델링하는 것

▷ 일상 속 예시

• 자동차: 엔진, 변속기 등 복잡한 내부 구조보다는 운전, 주차 등의 기능에 집중한다.

• 핸드폰: 전자 회로에  대해 알 필요 없이 전화 걸기, 문자 보내기 등의 기능만 사용한다.

추상화가 중요한 이유

• 문제 해결: 복잡한 문제를 작고 관리 가능한 단위로 나누어 해결할 수 있도록 도와준다.

• 생산성 향상: 불필요한 세부 사항에 신경 쓰지 않고 문제 해결에 집중할 수 있도록 해준다.

• 코드 재사용: 추상적인 개념을 기반으로 다양한 구체적인 구현을 만들 수 있다.

다형성과 추상화의 관계

다형성과 추상화는 밀접한 관계가 있다.

추상화를 통해 공통적인 특징을 가진 객체들을 클래스로 정의하고, 이 클래스들을 상속하여 다형성을 구현할 수 있다.

즉, 추상화는 다형성을 위한 기반을 제공한다.

class Shape {
public:
    virtual void draw() = 0; // 가상 함수
};

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

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