25
10 장 장장장장 장장 4 조 조조 , 조조조 , 조조조 , 조조조 1

10 장 클래스와 객체

Embed Size (px)

DESCRIPTION

10 장 클래스와 객체. 4 조 김현 , 안정환 , 이호윤 , 장동식. 목 차. 1. 클래스 ?. 2. 객체 ?. 3. 생성자 , 소멸자 , 복사생성자 ?. 4. 발전 방향. 5. 출처. 6. Q&A. 1. 클래스 (1-1). ㆍ 사용자 정의 데이터형의 일종으로 , 데이터를 표현하는 것과 데이터를 처리하는 멤버함수를 하나의 패키지로 구성함 ㆍ C++ 언어에서 객체의 속성을 정의하는 수단으로 객체 지향 프로그래밍의 추상 - PowerPoint PPT Presentation

Citation preview

Page 1: 10 장 클래스와 객체

10 장 클래스와 객체4 조 김현 , 안정환 , 이호윤 ,장동식

1

Page 2: 10 장 클래스와 객체

목 차

1

2

4

5

클래스 ?

객체 ?

발전 방향

출처

3 생성자 , 소멸자 , 복사생성자 ?

6 Q&A

2

Page 3: 10 장 클래스와 객체

ㆍ사용자 정의 데이터형의 일종으로 , 데이터를 표현하는 것과 데이터를 처리하는 멤버함수를 하나의 패키지로 구성함

ㆍ C++ 언어에서 객체의 속성을 정의하는 수단으로 객체 지향 프로그래밍의 추상 자료형 및 자료의 은닉 개념 지원함

ㆍ객체 지향 프로그램밍은 문제의 주제 , 핵심부 분인 클래스를 중점으로 인스턴스 객체를 묘 사하는데 요구 데이터를 생각한 후 데이터 ( 객 체 ) 를 중심으로 멤버함수 작성함

1. 클래스 (1-1)

3

Page 4: 10 장 클래스와 객체

1. 클래스 (1-2)

ㆍ클래스 선언형식

class 클래스명 { [private :]

자료 선언 ;  함수 선언 ; [protected :]    자료 선언 ;    함수 선언 ; public :   자료 선언 ;    함수 선언 ;}  [ 객체 변수 ]; 클래스명 객체변수 1, 객체변수 2, ... ;

- 클래스는 C 언어 구조체 선언과 비슷함

- 다른 점은 속한 멤버가 데이터뿐만 아니라 함수까지포함

4

Page 5: 10 장 클래스와 객체

1. 클래스 (1-3)

• Private 부 public 부 protection 부로 나뉨

• private 부는 전용 부분

- 이 영역에서 정의된 함수나 데이터는 오직 해당 객체 내부의 멤버 함수만이 사용할 수 있음

- 외부에 대해 데이터를 은닉 ( 보호 ) 함

- 함부로 변경되어서는 안 될 자료와 객체 외부에서는 사용 되어서는 안 될 멤버 함수를 정의함

• public 부는 공용부분

- 주로 클래스 외부에서 사용될 수 있는 데이터나 멤버 함수를 선언함

- 이 부분에서 선언된 멤버 함수만이 은닉된 데이터를 사용할 수 있음

- 클래스 정의 시 private 키워드가 생략 public 키워드가 나올 때까지를 전용 멤버로 간주

5

Page 6: 10 장 클래스와 객체

class 클래스명 {

……

자료형 함수명 ( 인수 선언 ) { 함수 본체 }

……

}

• 클래스 멤버 함수 선언과 사용법

1. 클래스 (1-4)

- 클래스의 멤버는 자료형 뿐만 아니라 함수도 포함

- 함수의 본체 내용은 직접 클래스 내부나 또는 클래스 외부에서 정의

- 클래스 내부에서 함수의 본체가 기술된 멤버함수는 모두 확장함수 (inline function) 로 정의

• 클래스 내부에서 멤버 함수 정의

6

Page 7: 10 장 클래스와 객체

#include <iostream.h> class Circle { double Radius;public : double Circle_Area() { Radius = 5.0; return (3.14 * 5.0 * 5.0); }}; int main(){ Circle Cir1; cout << " 원의 면적은 " << Cir1.Circle_Area() << " 입니다 " << endl; return 0;}

1. 클래스 (1-5)

• 클래스 내부에서 멤버 함수 예

• 실행 결과 화면

7

Page 8: 10 장 클래스와 객체

1. 클래스 (1-6)• 클래스 외부에서 멤버 함수 정의

- 클래스 내부에서는 함수의 원형만 선언하고 클래스 외부에 함수의 본체를 기술함

- 보통 본체 내용이 길어질 경우 주로 사용

class 클래스명 {

……

자료형 함수명 ( 인수 선언 );

……

}

자료형 클래스명 :: 함수명 ( 인수 선언 )

{

함수본체

}8

Page 9: 10 장 클래스와 객체

