Transcript 강의6

Chapter 06. friend와 static 그리고 const
Chapter 06-1. const와 관련해서 아직
못다한 이야기
const와 관련해서 아직 못다한 이야기
이 객체의 데이터 변경을 허용
하지 않겠다!
const로 선언된 객체를 대상으로는 const로 선언
되지 않는 멤버함수의 호출이 불가능하다.
3
const와 함수 오버로딩
const 객체 또는 참조자를 대상으로 멤버함수 호출
시 const 선언된 멤버함수가 호출된다!
실행결과
함수의 const 선언 유무는 함수
오버로딩의 조건이 된다!
4
Chapter 06-2. 클래스와 함수에 대한
friend 선언
클래스의 friend 선언
Girl 클래스에 대한 friend 선언!
friend 선언은 private 멤버의 접근을 허용하
Girl이 Boy의 friend로 선언되었으므
는 선언이다.
로,
friend 선언은 정보은닉에 반하는 선언이기 때문에 매우 제한적으로
선언되어야 한다.
6
private 멤버에 직접접근 가능
함수의 friend 선언
전역변수 대상의 friend 선언
이렇듯 클래스의 특정 멤버함수를 대상
으로도 friend 선언이 가능하다.
private 멤버 접근
private 멤버 접근
private 멤버 접근
7
Chapter 06-3. C++에서의 static
C언어에서 이야기한 static
실행결과
9
static 멤버변수(클래스 변수)
static 변수는 객체 별로 존재하는 변수가 아닌, 프로그램 전체 영역에
서 하나만 존재하는 변수이다.
프로그램 실행과 동시에 초기화되어 메모리 공간에 할당된다.
10
static 멤버변수의 접근방법
접근 case 2
접근 case 1
접근 case 3
static 변수가 선언된 외부에서의 접근이 가능 하려면, 해당 변수가
public으로 선언되어야 한다.
실행결과
11
static 멤버함수
static 멤버변수의 특징과 일치한
다.
static 함수는 객체 내에 존재하는 함수가 아니기 때문에 멤버변수나
멤버함수에 접근이 불가능하다.
static 함수는 static 변수에만 접근 가능하고, static 함수만 호출 가능
하다.
12
const static 멤버와 mutable
const static 멤버변수는, 클래스가 정의될 때
지정된 값이 유지되는 상수이기 때문에, 위 예
제에서 보이는 바와 같이 초기화가 가능하도록
문법으로 정의하고 있다.
mutable로 선언된 멤버변수는 const 함수 내에
서 값의 변경이 가능하다.
13
확인 문제
C6-1
 accountNumber와 balance를 데이터 멤버로 갖는 BankAccount 클
래스와 적절한 구동프로그램을 작성하시오. accountNumber는 1번
부터 자동으로 부여되게 하되 static 멤버데이터(numberOfAccounts)
를 이용하시오. 아래와 같이 객체를 구성할 경우 두 BankAccount 객
체의 accountNumber는 서로 달라지도록 하시오.
BankAccount account2(100000);
BankAccount account3(account2);
C6-2
 MyMath라는 클래스에 원주율 PI를 static 멤버로 선언하고 이를 이
용해 원의 면적을 계산하는 프로그램을 작성하시오.
14
확인 문제
C6-3 아래 프로그램의 (A) 부분에 두 객체에 각각 show를 호출하는 명령을 추가하
고 프로그램의 실행 결과를 예측하고 문제점을 지적한 후 올바르게 수정하시오.
class Number {
private:
int n;
public:
Number(int number): n(number) {
cout << "Number(" << n << ") constructted!"
<< endl;
void createObjects(int i) {
Number n(i);
Number *p = new Number(i+1);
// (A)
}
int main() {
for (int i=0; i<3; i++) {
createObjects(2*i);
cout << endl;
}
return 0;
}
~Number() {
cout << "Number(" << n << ") destructed!"
<< endl;
}
void show() {
cout << n << endl;
}
};
15
}
실습 문제
P6-1

