함수 중복 간소화
- 디폴트 매개 변수의 장점
- 중복 함수들과 디폴트 매개 변수를 가진 함수를 함께 사용 불가능함.
class Circle{
.......
public:
Circle() { radius = 1; }
Circle(int r) { radius = r; }
Circle(int r = 1) { radius = r; } //중복된 함수의 동시 사용 불가
중복 간소화 연습
함수 중복의 모호성
중복이 모호하여 컴파일러가 어떤 함수를 호출하는지 판단하지 못하는 경우
- 형 변환
- 참조 매개 변수
- 디폴트 매개 변수
static 멤버와 non-static 멤버의 특성
- static
변수와 함수에 대한 기억 부류의 한 종류
생명 주기 = 프로그램이 시작될 때 생성돼서, 종료할 때 소멸함
사용 범위 = 선언된 범위, 접근 지정에 따름
클래스의 멤버
- static 멤버
프로그램 시작 시 생성
객체가 생기기 전에 이미 존재함.
객체가 사라져도 여전히 존재함.
클래스 당 하나만 생성, 클래스 멤버라고 불림 / 객체 내부가 아닌 별도의 공간에 생성
클래스의 모든 인스턴스(객체)들이 공유하는 멤버
- non-static 멤버
객체가 생성될 때 함께 생성 -> 객체와 생명을 같이 함. 객체 소멸 시 함께 소멸.
객체마다 객체 내에 생성
인스턴스 멤버라고 불림
공유되지 않음 -> 멤버는 객체 별로 따로 공간 유지
- static 멤버 변수 생성
전역 변수로 생성
전체 프로그램 내에 한 번만 생성
static 멤버 변수에 대한 외부 선언이 없으면 다음 링크 오류
han, lee, park, choi 등 4개의 Person 객체 생성
sharedMoney와 addShared() 함수는 하나만 생성되고 4개의 객체들의 의해 공유됨
sharedMoney와 addShared() 함수는 han, lee, park, choi 객체들의 멤버임
static 멤버 사용
(1) 객체의 멤버로 접근
객체이름이나 객체 포인터로 보통 멤버처럼 접근할 수 있음.
Person lee;
lee.sharedMoney = 500; //객체.static 멤버 방식
Person *p;
p = &lee;
p->addShared(200); //객체포인터->static 멤버 방식
(2) 클래스명과 범위 지정 연산자(::)로 접근
- static 멤버는 클래스마다 오직 한 개만 생성되기 때문
클래스명::static 멤버
han.sharedMoney = 200; <-> Person::sharedMoney = 200;
lee.addShared(200); <-> Person::addShared(200);
- non-static 멤버는 클래스 이름을 접근 불가
컴파일 오류 발생
static 활용
주요 활용
- 전역 변수나 전역 함수를 클래스에 캡슐화
- 전역 변수나 전역 함수를 가능한 사용하지 않도록
- 전역 변수나 전역 함수를 static으로 선언하여 클래스 멤버로 선언
- 객체 사이에 공유 변수를 만들고자 할 때
- static 멤버를 선언하여 모든 객체들이 공유
static 멤버를 공유 목적으로 사용하는 예
#include <iostream>
using namespace std;
class Circle {
static int numOfCircles;
int radius;
public:
Circle(int r = 1); //디폴트 값 1
~Circle() { numOfCircles--; }
double getArea() { return 2.14 * radius * radius; }
static int getNumOfCircles() { return numOfCircles; }
};
Circle::Circle(int r)
{
radius = r;
numOfCircles++; //생성자 호출할 때마다 생성된 원의 개수 증가함.
}
int Circle::numOfCircles = 0;
int main()
{
Circle* p = new Circle[10]; //10개의 생성자 실행
cout << "생존하고 있는 원의 개수 = " << Circle::getNumOfCircles() << endl;
delete[] p; //10개의 소멸자 실행
cout << "생존하고 있는 원의 개수 = " << Circle::getNumOfCircles() << endl;
Circle a; //생성자 실행
cout << "생존하고 있는 원의 개수 = " << Circle::getNumOfCircles() << endl;
Circle b;
cout << "생존하고 있는 원의 개수 = " << Circle::getNumOfCircles() << endl;
}
static 멤버 함수가 접근할 수 있는 것
- static 멤버 함수
- static 멤버 변수
- 함수 내의 지역 변수
static 멤버 함수는 non-static 멤버에 접근 불가
- 객체가 생성되지 않은 시점에서 static 멤버 함수가 호출될 수 있기 때문
non-static 멤버 함수는 static에 접근 가능
class Person{
public:
double money;
static int sharedMoney;
...
int total() {
return money + sharedMoney;
}
static 멤버 함수는 this 사용 불가
static 멤버 함수는 객체가 생기기 전부터 호출 가능
상속(Inheritance)
- 클래스 사이에서 상속관계 정의
객체 사이에는 상속관계 없음
- 기본 클래스의 속성과 기능을 파생 클래스에 물려주는 것
기본 클래스(base class), 부모 클래스 - 상속해주는 클래스
파생 클래스(derived class), 자식 클래스 - 상속받는 클래스
-> 기본 클래스의 속성과 기능을 물려받고 자신만의 속성과 기능을 추가하여 작성
- 기본에서 파생으로 갈수록 클래스의 개념이 구체화.
- 다중 상속을 통한 클래스의 재활용성 높임.
상속의 목적 및 장점
1. 간결한 클래스 작성
- 기본 클래스의 기능을 물려받아 파생 클래스를 간결하게 작성
2. 클래스 간의 계층적 분류 및 관리의 용이함
- 상속은 클래스들의 구조적 관계 파악 용이
3. 클래스 재사용과 확장을 통한 소프트웨어 생산성 향상
상속 선언
Student 클래스는 Person 클래스의 멤버를 물려받음.
StudentWorker 클래스는 Student의 멤버를 물려받음.
- Student가 물려받은 Person의 멤버도 함께 물려받음.
업캐스팅(up-casting)
- 파생 클래스 포인터가 기본 클래스 포인터에 치환되는 것
다운캐스팅(down-casting)
- 기본 클래스의 포인터가 파생 클래스의 포인터에 치환되는 것
'C++' 카테고리의 다른 글
11주차 스터디 (0) | 2022.12.04 |
---|---|
10주차 스터디 (0) | 2022.11.24 |
8주차 스터디 (0) | 2022.11.13 |
껄껄껄 7주차 스터디 (0) | 2022.11.05 |
C++ 6주차 과제 2 : 캐릭터 관리 프로그램 (0) | 2022.06.28 |