Contents

Develop
2003.04.23 10:48

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

조회 수 12023 댓글 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
번호 분류 제목 글쓴이 날짜 조회 수
1031 Develop [jsp] Get방식, Post방식 전송 예제.. file hooni 2003.04.23 13990
1030 Develop [c++] 기초강좌 #01(입출력,영역지정) hooni 2003.04.23 11642
1029 Develop [c++] 기초강좌 #02(레퍼런스,메모리할당) hooni 2003.04.23 11656
1028 Develop [c++] 기초강좌 #03(함수의 매개변수 전달) hooni 2003.04.23 12297
» Develop [c++] 기초강좌 #04(클래스) hooni 2003.04.23 12023
1026 Develop [c] C로 구현한 CGI - 방명록 file hooni 2003.04.23 33732
1025 Develop [c] C로 구현한 CGI - 계산기 (링크리스트, 스택, 이진트리) file hooni 2003.04.23 28371
1024 Develop [c] C로 구현한 CGI - 달력과 날짜계산기 file hooni 2003.04.23 32758
1023 Develop [jsp] 유효성체크(Client, Server 에서) file hooni 2003.04.23 7621
1022 Develop [js] 키보드 아스키 코드 확인하는 간단한 소스 hooni 2003.04.23 7958
1021 Develop [js] 핫키(단축키) 구현방법 hooni 2003.04.23 7814
1020 Develop [js] 이미지 미리 로딩하기 hooni 2003.04.23 7184
Board Pagination Prev 1 ... 8 9 10 11 12 13 14 15 16 17 ... 98 Next
/ 98