아래와 같은 멤버변수를 갖는 Person 클래스를 작성하고 C6-3 프로그램과 같은 뼈대
의 프로그램을 작성하되 정적할당과 동적할당의 경우 모두 (메모리가 새는) 문제가 없
도록 하시오.
Name(갑) constructted!
char *name;
Name(을) constructted!
참고
int main() {
char *names[] = {"갑", "을", "병", "정", "무", "기"};
for (int i=0; i<3; i++)
createObjects(names[i], names[i+1]);
return 0;
}
갑
을
Name(을) destructed!
Name(갑) destructed!
Name(을) constructted!
Name(병) constructted!
을
병
Name(병) destructed!
Name(을) destructed!
Name(병) constructted!
Name(정) constructted!
병
정
Name(정) destructed!
Name(병) destructed!
계속하려면 아무 키나 누르십시오 . . .
16
실습 문제
P6-2

위 문제에 다음과 같은 기능을 추가하고 이 기능들이 작동함으로 보이시오.



17
Person 객체마다 고유번호(id)가 자동으로 부여되도록 하되 고유번호는 1000번부
터 오름차순으로 순차적으로 부여되도록 하며 한번 부여된 고유번호는 다시는 재
부여되지 않는다. 고유번호를 자동으로 부여할 때 static 멤버변수를 활용하시오.
Person 클래스는 현재 존재 하는 Person 객체의 수를 반환하는 static 함수
(getNumberOfPersons)를 갖는다.
Person 클래스는 지금까지 존재했거나 현재 존재하는 모든 Person 객체의 수를 반
환하는 static 함수(getNumberOfPersonsEver)를 갖는다.
Person(Name=갑, Id=1000) constructted!
Person(Name=을, Id=1001) constructted!
현재 Person 객체 수: 2
갑, 1000
을, 1001
Person(Name=을, Id=1001) destructed!
Person(Name=갑, Id=1000) destructed!
Person(Name=을, Id=1002) constructted!
Person(Name=병, Id=1003) constructted!
현재 Person 객체 수: 2
을, 1002
병, 1003
Person(Name=병, Id=1003) destructed!
Person(Name=을, Id=1002) destructed!
Person(Name=병, Id=1004) constructted!
Person(Name=정, Id=1005) constructted!
현재 Person 객체 수: 2
병, 1004
정, 1005
Person(Name=정, Id=1005) destructed!
Person(Name=병, Id=1004) destructed!
존재했던 Person 객체의 총 수: 6
계속하려면 아무 키나 누르십시오 . . .
18
실습 문제
P6-3 (객체 배열과 객체포인터 배열)
 P6-1 문제의 createObjects 함수에서 Person 객체배열과 Person 포인터배열을 만들고 여기에
각각 세 개씩의 Person 객체를 만들어 저장한 후 이들의 정보를 차례로 화면에 출력하도록 프
로그램을 작성하시오. main 함수에서 createObjects 함수 호출은 한 번만 하시오.

참고
int main() {
char *names[] = {"갑", "을", "병", "정", "무", "기"}; // 문자를 가리키는 포인터들의 배열!
createObjects(names);
cout << endl;
return 0;
}
P6-4 (this 포인터와 참조자 반환에 관한 문제)
 int 타입 멤버변수 하나를 갖는 Number 클래스에 아래와 같은 작동이 가능하도록 멤버함수
add를 추가하고 적절한 구동프로그램을 작성하시오. add 함수 반환 때 새로운 객체가 만들어
지지 않도록 하시오.
Number n(0);
n.add(1).add(2).add(3).add(4).show();
19
실습 문제
P6-5 (this 포인터와 참조자 반환에 관한 문제)

아래와 같은 작동이 가능하도록 문자열 포인터를 멤버변수로 갖는 Sentence 클래스를
작성하고 적절한 구동프로그램을 작성하시오.
Sentence sentence("내 마음 ");
cout << sentence.append("강나루 ).add("긴 언덕에 ").add("서러운 풀빛이 ").add("짙어
오것다.").getString()
20
Chapter 06가 끝났습니다.