2024. 4. 5. 14:35ㆍProgramming 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 {
// 사각형을 그리는 코드
}
};
'Programming Language > C++' 카테고리의 다른 글
[C++] 다형성과 추상화 (+ 다운 캐스팅, RTTI) (0) | 2024.04.05 |
---|---|
[C++] 오버로딩 vs. 오버라이딩 (+ 바인딩) (0) | 2024.04.05 |
[C++] BST의 중위 후속자, 중위 선행자 및 BST의 삭제 구현 (0) | 2024.04.04 |
[C++] enum 클래스를 활용하여 BST(이진 탐색 트리) 구현 (0) | 2024.04.04 |
[C++] enum과 enum 클래스 (0) | 2024.04.04 |