#include <isotream.h>

class Circle{ double Radius;public : double Circle_Area();};

double Circle::Circle_Area(){ Radius = 5.0; return(3.14 * 5.0 * 5.0);}

int main(){ Circle Cir1; cout << “ 원의 면적은” << Cir1.Circle_Area() << " 입니다 " << endl; return 0;}

1. 클래스 (1-7)• 클래스 외부에서 멤버 함수 예

• 실행 결과 화면

9

Page 10: 10 장 클래스와 객체

2. 객체 (1-1)

• 클래스를 정의한 다음 객체를 선언하여 사용• 클래스만을 정의했을 때는 메모리가 할당되지 않고 객체가 클래스를 기반으로 선언되었을 때 메모리 할당이 일어남

class Login {   char id[10];   char pwd[10];public:   long number;}; Login Kim, Lee, Park;

Class Login { private 멤버

id 와 pwd 변수 public 멤버

number 변수 } Kim, Lee, Park 3 개의 객체를 선언

private

id   id   id   id

pwd   pwd   pwd   pwd

publicnumbe

number

 numbe

number

  Login   Kim   Lee   Park

[각 객체들의 구조 ]

10

Page 11: 10 장 클래스와 객체

2. 객체 (1-2)

ㆍ객체의 복사

- 같은 클래스 형으로 선언된 객체 간에는 자료의 이동이 가능

- 예를 들어 같은 클래스 형의 객체 a, b 가 있을 때 객체 b 를 객체 a 에 대입하면 객체 b 의 모든 내용이 객체 a 에 복사

11

Page 12: 10 장 클래스와 객체

2. 객체 (1-3)• 객체의 복사 예

