1. 기초클래스와 파생클래스
- 기초 클래스 : 공통적인 멤버를 포함하는 유사한 유형의 클래스
- 파생 클래스 : 일반화와 특수화를 통한 클래스 계층구조설계
- 클래스 계층 : 트리구조(1개의 기초부터 상속), 그래프구조 (2개 이상에서 상속)
(1) 파생클래스
▷ 선언형식
(2) 기초클래스와 파생클래스 ( Person, Student )
Person class
① 사람을 나타내는 클래스, ②이름을 가지고, ③이름을 지정하거나 알릴수 있음
Student class
① 학생을 나타내는 클래스, ②사람의 이름을 상속, ③학교 이름을 지정하거나 지정된 학교이름을 알릴수 있음
(3) 파생클래스의 생성자 및 소멸자
▷ 생성자 선언형식
▷ 생성자 및 소멸자의 실행순서
생성자 : 기초클래스 생성자 → 파생클래스 생성자 (기초클래스의 내용을 바탕으로 함)
** 객체의 기초 클래스 내용이 준비된 후 파생클래스에 선언된 내용 초기화
소멸자 : 파생클래스 소멸자 → 기초클래스 소멸자
** 기초 클래스 속성이 제거되기 전에 활용할 가능성이 있는 파생클래스 객체를 먼저 제거
(4) 가시성
▷ 가시성의 적용사례
(5) 기타 클래스
▷ final 클래스 : final class로 선언되면 파생 클래스를 정의할 수 없음
** final은 키워드 아닌 식별자 (특별히 정해진 위치가 아닌경우 식별자로 사용가능, 비권장)
▷ 이름 은폐 (name hiding)
어떠한 영역에 선언된 이름을 그 영역에 내포된 영역에서 다시 선언, 내포된 영역의 바깥 영역의 이름이 은폐됨
2. 포인터
(1) 클래스 계층구조와 포인터
- 기초 클래스 포인터(참조)로 가리킬수 있는 대상 (기초 클래스는 파생클래스를 포인터 가능)
(2) 객체 포인터 배열
① Person 및 Studen class의 객체를 가리키는 포인터 저장하는 배열 선언, ②배열에 저장된 객체를 출력하는 함수, ③를 통해 출력하는 프로그램
(3) 가상함수
▷ 정적연결
▷ 동적연결
객체 포인터로 멤버함수를 호출, 포인터하는 실제 객체에 따라 실행중에 멤버함수결정
c++에서는 가상함수(virtual function)으로 동적연결을 구현
기초 클래스에서 가상함수로 선언한 멤버함수를 재정의한 파생클래스 함수는 가상함수(동적 연결)
(4)소멸자의 동적연결 (가상함수)
▷ 소멸자를 가상함수로 선언
- 기초 클래스의 포인터에 연결된 파생클래스 객체를 제거할때 파생클래스의 소멸자가 동작
- 객체에 적합한 소멸자가 작동
▷ 소멸자를 가상함수로 선언하지 않은 경우
- 기초 클래스의 포인터에 연결된 파생클래스 객체 제거시 기초 클래스 소멸자만 동작
→ 파생클래스 소멸자가 동작하지 않아 필요한 작업이 누락
(5)업캐스팅과 다운캐스팅
▷ 업캐스팅 : 파생클래스 포인터를 기초클래스 포인터로 변환, 묵시적 형변환을 통해 업캐스팅
▷ 다운캐스팅 : 기초클래스 포인터를 파생클래스 포인터로 변환, 묵시적 형변환 불가, 형변환 연산자로 명시적 형변환 필요
(6)기타
▷ 가상함수 재정의 (override)
- virtual은 파생클래스에서 새롭게 가상함수를 선언하고자 할때만 사용(기초클래스 가상함수 재정의 시 사용할 필요없음)
- 파생 클래스에서는 어떤 함수가 가상함수인지 명확하지 않아, 가상함수 재정의임을 명시적으로 표현할때는 'override'를 지정
▷ 가상함수 재정의 금지(final)
3. 추상클래스와 다중상속
(1) 추상클래스
- 유사한 성격을 갖는 클래스들의 공통요소를 뽑아만든 클래스
- 일부메서드의 구체적인 구현이 없어 직접적인 사례가 존재하지 않는 클래스
- 추상클래스로 객체를 직접 정의할수 없음 ( 파생클래스를 통해 구현)
사용목적 : 특정그룹에 속하는 클래스(파생클래스)들이 반드시 가지고 있어야할 행위를 지정(누락방지)
ex) 도형의 draw, move메서드 (도형 자체는 draw, move메서드 정의할 수 없음)
▷ 추상클래스의 선언 (멤버함수 중 순수가상함수가 포함된 클래스선언)
순수가상함수 : 구현부분이 없는 가상함수
virtual RetType functionName(fParameterList) = 0;
=> Aclass objA// Error, 추상클래스객체정의불가
(2) 상세클래스
- 클래스의 모든 요소가 구체적으로 구현되어 직접적인 사례가 존재하는 클래스
- 상세 클래스는 객체를 정의할수 있음
ex) 삼각형, 원 (추상클래스 '도형'에서 상속받은 draw, move도 구체적으로 정의)
▷ 상세클래스의 선언 (순수가상함수가 포함되지 않은 클래스선언)
- 상속받은 순수가상함수가 있다면 반드시 재정의
(3) 추상 클래스의 활용 ( 도형클래스 )
도형클래스
① 2차원 도형에 해당되는 원의 클래스, 삼각형의 클래스 선언, ②선의 색과 내부의 색 속성을 가지며, ③이러한 속성을 이용하여 그리는 방법을 설명, ④그래프 객체를 (dx, dy)만큼 이동, ⑤ 2차원 좌표원점을 기준으로 확대/축소하는 크기조정
속성객체
① 선의 색과 내부색을 표현, ② 값을 설정하고 읽어낼수 있으며, ③ 도형객체는 현재 속성에 따라 생성, ④선색 혹은 내부색 변경가능
▷ 속성 클래스 GAttribute메서드 및 속성
▷ 도형 클래스 Figure의 메서드 및 속성
▷ Circle 클래스의 메서드 및 속성
▷ Triangle 클래스의 메서드 및 속성
▷ 추상클래스의 활용
(3) 다중상속 ( 2개 이상의 기초 클래스로부터 상속)
▷ 여러 클래스에서 상속 (예)학생이면서 직장인인 클래스)
▷ 파생 클래스내에 같은 이름이 존재할 경우 모호성
- 정확한 클래스를 명시하여 오류 방지
▷ 다중상속에서 공통기초클래스의 중복상속
- 가상 기초 상속클래스로 중복 상속방지
- 다중 상속에서 공통 기초클래스를 한번만 상속(초기화필요)
'스터디 > C++' 카테고리의 다른 글
연산자 다중정의 (0) | 2023.10.17 |
---|---|
함수와 클래스 (0) | 2023.10.12 |
자료형 및 흐름제어 (2) | 2023.10.11 |