[c++] 기초강좌 #04(클래스)
class 만들기 class Myclass{ // Myclass를 정의한다. int a; int b; }; Myclass my; // Myclass변수 my를 정의한다. 위의 예에서 Myclass 는 class이고 my는 Myclass형 변수가 된다. 클래스 이름은 대문자로 시작하도록 하자. ( Myclass ) a, b는 클래스의 멤버 변수라고 한다. my는 멤버 변수 a, b를 가지게 된다. 즉 my.a , my.b를 가진다.
표에서도 알 수 있듯이 구체와 클래스는 아주 비슷하다. 그러나 구조체는 단순한 자료의 집합이고 클래스는 동작(함수)을 포함한다. 구조체는 멤버가 디폴트로 공용(public)이다. 그러나 class는 디폴트로 전용(private)이다. 위의 구조체, 클래스 비교 표에서 mys. a 와 mys. b는 공용이고, myc. a 와 myc. b는 전용으로 엑세스 보호된다. 다시말하면 클래스 외부에서 멤버를 엑세스할 수 없다. 그러나 다음과 같이 하면 멤버가 공용이 되어 클래스 외부에서 접근 가능하다. class myclass{ public: // 멤버를 공용으로 지정 int a; int b; }; public 키워드 뒤에 ':'이 있음을 유의하자. private도 역시 콜론으로 마친다.
#include #include class Time{ public: // 멤버를 공용으로 사용 가능하게 함 int hours; int minutes; int seconds; }; void main(){ Time clock; clock.hours=10; clock.minutes=30; clock.seconds=25; clrscr(); cout << clock.hours << ":" << clock.minutes << ":" << clock.seconds < getch(); } 위의 예제에서 public:를 private으로 고치면 몇가지 에러 가 뜬다. 'Time::hours' is not accessible 'Time::minutes' is not accessible 'Time::seconds' is not accessible 여기서 영역지정자(::)가 나왔다. Time::hours 는 'Time의 멤버 변수 hours'라고 해석하면 된다. 즉 멤버 변수에 접근할 수 없다는 에러 메시지이다. 그렇다면 어떻게 전용변수에 접근할 수 있을까? 이 물음에 대한 해답은 다음 절에서 배울 맴버 함수에서 다룰 것이다. 아래의 예제는 어떻게 될까? 생각해보자.
#include #include class Time{ int hours; public: int minutes; int seconds; }; void main(){ Time clock; clock.hours=10; clock.minutes=30; clock.seconds=25; clrscr(); cout << clock.hours << ":" << clock.minutes << ":" << clock.seconds < getch(); } 멤버 함수(member functions)를 통해서, 프로그램의 모든 전용 데이타를 엑세스할 수 있다. 변수를 출력하고자 할 때 여러분이 그 변수를 출력하지 않아도 그 변수는 스스로 출력할 것이다. 이런 마술같은 데이터 동작은 객체의 멤버 함수를 통해 모두 수행된다. class Man { private: // 멤버 변수는 private로 지정( 생략해도 되나 넣는 것이 좋음) char *name; int age; int height; public: // 공용 멤버 함수로 멤버 변수에 접근 void getname(char *s){ name=s; } } getname()은 매개 변수 s를 받아 멤버 변수 name에 대입한다. Man man1 ; man1.getname("김철수"); 멤버 변수 name이 private이므로 접근 불가하지만 멤버 함수 getname()을 이용하여 간접적으로 접근할 수 있게 된다.
#include #include class Man{ private: char *name; int age; int height; public: void getname(){ cout << "What's your name? "; cin >> name; } void putname(){ cout << "your name is " << name << endl; } }; void main(){ Man man1; man1.getname(); man1.putname(); getch(); } 위의 예제에서 getage(), getheight(), putage(), putheight()를 추가해 보자. 다음과 같이 클래스 데이터 멤버를 초기화할 수는 없다. class Abc{ private: char a='g'; // 클래스 변수가 아직 정의되지 않았기 때문에 int b=33; // 초기화할 수 없다. float c=89.12; public: //생략 } 공용 멤버 함수 예제를 다음과 같이 할 수도 있다.
#include #include class Man{ private: char *name; int age; int height; public: void getname(); // 멤버 함수 프로토타입 void putname(); }; // 클래스 정의 끝 void Man::getname(){ // 멤버 함수 getname() 정의 부분 cout << "What's your name? "; cin >> name; } void Man::putname(){ // 멤버 함수 putname() 정의 부분 cout << "your name is " << name << endl; } void main(){ Man man1; man1.getname(); man1.putname(); getch(); } 클래스를 내부에 정의하면 클래스가 너무 길어진다. 따라서 클래스를 간결화 하기 위해 멤버 함수를 클래스 외부에 정의한다. 영역지정 연산자 (::)를 사용하여 클래스의 멤버 변수임을 밝힌다. 클래스의 효율성을 개선할 수 있게 하는 또 한가지 사항이 있다. 클래스 멤버 함수에 inline을 추가하자. inline이 함수 호출을 함수 코드 자체로 확장하는 것이라고 앞에서 배웠다. Turbo C++가 멤버 함수 코드를 성공적으로 인라인할 때 클래스 멤버 함수 실행이 보다 효율적이 된다. 아래의 예제는 위의 예제(class의 간결화)에서 inline 키워드를 추가했다. x1행과 x2행을 유심히 보기 바란다.
#include #include class Man{ private: char *name; int age; int height; public: void getname(); // 멤버 함수 프로토타입 void putname(); }; // 클래스 정의 끝 inline void Man::getname(){ // x1행 cout << "What's your name? "; cin >> name; } inline void Man::putname(){ // x2행 cout << "your name is " << name << endl; } void main(){ Man man1; man1.getname(); man1.putname(); getch(); }
this 포인프 변수란 오브젝트 자신의 시작 주소를 가리키는 포인트 변수이다. 위의 예제에서 inline void Man::getname(){ cout << "What's your name? "; cin >> name; } 는 아래의 구문과 동일하다. inline void Man::getname( ){ // x1행 cout << "What's your name? "; cin >> this->name; } |
No. | Category | Subject | Author | Date | Views |
---|---|---|---|---|---|
1005 | Develop | [c++] 기초강좌 #02(레퍼런스,메모리할당) | hooni | 2003.04.23 | 11488 |
1004 | Develop | [c++] 기초강좌 #03(함수의 매개변수 전달) | hooni | 2003.04.23 | 12143 |
» | Develop | [c++] 기초강좌 #04(클래스) | hooni | 2003.04.23 | 11876 |
1002 | Develop |
[c++] 더블 링크리스트(linked list) 학습용 초간단 단어장
![]() |
hooni | 2003.04.23 | 9375 |
1001 | Develop |
[c++] 데이터 압축 프로그램 소스 (lzw)
![]() |
hooni | 2013.04.23 | 9974 |
1000 | Develop | [c++] 디렉토리 내의 파일 찾기 FindFirstFile() 함수 6 | hooni | 2013.04.23 | 20667 |
999 | Develop |
[c++] 레지스트리 등록 예제
1 ![]() |
hooni | 2013.04.23 | 8830 |
998 | Develop |
[c++] 레지스트리 편집하는 부분..ㅡㅡ;
![]() |
hooni | 2013.04.23 | 8310 |
997 | Develop |
[c++] 링크리스트(linked list) 클래스(스택,큐)
![]() |
hooni | 2003.04.23 | 9601 |
996 | Develop |
[c++] 마방진 소스코드
![]() |
hooni | 2013.04.23 | 9570 |
995 | Develop | [c++] 문자열 뒤집기(문자열 거꾸로 출력) | hooni | 2013.04.23 | 17326 |
994 | Develop |
[c++] 바탕화면 테두리에 자석처럼 붙는 스냅효과..
![]() |
hooni | 2013.04.23 | 8938 |