Upload
nissim-gallagher
View
71
Download
9
Embed Size (px)
DESCRIPTION
10 장 클래스와 객체. 4 조 김현 , 안정환 , 이호윤 , 장동식. 목 차. 1. 클래스 ?. 2. 객체 ?. 3. 생성자 , 소멸자 , 복사생성자 ?. 4. 발전 방향. 5. 출처. 6. Q&A. 1. 클래스 (1-1). ㆍ 사용자 정의 데이터형의 일종으로 , 데이터를 표현하는 것과 데이터를 처리하는 멤버함수를 하나의 패키지로 구성함 ㆍ C++ 언어에서 객체의 속성을 정의하는 수단으로 객체 지향 프로그래밍의 추상 - PowerPoint PPT Presentation
Citation preview
10 장 클래스와 객체4 조 김현 , 안정환 , 이호윤 ,장동식
1
목 차
1
2
4
5
클래스 ?
객체 ?
발전 방향
출처
3 생성자 , 소멸자 , 복사생성자 ?
6 Q&A
2
ㆍ사용자 정의 데이터형의 일종으로 , 데이터를 표현하는 것과 데이터를 처리하는 멤버함수를 하나의 패키지로 구성함
ㆍ C++ 언어에서 객체의 속성을 정의하는 수단으로 객체 지향 프로그래밍의 추상 자료형 및 자료의 은닉 개념 지원함
ㆍ객체 지향 프로그램밍은 문제의 주제 , 핵심부 분인 클래스를 중점으로 인스턴스 객체를 묘 사하는데 요구 데이터를 생각한 후 데이터 ( 객 체 ) 를 중심으로 멤버함수 작성함
1. 클래스 (1-1)
3
1. 클래스 (1-2)
ㆍ클래스 선언형식
class 클래스명 { [private :]
자료 선언 ; 함수 선언 ; [protected :] 자료 선언 ; 함수 선언 ; public : 자료 선언 ; 함수 선언 ;} [ 객체 변수 ]; 클래스명 객체변수 1, 객체변수 2, ... ;
- 클래스는 C 언어 구조체 선언과 비슷함
- 다른 점은 속한 멤버가 데이터뿐만 아니라 함수까지포함
4
1. 클래스 (1-3)
• Private 부 public 부 protection 부로 나뉨
• private 부는 전용 부분
- 이 영역에서 정의된 함수나 데이터는 오직 해당 객체 내부의 멤버 함수만이 사용할 수 있음
- 외부에 대해 데이터를 은닉 ( 보호 ) 함
- 함부로 변경되어서는 안 될 자료와 객체 외부에서는 사용 되어서는 안 될 멤버 함수를 정의함
• public 부는 공용부분
- 주로 클래스 외부에서 사용될 수 있는 데이터나 멤버 함수를 선언함
- 이 부분에서 선언된 멤버 함수만이 은닉된 데이터를 사용할 수 있음
- 클래스 정의 시 private 키워드가 생략 public 키워드가 나올 때까지를 전용 멤버로 간주
5
class 클래스명 {
……
자료형 함수명 ( 인수 선언 ) { 함수 본체 }
……
}
• 클래스 멤버 함수 선언과 사용법
1. 클래스 (1-4)
- 클래스의 멤버는 자료형 뿐만 아니라 함수도 포함
- 함수의 본체 내용은 직접 클래스 내부나 또는 클래스 외부에서 정의
- 클래스 내부에서 함수의 본체가 기술된 멤버함수는 모두 확장함수 (inline function) 로 정의
• 클래스 내부에서 멤버 함수 정의
6
#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
1. 클래스 (1-6)• 클래스 외부에서 멤버 함수 정의
- 클래스 내부에서는 함수의 원형만 선언하고 클래스 외부에 함수의 본체를 기술함
- 보통 본체 내용이 길어질 경우 주로 사용
class 클래스명 {
……
자료형 함수명 ( 인수 선언 );
……
}
자료형 클래스명 :: 함수명 ( 인수 선언 )
{
함수본체
}8
#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
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
r
number
numbe
r
number
Login Kim Lee Park
[각 객체들의 구조 ]
10
2. 객체 (1-2)
ㆍ객체의 복사
- 같은 클래스 형으로 선언된 객체 간에는 자료의 이동이 가능
- 예를 들어 같은 클래스 형의 객체 a, b 가 있을 때 객체 b 를 객체 a 에 대입하면 객체 b 의 모든 내용이 객체 a 에 복사
11
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
ㆍ함수에서의 객체 인수 전달
2. 객체 (1-4)
- 객체의 자료도 다른 일반 자료와 마찬가지로 함수의 인수로 전달됨
- 인수로 전달되는 객체 자료는 값에 의한 인수 전달 방 식으로 전달됨- 함수 호출 시 전달되는 실인수 값이 호출된 함수의 가인수에 복사되어 전달됨
- 호출된 함수 내에서 가인수가 변하여도 호출한 함수의 실인수에는 영향을 미치지 않음
13
#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
2. 객체 (1-6)
ㆍ함수에서의 객체 반환
- 객체의 자료도 함수에서 반환 (return) 할 수 있음
- 객체를 반환하는 함수의 정의 시에는 함수의 반환형 으로 클래스의 형을 기술
15
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
3. 생성자 (1-1)
ㆍ멤버 변수의 초기화를 담당하는 함수를 생성자라고함
ㆍ생성자의 특징 ① 생성자 함수의 이름은 클래스 이름과 동일 ② 함수의 자료형을 지정하지 않음 ③ 함수의 호출은 명시적이지 않음 ④ 객체를 선언할 때 컴파일러에 의해 자동 호출 ⑤ 객체 초기화 == 멤버 변수 초기화
ㆍ디폴트 생성자 : 객체가 생성될 때 컴파일러에 의해 자동으로 호출되는 전달인자가 없는 생성자
17
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
3. 소멸자 (1-3)ㆍ객체가 선언되어 사용되는 블록이 끝날 때 자동으로 호출되는 함수
ㆍ객체가 생성될 때 동적으로 할당한 메모리가 있을 때 해제하는 코드를 소멸자 내에 작성하여 객체가 소멸할 때 같이 해제 할 때 사용
ㆍ소멸자의 특징 ① 멤버함수 ② 이름은 클래스 이름 사용 ③ 생성자 함수와 구분을 위해 ~ 를 붙임 ④ 리턴 타입을 지정하지 않음 ⑤ 함수 호출이 명시적이지 않음 ⑥ 객체 소멸 시 자동 호출 ⑦ 전달인자가 없다 ⑧ 오버로딩 불가능
ㆍ디폴트 소멸자는 아무 일도 하지 않으므로 객체가 소멸될 때 할 일이 있으면 반드시 명시적으로 기술
19
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
3. 복사생성자 (1-5)
ㆍ 객체 생성시 동일한 객체를 초기값으로 할 때 자동 으로 호출되는 멤버함수
ㆍ 디폴트 생성자처럼 c++ 컴파일러에 의해 자동으로
만들어지나 사용자가 재정의하여 사용함
21
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
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ㆍ클래스와 객체에 대한 전반적인 설명이 부족했던거 같다 .
• 예제로 배우는 C++ 프로그래밍
• 윈도우즈 API(Win32 API) 전문 사이트(http://www.winapi.co.kr/)
• 1 학기 C++ 강의자료
5. 출처
24
Q & AQ & A
25