int main(){    String str1, str2;    str1.set("The first string");    str2.set("This is the second string");    str1.prn();    str2.prn();    cout << "\n================= =========\n";   str1 = str2;  // 객체 복사   str1.prn();   str2.prn();   return 0;}

#include <iostream.h>#include <string.h>

class String {   char *str;   int len;public:   void set(char *cp);    void prn(); }; void String::set(char *cp) {    len = strlen(cp);   str = new char[len+1];    strcpy(str, cp);} void String::prn() {     cout << " 문자열 : " << str     << "(" << len << ")" << endl;}

• 실행 결과 화면

12

Page 13: 10 장 클래스와 객체

ㆍ함수에서의 객체 인수 전달

2. 객체 (1-4)

- 객체의 자료도 다른 일반 자료와 마찬가지로 함수의 인수로 전달됨

- 인수로 전달되는 객체 자료는 값에 의한 인수 전달 방 식으로 전달됨- 함수 호출 시 전달되는 실인수 값이 호출된 함수의 가인수에 복사되어 전달됨

- 호출된 함수 내에서 가인수가 변하여도 호출한 함수의 실인수에는 영향을 미치지 않음

13

Page 14: 10 장 클래스와 객체

#include <iostream.h>class XY {  int x, y;public:  void set_xy(int a, int b) { x = a, y = b; }  int get_x() { return x; }  int get_y() { return y; } }; void swap(XY ob) {   ob.set_xy(ob.get_y(), ob.get_x());   cout << "== swap() ==\n";   cout << "x = " << ob.get_x() << ", y = " << ob.get_y() << endl; }int main(){    XY ob;    ob.set_xy(10, 20);   swap(ob);     cout << "\n== Main() ==\n";    cout << "x = " << ob.get_x() << ", y = " << ob.get_y() << endl;    return 0;}

ㆍ함수에서의 객체 인수 전달 예

2. 객체 (1-5)

• 실행 결과 화면

14

Page 15: 10 장 클래스와 객체

2. 객체 (1-6)

ㆍ함수에서의 객체 반환

- 객체의 자료도 함수에서 반환 (return) 할 수 있음

- 객체를 반환하는 함수의 정의 시에는 함수의 반환형 으로 클래스의 형을 기술

15

Page 16: 10 장 클래스와 객체

2. 객체 (1-7)

ㆍ함수에서의 객체 반환 예

#include <iostream.h>#include <string.h>

class String {   char *str;   int len;public:   void set(char *cp);   void prn(); }; void String::set(char *cp) {    len = strlen(cp);    str = new char[len+1];    strcpy(str, cp); } void String::prn() { cout << " 문자열 : " << str << "(“<< len << ")\n";}

String input() {   char text[80];   String temp;   cout << "Input String : ";   cin >> text;   temp.set(text);   return temp;}

int main(){   String str1;   str1 = input();   str1.prn();   return 0;}

• 실행 결과 화면

16

Page 17: 10 장 클래스와 객체

3. 생성자 (1-1)

ㆍ멤버 변수의 초기화를 담당하는 함수를 생성자라고함

ㆍ생성자의 특징 ① 생성자 함수의 이름은 클래스 이름과 동일 ② 함수의 자료형을 지정하지 않음 ③ 함수의 호출은 명시적이지 않음 ④ 객체를 선언할 때 컴파일러에 의해 자동 호출 ⑤ 객체 초기화 == 멤버 변수 초기화

ㆍ디폴트 생성자 : 객체가 생성될 때 컴파일러에 의해 자동으로 호출되는 전달인자가 없는 생성자

17

Page 18: 10 장 클래스와 객체

3. 생성자 (1-2)

#include <iostream.h> class Circle {    int Radius; public :    Circle(int n)  {   // 생성자         cout << " 생성자 호출 ...\n";         Radius = n;      }     double Area() { return (3.14 * Radius * adius); } }; int main() {      Circle Cir(6);     cout << " 반지름이 6 인 원의 넓이는 “ << Cir.Area()<< endl;      return 0; }

ㆍ생성자 예제• 실행 결과 화면

18

Page 19: 10 장 클래스와 객체

3. 소멸자 (1-3)ㆍ객체가 선언되어 사용되는 블록이 끝날 때 자동으로 호출되는 함수

ㆍ객체가 생성될 때 동적으로 할당한 메모리가 있을 때 해제하는 코드를 소멸자 내에 작성하여 객체가 소멸할 때 같이 해제 할 때 사용

ㆍ소멸자의 특징 ① 멤버함수 ② 이름은 클래스 이름 사용 ③ 생성자 함수와 구분을 위해 ~ 를 붙임 ④ 리턴 타입을 지정하지 않음 ⑤ 함수 호출이 명시적이지 않음 ⑥ 객체 소멸 시 자동 호출 ⑦ 전달인자가 없다 ⑧ 오버로딩 불가능

ㆍ디폴트 소멸자는 아무 일도 하지 않으므로 객체가 소멸될 때 할 일이 있으면 반드시 명시적으로 기술

19

Page 20: 10 장 클래스와 객체

3. 소멸자 (1-4)

#include <iostream.h> class Point {    int xp, yp; public :    Point(int x, int y) {   //  생성자        cout << " 생성자 호출 ..\n";         xp = x, yp = y;    }    ~Point() { cout << " 소멸자 호출 ..\n"; }  // 소멸자    int get_x()  { return xp; }    int get_y()  { return yp; } }; int main() {     Point p(10, 20); // 생성자 호출     cout << "x 좌표 : " << p.get_x() << ", y 좌표 : " << p.get_y() << endl;     return 0; }

• 실행 결과 화면

• 소멸자 예제

20

Page 21: 10 장 클래스와 객체

3. 복사생성자 (1-5)

ㆍ 객체 생성시 동일한 객체를 초기값으로 할 때 자동 으로 호출되는 멤버함수

ㆍ 디폴트 생성자처럼 c++ 컴파일러에 의해 자동으로

만들어지나 사용자가 재정의하여 사용함

21

Page 22: 10 장 클래스와 객체

3. 복사생성자 (1-6)ㆍ복사생성자 예제

#include<iostream.h> #include<string.h> class Stud { private :       int No;        char Name[10]; public :     Stud();     Stud(int n, char na[]);     ~Stud();     void prn();    }; Stud::Stud() {       cout << " 생성자 1 호출 \n";     No = 0;     strcpy(Name, "nobody"); } Stud::Stud(int n, char na[])  {  cout << " 생성자 2 호출 \n";     No = n;     strcpy(Name, na); }

Stud::~Stud()  {     cout << " 소멸자 호출 \n"; } void Stud::prn()  {     cout << " 번호 : " << No << "\t“ << " 이름 : " << Name << endl ; } int main( )  {    Stud std[3]={Stud(), Stud(1101,"KimSD"), Stud(std[1]) }; // 복사생성자호출    for(int i=0; i<3; i++)        std[i].prn();    return 0; }

• 실행 결과 화면

22

Page 23: 10 장 클래스와 객체

4. 발전 방향ㆍ포인터에 대해서 공부를 하여 전 수업 시간에 이해가 가지 않았던 예제를 다시 풀어서 포인터에 이해를 조금 더 높였다 .

#include<iostream.h>#include<string.h>int main() { char *name = NULL; int i; name = new char[10]; cout << " 영문이름 입력 : "; cin >> name; for(i=0;i<=strlen(name)-1;i++) cout << " 입력한 이름은 " << name+i

cout << i <<" 번째 글짜는 " << *(name+1) << " 입니다 " << endl; delete name; return 0; }

• 실행 결과 화면

23ㆍ클래스와 객체에 대한 전반적인 설명이 부족했던거 같다 .

Page 24: 10 장 클래스와 객체

• 예제로 배우는 C++ 프로그래밍

• 윈도우즈 API(Win32 API) 전문 사이트(http://www.winapi.co.kr/)

• 1 학기 C++ 강의자료

5. 출처

24

Page 25: 10 장 클래스와 객체

Q & AQ & A

25