2013. 11. 23. 20:37 C언어

c++ 공부 요점정리 15








1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// =====================================================
// 30 클래스와 static
// =====================================================
//
// 보통 c에서 static을 선언 할때는
// 지역변수에 선언한다 전역으로 선언해도 되는데
// static으로 선언하면서 지역에 선언하는 이유는
// static으로 선언함으로써 전역변수의 특징을
// 가지면서 변수의 접근에 제한을 두기 위해서
//
// static 멤버의 등장
// : 전역 변수와 전역 함수를 일부 대체하기 위해서 등장
//
// static 키워드의 효과
// : 모든 객체가 공유할 수 있는 멤버
//

#include<iostream>
using std::cout;
using std::endl;

class Person
{
	char name[20];
	int age;
	
	// static 선언
	// static으로 선언함으로써
	// 모든 객체가 공유가능
	// person 클래스 위에 전역으로 선언한것과
	// 동일한 효과를 낸다
	static int count;
public:
	Person(char* _name, int _age)
	{
		strcpy(name, _name);
		age=_age;
		cout<<count++<<"번째 Person 객체 생성"<<endl;
	}
	void ShowData(){
		cout<<"이름: "<<name;
		cout<<"나이: "<<age;
	}
};

int Person::count=1; // static 멤버 초기화

int main(void)
{
	Person p1("Lee", 13);
	Person p2("Hong", 22);

	return 0;
}

// static 멤버의 특징
// : 클래스 변수, 클래스 함수라 부른다.
//   static 멤버라 부르지 않는다.
//   (객체를 생성했을 때 객체의 멤버로 존재하는게
//   아니라 클래스 내에 선언이 되어서 클래스로 
//   선언되는 모든 객채가 모두 공유하기 때문에
//   즉, 객체 단위로 사용되는게 아니라 
//   클래스 단위로 사용이 되기 때문에 
//   클래스 변수, 클래스 함수라 부른다.)
//   main 함수 호출 이전에 메모리 공간에 올라가서
//   초기화된다(전역변수와 동일)
//   선언된 클래스의 객체 내에 직접 접근 허용
//   static 멤버 초기화문으로 초기화 해야한다.
//   
class AAA
{
	int val;
	//
	// 클래스 내에서 static으로 선언함으로써
	// 
	static int n;
	public:
	// 생성자에서 static으로 선언된 변수를 
	// 초기화하면 객체가 생성될때마다 초기화가
	// 되므로 생성자 내에서 초기화 하면 안된다.
	// 그래서 static 멤버 초기화 문장을 사용해야한다
	AAA(int a = 0){
		val = a;
		n++;
	}
	void showdata(){
		...
	}
}

// static 클래스 변수는 반드시 초기화를 
// 해야하는데 다음과 같은 
// static 멤버 초기화 문장을 이용해 초기화한다
// AAA 클래스 안에 static으로 선언된 변수 n을
// 1로 초기화한다는 뜻
// 또한 객체가 생성되기 이전에 메모리 공간에
// 올라간다 따라서 생성자로 초기화 할수도 없다
//
int AAA::n = 1;

int main(void)
{
	// 만약 static int n 이 private로 선언되지않고
	// public으로 선언되었다면
	// 객체가 생성되기 이전에
	AAA::n = 1;
	// 을 해도 문제가 되지 않는다
	// static으로 선언되었기 때문에
	// 객체가 생성되기 이전에 메모리에 
	// 할당되어 있기 때문
	//
	// 이렇게 클래스 내부가 아니라 main 함수처럼
	// 외부에서 static 변수로 접근할 때는
	// 클래스의 이름을 명시하고 범위지정연산자(::)를
	// 사용해 접근해야하지만
	// 클래스 내에서는 직접접근 권한이 있기때문에
	// 단순히 n = 10; 과 같이 사용할 수 있다.
	//
	// 만약 private로 선언되면 가려지기 때문에
	// 접근제한이된다.
	
	AAA a1(10);
	a1.showdata();
	
	AAA a2(20);
	a2.showdata();
	return 0;
}










Posted by 뮹실이

최근에 달린 댓글

05-31 05:47
Yesterday
Today
Total