240 likes | 381 Views
2010 1 학기. Struct & Class. 동서대학교 김남우. 구조체란 구조체 변수 선언 방식 구조체의 초기화 구조체 포인터 구조체 멤버의 참조 방법. 구조체란. 구조체는 기본 자료형인 int 나 char 형 등을 조합해서 만든 새로운 자료형 데이터의 관리를 간단하고 용이하게 한다. 형식. struct tag 명( optional) { . 구성 요소들의 자료형 선언; . }변수명( optional);.
E N D
2010 1학기 Struct & Class 동서대학교 김남우
구조체란 • 구조체 변수 선언 방식 • 구조체의 초기화 • 구조체 포인터 • 구조체 멤버의 참조 방법
구조체란 • 구조체는 기본 자료형인 int나 char형 등을 조합해서 만든 새로운 자료형 • 데이터의 관리를 간단하고 용이하게 한다. 형식 struct tag명(optional) { . 구성 요소들의 자료형 선언; . }변수명(optional); • struct : 구조체 형이 정의됨을 컴파일러에게 알려준다. 즉, 구조체 자료형을 정의한다. • tag명 : 선언된 구조체의 형 이름을 의미한다. • 구성 요소들의 자료 : c 언어의 기본 적인 자료형(int, char 등)을 사용하여 구조체에서 • 사용하는 변수들을 정의하고 선언된 각각의 변수를 멤버(member)라고 한다. • 변수명 : 3개의 키워드로 구조체를 정의하고 정의된 구조체를 사용하기 위하여 • 그 구조체를 대표하는 변수명을 정의하여야 한다. • 변수명을 정의해야 구조체 데이터를 저장하는 기억 공간이 할당된다.
예제 10-1 : 구조체의 선언 struct student { char name[20]; int kor; int mat; }; struct adress{ char name[20]; char addrs[40]; char tel[15]; }; tag명 구조체의 멤버 • tag명에 의해 두 구조체가 구분된다. • 두 구조체는 변수명이 할당되지 않아서 구조체를 • 저장할 수 있는 기억공간이 없다..
구조체 변수 선언 방식 • 첫번째 변수선언 방법 (main함수에서 선언) #include <stdio.h> struct student { char name[20]; int kor; int mat; }; void main( ) { int x, y; struct student grade; } 구조체의 선언 구조체에 변수grade를 할당하여 사용자에 의해 만들어진 새로운 자료형 • 기억공간 할당 형태는 다음과 같다. grade name[20]==“?” kor == ? mat == ?
하나의 구조체에 대해서 두개 이상의 구조체 변수를 선언하는 방법은 다음과 같다. 예 struct student grade1, grade2, grade3; 3개의 구조체 변수 선언 • 이에 대한 struct student 구조체의 기억공간은 아래와 같이 각각의 변수를 위하여 3개가 할당된다. grade1 name[20]==“?” kor == ? mat == ? name[20]==“?” kor == ? mat == ? grade2 grade3 name[20]==“?” kor == ? mat == ? • 즉 grade1, grade2 및 grade3 구조체 변수는 struct student라는 같은 구조체의 변수이므로 똑같은 기억공간 할당 형태를 가진다. • 같은 구조체에 n개의 구조체 변수를 선언하면 n개의 구조체 기억공간이 할당되며 각각의 기억공간은 서로 다른 변수에 의하여 구별된다.
두번째 변수선언 방법 (구조체에서 변수 할당) 예제 10-3 • 구조체를 선언함과 동시에 선언된 구조체에 변수를 할당하는 방법으로 변수 grade1 및 grade2를 저장할 수 있는 기억공간이 main함수 실행 전에 확보된다. #include <stdio.h> struct student{ char name[20]; int kor; int mat; }grade1, grade2 ; void main( ) { int x, y; . . } 구조체의 선언 구조체의 변수명 grade1 name[20]==“?” kor == ? mat == ? name[20]==“?” kor == ? mat == ? grade2
배열로 구조체 변수 선언 • 다수의 구조체 변수를 선언하는 것은 번거로우므로 배열로 선언할 수 있다. • 배열로 구조체를 선언하면 효과적으로 많은 사람의 • 데이터 관리를 처리할 수 있다. #include <stdio.h> struct student { char name[20]; int kor; int mat; } ; void main( ) { int x, y; struct student grade[10]; } • 배열로 할당된 기억 공간은 다음과 같다. grade[0] name[20]==“?” kor == ? mat == ? name[20]==“?” kor == ? mat == ? grade[1] . . . . . . grade[9] name[20]==“?” kor == ? mat == ? 10개의 구조체 변수를 배열로 선언
구조체의 초기화 • 정의된 구조체에 변수가 선언되면 모든 멤버 값을 저장할 수 있는 기억공간이 할당되 • 고 멤버에 초기화가 되지 않으면 구조체의 모든 멤버는 임의의 값을 가진다. • 구조체를 선언하면서 멤버를 초기화하는 방법을 보여준다. #include <stdio.h> struct student { char name[20]; int kor; int mat; } ; void main( ) { struct student grade1 = {“안희원”, 0,0}; struct student grade2 = {“안공원”, 0,0}; } • 구조체 변수의 초기화는 { }내에 구 • 조체의 멤버 수 만큼, 그리고 멤버의 • 선언된 자료형과 일치하는 값을 표현 • 하면 된다. • 초기화가 되며 관련된 기억 공간 할 • 당 형태는 다음과 같다. grade1 name[20]==“안희원\0” kor == 0 mat == 0 grade2 name[20]==“안공원\0” kor == 0 mat == 0 구조체의 멤버 초기화
구조체 배열의 초기화 하는 방법을 보여준다. #include <stdio.h> struct student { char name[20]; int kor; int mat; } ; void main( ) { struct student grade[10] ={ {“안희원”, 0,0}, {“안공원”, 0,0}}; } 구조체[1]의 초기화 값 구조체[2]의 초기화 값 • 구조체 배열에 대한 초기화는 구조체 배열 원소에 해당하는 구조체의 초기화 값을 ‘{ }’ • 사이에 표현한다. • 초기화 순서는 grade[0] 구조체 변수부터 차례로 대입되며 추기화 값이 없으면 이후 • 의 구조체 배열 변수는 임의의 값을 갖는다.
구조체 배열의 초기화 값이 할당된 기억 공간은 다음과 같다. name[20]==“안희원\0” kor == 0 mat == 0 grade[0] name[20]==“안공원\0” kor == 0 mat == 0 grade[1] . . . . . . name[20]==“?” kor == ? mat == ? grade[9]
구조체 포인터 • 구조체는 사용자가 필요에 의하여 작성한 자료형일 뿐 기본적인 자료형(int, char 등) • 과 똑같은 기능을 수행한다. • 그러므로 정의된 구조체에 변수를 • 선언하는 것과 마찬가지로 포인터 • 를 선언하여 구조체를 취급할 수 있 • 다. #include <stdio.h> struct student { char name[20]; int kor; int mat; } ; void main( ) { struct student st1, st2, st3[10]; struct student *sp1, *sp2, *sp3; sp1 = &st1; sp2 = &st2; sp3 = st3; } • 구조체 포인터를 이용하기 위하여 • 먼저 구조체 변수 및 포인터를 선언 • 하고 포인터를 초기화 해야 한다. 구조체의 변수 정의 포인터 변수 정의 구조체 포인터의 초기화 배열이름은 그 자체가 주소이므로 &는 불필요
구조체는 하나의 자료형으로 취급되므로 sp3+1은 구조체 st3[1] 의 주소이고, 같은 방 • 법으로 나머지 주소가 할당되며, 할당된 기억공간 할당 형태는 다음과 같다. 구조체 주소 구조체 변수 name[20]==“?” kor ==? mat == ? sp1 or st1 st1 name[20]==“?” kor == ? mat == ? sp2 or st2 st2 name[20]==“?” kor == ? mat == ? sp3 or st3 st3[0] name[20]==“?” kor == ? mat == ? sp3+1 or st3+1 st3[1] . . . . . . . . sp3+9 or st3+9 st3[9] name[20]==“?” kor == ? mat == ? sp1 == &st1 sp2 == &st2 sp3 == st3 포인터 기억공간 • 구조체 주소에서 뒤에 표현되는 주소는 구조체 변수를 이용하여 나타낸 주소이 • 고, 앞에 나타난 주소는 구조체 포인터를 선언하고 구조체 변수에 의하여 초기 • 화된 결과를 보여준다.
구조체 멤버의 참조 방법 • 구조체를 이용하여 프로그램을 작성하기 위하여 멤버에 데이터를 쓰고 읽을 수 있 • 어야 한다. 멤버의 참조 방법은 다음과 같이 두가지 방법이 있다. #include <stdio.h> struct student { char name[20]; int kor; int mat; } ; void main( ) { struct student grade; strcpy(grade.name, “kim”); grade.kor=95; grade.mat=98; } • 연산자.를 사용하는 방법 형식 구조체 변수명 . 접근하고자 하는 멤버 변수 grade name[20] == “kim\0” kor == 95 mat == 98 • c언어는 배열이름에 직접 문자열을 대입하여 배열을 초기화 하는 것은 지원하지 않기 때문에 문자배열 멤버의 초기화는 strcpy() 함수를 이용해야 한다.
연산자-> 를 사용하는 방법 #include <stdio.h> struct student { char name[20]; int kor; int mat; } ; void main( ) { struct student grade; struct student *pst=&grade; strcpy(pst->name, “kim”); pst->kor=95; pst->mat=98; } 형식 구조체 포인터 -> 접근하고자 하는 멤버 변수 • 구조체 포인터를 이용하기 위하여 먼저 구조체 변수 및 포인터를 선언하고 포인터를 초기화해야 한다. 구조체 주소 구조체 변수 pst or &grade grade name[20] == “kim\0” kor == 95 mat == 98
#include <stdio.h> #include <string.h> struct student { char name[20]; int kor; int eng; }; void main( ) { struct student lee; strcpy(lee.name, "hong gildong"); lee.kor=80; lee.eng=90; printf(”이름은 %s\n", lee.name); printf(”국어 점수는 %d\n", lee.kor); printf(”영어 점수는 %d\n", lee.eng); } 함수 strcpy()를 이용하기 위해 포함 • 구조체는 main() 함수 밖에서 구조체형 만 • 을 선언하고 선언된 구조체를 사용하고자 • 하는 위치(main 함수 내)에 변수를 할당하 • 여 사용한다. 구조체 변수 할당 • 함수 strcpy() 실행결과에 대한 기억공간 • 할당 형태는 다음과 같다. 구조체 변수 lee name[20] == “hongkildong\0” kor == 80 mat == 90 결과 이름은 hong kildong 국어 점수는 80 영어 점수는 90
클래스 class Account { public: char accID[20]; // 계좌 번호 char secID[20]; // 비밀 번호 char name[20]; // 이 름 int balance; // 잔 액 void Deposit(int money) { balance+=money; } void Withdraw(int money) { balance-=money; } }; int main(void) { Account yoon={"1234", "2321", "yoon", 1000}; yoon.Deposit(100); cout<<"잔 액 : "<<yoon.balance<<endl; yoon.Withdraw(200); cout<<"잔 액 : "<<yoon.balance<<endl; return 0; }
구조체가 아니라 클래스(Class) • 클래스 = 멤버 변수 + 멤버 함수 • 변수가 아니라객체 (Object:완전한 대상체) • 클래스를 이용해서 정의된 자료형의 변수는객체라는 표현을 쓴다. • 클래스를 기반으로 객체를 생성하는 것을“인스턴스화(instantiation)한다” 또는 “객체화한다”는 표현을 쓴다.
사물의 관찰 이후의 데이터 추상화 • 현실세계의 사물을 데이터적인 측면과 기능적인 측면을 통해서 정의하는 것 특징 1. 발이 네 개 특징 2. 코의 길이가 5미터 내외 특징 3. 몸무게는 1톤 이상 특징 4. 코를 이용해서 목욕을 함 특징 5. 코를 이용해서 물건을 집기도 함
데이터 추상화 이후의 클래스화 • 추상화된 데이터를 가지고 사용자 정의 자료형을 정의하는 것
클래스화 이후의 인스턴스화 • 클래스 기반의 객체(Object) 생성
클래스의 내부 접근과 외부 접근 class Counter { public: int val; void Increment(void) { val++; // 내부 접근 } }; int main(void) { Counter cnt; cnt.val=0; // 외부 접근 cnt.Increment(); // 외부 접근 cout<<cnt.val<<endl; // 외부 접근 return 0; }
const int OPEN=1; const int CLOSE=2; class Door{ private: int state; public: void Open(){ state=OPEN; } void Close(){ state=CLOSE; } void ShowState(){ …생략… } }; int main() { Door d; //d.state=OPEN; // 컴파일 오류 발생 d.Open(); d.ShowState(); return 0; } • private으로 멤버가 선언되면 • 클래스의 내부 접근만 허용함 • public으로 멤버가 선언되면 • 클래스의 외부 접근도허용함
멤버 함수의 외부 정의 class Door { private: int state; public: void Open(); void Close(); void ShowState(); }; void Door::Open() { state=OPEN; } void Door::Close() { state=CLOSE; } void Door::ShowState() { … 생 략 … }