classCar{public:voidMove(){}protected:voidDance(){}private:voidDrive(){}//멤버 변수도 동일하게 멤버 제어 지시자 사용 가능public:int _hp; int _attack;int _defence; };classSuperCar :private Car {public:intTest(){Move();Dance();}};classUltraCar :private SuperCar {public:intTest(){Move(); //에러 Dance(); //에러 }};
📝 예제 설명
SuperCar에서 Car에 대한 상속을 private으로 받아
SuperCar를 상속하는 UltraCar는 더이상 상속을 사용할 수 없음
📌 사용하는 일은 거의 없으니 알아두기만 하자!
g. 다중 상속 (인터페이스)
여러가지 문제 때문에 아래와 같이 여러개의 상속을 하지는 않음
문법적으로 오류는 X but 사용하지 않음
그대신 '인터페이스'를 이용해 다중 상속을 지원함
똑같이 class를 이용하지만 클래스 명 앞에 I를 붙이고, 가상 함수로 생성해 메소드의 오류를 방지함
이렇게 사용하게 되면나중에 이렇게 응용가능함
2. 은닉성 (data hiding)
a. 은닉성이란?
캡슐화(encapsulation) 이라고도 함
🌟 클래스를 정의할 때 데이터와 해당 데이터를 조작하는 함수(메서드)를 하나의 단위로 묶어서 외부로부터 숨기는 개념
데이터를 보호하고 클래스의 내부 구현을 감춤으로써 객체의 상태를 안전하게 유지하고 객체 간의 상호 작용을 제어하는 데 도움
ex) 자동차로 예를 들면 엔진, 전기선 등..
은닉성을 구현하는 주요 기능은 접근 제어 지시자와 Getter / Setter 메서드가 있음
a. 접근 제어 지시자 : public
공개적, 어떤 부분에서든 멤버에 접근 가능
b. 접근 제어 지시자 : private
개인적, 클래스 내부에서만 접근 가능, 외부에서 직접 접근 X
private일 경우 함수 첫글자를 소문자로 하는 경우가 있음
c. 접근 제어 지시자 : protected
클래스 내부 및 파생 클래스에서 접근 가능, 외부에서 직접 접근 X
👉 즉, public과 private의 중간. 우리 class만 이용 가능하다!!
⏳ 예제 : 접근 제어 지시자 사용
classCar{public:voidMove(){}protected:voidDance(){}private:voidDrive(){}//멤버 변수도 동일하게 멤버 제어 지시자 사용 가능public:int _hp; int _attack;int _defence; };classSuperCar :public Car {public:intTest(){Move();Dance();Drive(); //private이라 접근 X }};
d. Setter / Getter
멤버 변수와 함수 모두에 접근하고 조작할 수 있는 접근 제어 지시자와는 다르게
🌟 오로지 멤버 변수만 접근하고 조작하기 위해 public 메서드 사용
Getter : 값의 설정 / Setter : 값의 제어
🧡 멤버 변수를 직접 수정하지 않는 이유
만일 v1.hp += 10이라고 직접 수정을 하게 되면
1) 코드가 방대해 졌을 때 코드의 흐름을 알기 어렵고 2) hp값이 수정되었을 때 일어날 수 있는 이벤트를 한꺼번에 조작하기 어렵다
ex) hp값이 1000 이상일 때 일어날 수 있는 일 동시 조작
3. 다형성 (polymorphism)
a. 다형성이란?
🌟 다양한 객체가 동일한 인터페이스를 공유하면서 다른 구현을 가질 수 있는 능력
코드의 재사용성과 유지 보수성을 높이는 데 도움
프로그램의 유연성을 향상
객체 지향 프로그래밍의 핵심 원칙 중 하나인 "인터페이스에 의한 프로그래밍"을 실현하는 데 도움
다형성은 가상함수와 오버로딩 두 가지 방법으로 구현
b. 가상 함수(Virtual Functions)
🌟 기본 클래스(부모 클래스)에서 선언되고 파생 클래스(자식 클래스)에서 재정의(오버라이딩)될 수 있는 함수
가상 함수를 사용하면 기본 클래스의 포인터 또는 참조를 통해 파생 클래스의 객체에 접근할 때 실제로 호출되는 함수가 파생 클래스에 정의된 함수로 결정