3. 클래스의기본 객체지향프로그래밍소개 구조체와클래스 클래스의정의 Jong Hyuk Park
객체지향프로그래밍소개 Jong Hyuk Park
구조적프로그래밍개념 기존 C와같은구조적프로그래밍언어는동작되는자료와처리동작자체를서로별도로구분 처리동작과자료사이의관계가서로밀접한연관성을갖지못함 프로그램이커지거나복잡해지면프로그램이혼란스럽게되어에러를찾는디버깅및프로그램의유지보수가어려워짐 자동차, 책, 사과, 물건, 배 소유하다타다먹다읽다맛있다 3
객체 (object) 개념 (1) 객체지향프로그래밍에서는자료와이의처리동작을하나로묶어서다룰수있는객체 (object) 라는개념을도입 프로그램은처리하는절차보다도동작되는자료에중점을둔객체, 객체간의상호관계로표현 물건자동차사과책배 소유하다 타다 먹다 읽다 맛있다 4
객체 (object) 개념 (2) 물건의객체는다른객체보다상위관계를갖는객체이고이객체에서갖는성질은다른객체도공유 비슷한성질의사과, 배는서로성질을공유하는관계 물건 소유하다 자동차책사과배 타다 읽다 먹다 맛있다 5
객체지향프로그래밍 (1) 객체지향프로그래밍시각 문제의영역을단순한자료의처리흐름으로보지않음 구조적프로그래밍서로관련된자료와연산 ( 함수 ) 들이서로독립적으로정의되어취급 문제영역내에존재하는여러연관된객체들을정의하고이들객체들이서로정보를주고받는다고보는시각 ( 객체간의관계 ) 객체지향프로그래밍에서는프로그램은여러개의객체로구성 객체 (object) 는자료 ( 특성 (attribute)) 와이를대상으로처리하는동작인연산 ( 함수, 메쏘드 (method)) 을하나로묶어만든요소로프로그램을구성하는실체 객체란단순히자료를표현하는변수만을가지는것이아니라그객체가무엇을할수있는가를정의한함수 ( 메쏘드 ) 로구성 6
객체지향프로그래밍 (2) 구조적프로그래밍 자료 + 연산 ( 함수 ) = 프로그램 객체지향프로그래밍 자료 + 연산 ( 함수 ) = 객체자료연산 ( 함수 ) 객체 + 객체 = 프로그램 7
구조체와클래스 Jong Hyuk Park
구조체 구조체의유용성 관련있는데이터를하나의자료형으로그룹화 따라서, 프로그램의구현및관리가용이 함께움직이는데이터들을묶어주는효과 9
구조체와클래스 C 언어의구조체에대한불만 모든사용자정의자료형에대한불만 기본자료형으로인식해주지않는다. struct Person{ int age; char name[10]; ; int main() { int a=10; Person p; C++ 의철학과맞물리면? // C 에서는안됨 struct Person p; return 0; 10
구조체 + 함수 함수를넣으면좋은구조체 프로그램 = 데이터 + 데이터조작루틴 ( 함수 ) 잘구성된프로그램은데이터와더불어함수들도그룹화 객체지향프로그래밍기법 11
구조체 + 함수예 (1) struct Account { char accid[20]; char secid[20]; char name[20]; int balance; ; void Deposit(Account &acc, int money) { acc.balance+=money; void Withdraw(Account t &acc, int money) { acc.balance-=money; struct Account { char accid[20]; char secid[20]; char name[20]; int balance; void Deposit(int money){ balance+=money; void Withdraw(int t money){ balance-=money; ; 12
구조체 + 함수예 (2) struct Account { 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; return 0; 13
클래스 (1) 객체지향프로그래밍에서는구조체가아니라클래스 (class) 클래스 = 멤버변수 + 멤버함수 변수가아니라객체 (object) 14
데이터추상화와클래스 사물의관찰이후의데이터추상화 현실세계의사물을데이터적인측면과기능적인측면을통해서정의하는것 데이터추상화이후의클래스화 추상화된데이터를가지고사용자정의자료형을정의하는 것 15
객체생성 선언된클래스를사용하여객체를생성 클래스화이후의인스턴스화 (instantiation) 16
클래스의정의 Jong Hyuk Park
클래스멤버의접근제어 클래스의내부접근과외부접근 class Counter { public: int val; void Increment(void) { val++; ; // 내부접근 18 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; 19
클래스선언형식 C++ 언어에서클래스의정의는 C 언어의구조체 (struct) 선언과비슷 다른점은클래스의멤버로서자료뿐만아니라연산을위한함수도포함된다는점 class 클래스명 { class Test { [private:] private: 자료선언 ; 함수선언 ; int a; void inc(); public: public: 자료선언 ; char s[10]; 함수선언 ; var; [ 객체변수 ]; 클래스명객체변수, ; Test t1, t2; 20
클래스영역 (1) 클래스를정의할때 private 과 public 영역으로구분 private 은전용부분 private 영역에서정의된자료형이나함수는오직해당객체내부의멤버함수만이사용 외부에대해자료의정보가은폐 전용부분에는함부로변경되어서는안될자료와객체외부에서호출되어서는안될멤버함수를정의 디폴트 private 선엄임 (vs. stracut에서는디폴트 public 접근임 ) public 은공용부분 객체외부에서사용될수있는자료나함수가정의 클래스정의시키워드 private이생략되면 public 키워드가나올때까지의부분을전용멤버로간주 클래스영역으로는위두영역외에 protected로구분되는보호부분 ( 이후다시소개 ) 21
클래스영역 (2) 전용부분공용부분외부함수 자료 함수 자료 함수 외부함수공용부분 자료, 함수사용가능 객체외부로부터전용부분자료은폐 객체내부멤버함수의 전용부분자료사용가능 객체외부와인터페이스 22
클래스멤버함수의선언 클래스의멤버로서자료뿐만아니라함수도정의 함수의본체내용은직접클래스내부나또는클래스외부에서기술 클래스내부에서함수의본체가기술된멤버함수는모두인라인함수 (inline function) 로정의 class 클래스명 { 자료형함수명 ( 인수선언 ) { 함수본체 23
클래스사용예 (1) #include <iostream> using std::cout; using std::endl; 24 class Test { char c; public: int x; float y; void set_c(char a) { c = a; // set_c() 멤버함수정의 char get_c() { return c; // get_c() 멤버함수정의 ; int main(void) { Test o; // 클래스 Test 형의객체 o 선언 o.x = 12; o.y = 314 3.14; o.set_c('h'); // set_c() 멤버함수호출 cout << o.x << ", " << o.y << endl; cout << o.get_c() << endl; return 0; 12, 3.14 H 전용부분자료 c 의접근은클래스내부의멤버함수 set_c(), get_c() 에서만허용되고클래스외부에서는이들공용부분멤버함수의호출에의해서간접적으로접근된다.
클래스사용예 (2) #include <iostream> using std::cout; using std::endl; class Counter { int value; public: void set(int n) { value = n; void inc() { ++value; void dec() { --value; int val() { return value; ; int main(void) { Counter cnt1, cnt2; cnt1.set(10); cnt1.inc(); cout << "cnt1 value : " << cnt1.val() << endl; cnt2.set(0); cnt2.dec(); cout << "cnt2 value : " << cnt2.val() << endl; cnt1 value : 11 cnt2 value : -1 클래스 Counter를사용하여서로독립된객체cnt1, cnt2가선언되어서로독립적으로수행 25 return 0;
클래스멤버함수의외부정의 함수의본체가긴경우에클래스의멤버함수를클래스내부가아닌클래스외부에서정의하는것이편리 class 클래스명 { 자료형함수명 ( 인수선언 ); [inline] 자료형클래스명 :: 함수명 ( 인수선언 ) { 함수본체 26
클래스멤버함수의외부정의 class Door{ private: int state; public: void Open(); void Close(); void ShowState(); ; 27 void Door::Open(){ state=open; void Door::Close(){ state=close; COS void Door::ShowState(){ 생략
클래스멤버함수의외부정의 멤버함수의인 - 라인화 내부선언시 inline 화의미를지님 28 const int OPEN=1; const int CLOSE=2; class Door{ private: int state; public: void Open(){ state=open; void Close(){ state=close; void ShowState() { 생략 ; * 참고 ) In line 화는 C 에서의 #define 과같이메크로같은기능 컴파일러가최적화여부결정함 equal! class Door{ private: int state; public: void Open(); void Close(); void ShowState(); ; inline void Door::Open(){ state=open; inline void Door::Close(){ state=close; inline void Door::ShowState(){ 생략
클래스멤버함수의외부정의 헤더파일을이용한파일의분할 29
클래스사용예 (3) #include <iostream> using std::cout; using std::endl; main() { Square a; class Square { int side; public: void set(int); int area(); ; inline void Square::set(int t x) { side = x; int Square::area() { return side*side; 30 a.set(12); cout << "area : " << a.area() << endl; 출력결과
클래스사용예 (3) #include <iostream> using std::cout; using std::endl; main() { Square a; class Square { int side; public: void set(int); int area(); ; inline void Square::set(int t x) { side = x; int Square::area() { return side*side; 31 a.set(12); cout << "area : " << a.area() << endl; area : 144 클래스외부에정의되는멤버함수를확장함수로선언하고자할때에는 inline 키워드를명시해야한다.
Jong Hyuk Park