1 / 24

Struct & Class

2010 1 학기. Struct & Class. 동서대학교 김남우. 구조체란 구조체 변수 선언 방식 구조체의 초기화 구조체 포인터 구조체 멤버의 참조 방법. 구조체란. 구조체는 기본 자료형인 int 나 char 형 등을 조합해서 만든 새로운 자료형 데이터의 관리를 간단하고 용이하게 한다. 형식. struct tag 명( optional) { . 구성 요소들의 자료형 선언; . }변수명( optional);.

tamera
Download Presentation

Struct & Class

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 2010 1학기 Struct & Class 동서대학교 김남우

  2. 구조체란 • 구조체 변수 선언 방식 • 구조체의 초기화 • 구조체 포인터 • 구조체 멤버의 참조 방법

  3. 구조체란 • 구조체는 기본 자료형인 int나 char형 등을 조합해서 만든 새로운 자료형 • 데이터의 관리를 간단하고 용이하게 한다. 형식 struct tag명(optional) { . 구성 요소들의 자료형 선언; . }변수명(optional); • struct : 구조체 형이 정의됨을 컴파일러에게 알려준다. 즉, 구조체 자료형을 정의한다. • tag명 : 선언된 구조체의 형 이름을 의미한다. • 구성 요소들의 자료 : c 언어의 기본 적인 자료형(int, char 등)을 사용하여 구조체에서 • 사용하는 변수들을 정의하고 선언된 각각의 변수를 멤버(member)라고 한다. • 변수명 : 3개의 키워드로 구조체를 정의하고 정의된 구조체를 사용하기 위하여 • 그 구조체를 대표하는 변수명을 정의하여야 한다. • 변수명을 정의해야 구조체 데이터를 저장하는 기억 공간이 할당된다.

  4. 예제 10-1 : 구조체의 선언 struct student { char name[20]; int kor; int mat; }; struct adress{ char name[20]; char addrs[40]; char tel[15]; }; tag명 구조체의 멤버 • tag명에 의해 두 구조체가 구분된다. • 두 구조체는 변수명이 할당되지 않아서 구조체를 • 저장할 수 있는 기억공간이 없다..

  5. 구조체 변수 선언 방식 • 첫번째 변수선언 방법 (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 == ?

  6. 하나의 구조체에 대해서 두개 이상의 구조체 변수를 선언하는 방법은 다음과 같다. 예 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개의 구조체 기억공간이 할당되며 각각의 기억공간은 서로 다른 변수에 의하여 구별된다.

  7. 두번째 변수선언 방법 (구조체에서 변수 할당) 예제 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

  8. 배열로 구조체 변수 선언 • 다수의 구조체 변수를 선언하는 것은 번거로우므로 배열로 선언할 수 있다. • 배열로 구조체를 선언하면 효과적으로 많은 사람의 • 데이터 관리를 처리할 수 있다. #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개의 구조체 변수를 배열로 선언

  9. 구조체의 초기화 • 정의된 구조체에 변수가 선언되면 모든 멤버 값을 저장할 수 있는 기억공간이 할당되 • 고 멤버에 초기화가 되지 않으면 구조체의 모든 멤버는 임의의 값을 가진다. • 구조체를 선언하면서 멤버를 초기화하는 방법을 보여준다. #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 구조체의 멤버 초기화

  10. 구조체 배열의 초기화 하는 방법을 보여준다. #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] 구조체 변수부터 차례로 대입되며 추기화 값이 없으면 이후 • 의 구조체 배열 변수는 임의의 값을 갖는다.

  11. 구조체 배열의 초기화 값이 할당된 기억 공간은 다음과 같다. name[20]==“안희원\0” kor == 0 mat == 0 grade[0] name[20]==“안공원\0” kor == 0 mat == 0 grade[1] . . . . . . name[20]==“?” kor == ? mat == ? grade[9]

  12. 구조체 포인터 • 구조체는 사용자가 필요에 의하여 작성한 자료형일 뿐 기본적인 자료형(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; } • 구조체 포인터를 이용하기 위하여 • 먼저 구조체 변수 및 포인터를 선언 • 하고 포인터를 초기화 해야 한다. 구조체의 변수 정의 포인터 변수 정의 구조체 포인터의 초기화 배열이름은 그 자체가 주소이므로 &는 불필요

  13. 구조체는 하나의 자료형으로 취급되므로 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 포인터 기억공간 • 구조체 주소에서 뒤에 표현되는 주소는 구조체 변수를 이용하여 나타낸 주소이 • 고, 앞에 나타난 주소는 구조체 포인터를 선언하고 구조체 변수에 의하여 초기 • 화된 결과를 보여준다.

  14. 구조체 멤버의 참조 방법 • 구조체를 이용하여 프로그램을 작성하기 위하여 멤버에 데이터를 쓰고 읽을 수 있 • 어야 한다. 멤버의 참조 방법은 다음과 같이 두가지 방법이 있다. #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() 함수를 이용해야 한다.

  15. 연산자-> 를 사용하는 방법 #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

  16. #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

  17. 클래스 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; }

  18. 구조체가 아니라 클래스(Class) • 클래스 = 멤버 변수 + 멤버 함수 • 변수가 아니라객체 (Object:완전한 대상체) • 클래스를 이용해서 정의된 자료형의 변수는객체라는 표현을 쓴다. • 클래스를 기반으로 객체를 생성하는 것을“인스턴스화(instantiation)한다” 또는 “객체화한다”는 표현을 쓴다.

  19. 사물의 관찰 이후의 데이터 추상화 • 현실세계의 사물을 데이터적인 측면과 기능적인 측면을 통해서 정의하는 것 특징 1. 발이 네 개 특징 2. 코의 길이가 5미터 내외 특징 3. 몸무게는 1톤 이상 특징 4. 코를 이용해서 목욕을 함 특징 5. 코를 이용해서 물건을 집기도 함

  20. 데이터 추상화 이후의 클래스화 • 추상화된 데이터를 가지고 사용자 정의 자료형을 정의하는 것

  21. 클래스화 이후의 인스턴스화 • 클래스 기반의 객체(Object) 생성

  22. 클래스의 내부 접근과 외부 접근 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; }

  23. 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으로 멤버가 선언되면 • 클래스의 외부 접근도허용함

  24. 멤버 함수의 외부 정의 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() { … 생 략 … }

More Related