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