Contents

Develop
2003.04.23 10:48

[c++] 기초강좌 #04(클래스)

조회 수 11870 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

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를 가진다.

class와 struct의 비교

구조체

클래스

struct mystruct{

int a;

int b;

};

class myclass{

int a;

int b;

};

struct mystruct mys;

또는,

mystruct mys;

class myclass myc;

또는,

myclass myc;

필드

멤버

mys. a 와 mys. b

myc. a 와 myc. 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:

//생략

}

멤버 함수의 외부 정의

공용 멤버 함수 예제를 다음과 같이 할 수도 있다.

예제

class 간결화

#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();

}


클래스를 내부에 정의하면 클래스가 너무 길어진다. 따라서 클래스를 간결화 하기 위해 멤버 함수를 클래스 외부에 정의한다.

영역지정 연산자 (::)를 사용하여 클래스의 멤버 변수임을 밝힌다.

class에서 inline 함수 사용

클래스의 효율성을 개선할 수 있게 하는 또 한가지 사항이 있다. 클래스 멤버 함수에 inline을 추가하자. inline이 함수 호출을 함수 코드 자체로 확장하는 것이라고 앞에서 배웠다.

Turbo C++가 멤버 함수 코드를 성공적으로 인라인할 때 클래스 멤버 함수 실행이 보다 효율적이 된다.

아래의 예제는 위의 예제(class의 간결화)에서 inline 키워드를 추가했다.

x1행과 x2행을 유심히 보기 바란다.

예제

class의 인라인 사용

#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();

}


멤버 함수를 클래스 안에 직접 넣었다면 inlin을 명시할 필요는 없다. Turbo C++는 자동적으로 그 함수들을 인라인한다.

this 포인트 변수

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;

}


?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
153 Etc 이클립스(Eclipse) 유용한 단축키 ㅋㅋ hooni 2013.04.23 21842
152 Develop [doc] Json Framework 설치와 사용 file hooni 2013.04.23 21961
151 PPT [ajax] 크로스 도메인(Cross Domain) 이슈 해결 방안 file hooni 2013.04.23 21981
150 System/OS 컴파일러 수업 자료(교재 : 컴파일러 입문) file hooni 2003.04.23 22077
149 Develop [iphone] 화면 전환 Portrait & Landscape Mode hooni 2013.04.23 22361
148 System/OS [mac] 맥(OSX)에서 root 패스워드 설정하기 hooni 2013.04.23 22631
147 Develop [vb] 문자열에서 태그 제거함수 (Visual Basic) file hooni 2013.04.23 22679
146 Etc 영어공부에 도움될만한 사이트 모음 hooni 2013.05.14 22695
145 Algorithm Polynomial time 이란? ㅋㅋ hooni 2013.04.23 22797
144 Develop 밸런싱 로봇.. 최종.. (관련 논문도 첨부) ㅋㅋ file hooni 2013.04.23 22878
143 PPT [doc] 정보보호이론 강의자료 (중앙대꺼..) 2 file hooni 2013.04.23 22882
142 Develop [ios] UILabel top alignㅎㅎ hooni 2013.04.23 22894
Board Pagination Prev 1 ... 81 82 83 84 85 86 87 88 89 90 ... 98 Next
/ 98