28
1 6일째 객체지향 프로그래밍 객체지향 프로그램밍 (Object-Oriented Programming)

객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

1

6일째객체지향프로그래밍

객체지향 프로그램밍(Object-Oriented

Programming)

Page 2: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

2

6일째객체지향프로그래밍

C++

C : 상위계층언어특징 + 어셈블리언어특징C++ : 소프트웨어개발플랫폼에객체지향개념제공

객체지향 : 자료와 이들 자료를 어떻게 다룰것인지 따로 생각하지 않고 단지 하나의 사물로생각

변수가사용하는메모리크기

변수가가질수있는정보

변수에게가능한조작

왜새로운형을만드는가?복잡한문제를쉽게해결

popular C 객체지향(object oriented) C++

Page 3: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

3

6일째객체지향프로그래밍

클래스와멤버

클래스

변수들과연관된함수들을결합시킨새로운형

클래스를선언함으로써새로운형생성

멤버변수 (member variable, member data)클래스내의변수

멤버함수 (member function), 메소드클래스내의함수, 객체가무엇을하는지를결정

객체 (object), instance클래스에의해만들어진변수

Page 4: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

4

6일째객체지향프로그래밍

클래스의선언

클래스선언

클래스선언시메모리할당되지않음

class클래스명{

<member variable><member function>

};

class Cat{

unsigned int itsAge;unsigned int itsWeight;

void Meow( );};

Page 5: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

5

6일째객체지향프로그래밍

객체(object) 정의

객체정의

객체, 인스턴스 : 클래스를실체화한것

Cat Frisky, Tom, Garfield;

unsigned int Weight;

Page 6: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

6

6일째객체지향프로그래밍

객체 (클래스) 멤버에접근하기

. 연산자 : 객체의멤버에접근

Frisky.itsWeight = 50;Frisky.Meow( );

(O)(X)int = 5; int x;x = 5;

Cat.itsAge = 5; (X) Cat Frisky;Frisky.itsAge=5; (O)

Frisky.Bark( ); (X) Frisky.Meow( ); (O)

Page 7: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

7

6일째객체지향프로그래밍

#include <iostream>

class Cat {public:

int itsAge;int itsWeight;

};

int main(){

Cat Frisky;Frisky.itsAge = 5;std::cout << "Frisky is a cat who is " ;std::cout << Frisky.itsAge << " years old.\n";return 0;

}

list 6.1

Page 8: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

8

6일째객체지향프로그래밍

전용(Private) 과범용(Public)

범용

클래스밖에서도접근

public :

class Cat{public:

unsigned int itsAge;unsigned int itsWeight;

void Meow( );};

Cat Frisky;Frisky.itsAge=5; (O)

Page 9: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

9

6일째객체지향프로그래밍

전용(Private) 과범용(Public)(cont.)

전용

클래스안의메소드(멤버함수)에의해서만접근private :

class Cat{private:

unsigned int itsAge;unsigned int itsWeight;

void Meow( );};

Cat Frisky;Frisky.itsAge=5; (X)

Page 10: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

10

6일째객체지향프로그래밍

전용(Private) 과범용(Public)(cont.)

명시되지않으면전용이 default (기본)효력: 클래스선언끝또는다른제어 keyword

멤버변수를전용화

전용변수설정및접근 : 범용멤버함수이용

class Cat{

unsigned int itsHeight;unsigned int itsName;

public:void Fly( );unsigned int itsAge;

private:unsigned int itsWeight;void Meow( );

};

Page 11: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

11

6일째객체지향프로그래밍

class Cat{public:

unsigned int GetAge();void SetAge(unsigned int Age);

unsigned int GetWeight();void SetWeight(unsigned int Weight);

void Meow();

private:unsigned int itsAge;unsigned int itsWeight;

};

list 6.2

Page 12: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

12

6일째객체지향프로그래밍

클래스메소드구현

함수정의하듯이구현

전용 + 범용멤버자료에자유로운접근

리턴형클래스명::함수명 (매개변수리스트){

.

.

.}

Page 13: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

13

6일째객체지향프로그래밍

#include <iostream>

class Cat {public:

int GetAge(); void SetAge (int age); void Meow();

private:int itsAge;

};

int Cat::GetAge(){

return itsAge;}

void Cat::SetAge(int age){

itsAge = age;}

void Cat::Meow(){

std::cout << "Meow.\n";}

list 6.3

Page 14: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

14

6일째객체지향프로그래밍

int main(){

Cat Frisky;Frisky.SetAge(5);Frisky.Meow();std::cout << "Frisky is a cat who is " ;std::cout << Frisky.GetAge() << " years old.\n";Frisky.Meow();return 0;

}

list 6.3

Page 15: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

15

6일째객체지향프로그래밍

생성자와소멸자

생성자 (constructor)주로클래스의멤버자료(data) 초기화

클래스 그 자신과 동일한 이름을 가진 특별한멤버함수

객체(object)가만들어질때자동호출사용자가호출할수없음

반환형없음 (void 형도가져서는안됨)필요한수만큼의매개변수가짐

함수중첩(overloading) 가능접근지정자는반드시 public

int a; Cat Frisky;

int a = 5; Cat Frisky(20, 10, 4);

Page 16: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

16

6일째객체지향프로그래밍

생성자와소멸자 (cont.)

class Cat{public:

Cat( int height );Cat( int height, int weight, int age );

private:unsigned int itsHeight;unsigned int itsWeight;unsigned int itsAge;

};

Cat::Cat( int height ){itsHeight = height;

};Cat::Cat( int height, int weight, int age){

itsHeight = height;itsWeight = weight;itsAge = age;

}

Page 17: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

17

6일째객체지향프로그래밍

생성자와소멸자 (cont.)

소멸자 (destructor)객체값을소멸, 할당된메모리해제“~클래스”이름을가짐 Ex) ~Cat( )사용자가호출할수없음

반환형없음 (void 형도될수없음)매개변수없음

오버로드할수없음

접근지정자는 public

Hw) 객체생성시기와소멸자호출순서의관계

Page 18: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

18

6일째객체지향프로그래밍

생성자와소멸자 (cont.)

기본생성자

매개 변수도 없고 함수의 내용도 없는 생성자함수

사용자가 생성자 함수를 만들지 않으면기본(default) 생성자함수가있는것으로취급

Cat Frisky; Cat( ) 생성자호출

Cat Frisky(5, 7, 9); Cat( int a, int b, int c ) 생성자호출

Cat Frisky(5); Cat( int a ) 생성자호출

“함수는매개변수가없더라도괄호를필요”법칙의예외

Page 19: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

19

6일째객체지향프로그래밍

#include <iostream>

class Cat{public:

Cat(int initialAge);~Cat();int GetAge();void SetAge(int age);void Meow();

private:int itsAge;

};

// constructor of Cat,Cat::Cat(int initialAge){

itsAge = initialAge;}

// destructorCat::~Cat(){}

list 6.4

Page 20: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

20

6일째객체지향프로그래밍

int Cat::GetAge(){

return itsAge;}

void Cat::SetAge(int age){

itsAge = age;}

void Cat::Meow(){

std::cout << "Meow.\n";}

int main(){

Cat Frisky(5);Frisky.Meow();std::cout << "Frisky is a cat who is " ;std::cout << Frisky.GetAge() << " years old.\n";Frisky.Meow();Frisky.SetAge(7);std::cout << "Now Frisky is " ;std::cout << Frisky.GetAge() << " years old.\n";return 0;

}

list 6.4

Page 21: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

21

6일째객체지향프로그래밍

const 멤버함수

멤버함수를 const 선언시해당클래스의모든멤버값변경불능

const 멤버 함수를 통해 컴파일러가 오류를찾도록만듬

가능한많은멤버함수를 const로선언

class Cat{public:

void Func( ) const;

private:int itsWeight;

};

void Cat::Func( ) const{

…itsWeight = 100;…

};

(X)

Page 22: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

22

6일째객체지향프로그래밍

#include <iostream>

class Cat{public:

Cat(int initialAge);~Cat();int GetAge() const; // const functionvoid SetAge (int age);void Meow();

private:int itsAge;

};

Cat::Cat(int initialAge){

itsAge = initialAge;std::cout << "Cat Constructor\n";

}

Cat::~Cat() {

std::cout << "Cat Destructor\n";}

list 6.5

Page 23: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

23

6일째객체지향프로그래밍

int Cat::GetAge() const{

return (itsAge++);}

void Cat::SetAge(int age){

itsAge = age;}

void Cat::Meow(){

std::cout << "Meow.\n";}

int main(){

Cat Frisky; Frisky.Meow();Frisky.Bark();Frisky.itsAge = 7;return 0;

}

list 6.5

Page 24: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

24

6일째객체지향프로그래밍

클래스선언과멤버함수작성

클래스선언

클래스와사용자간의통신인터페이스

클래스의자료형 / 함수종류알림.h / .hpp파일사용

함수정의

함수의구체적동작정의

클래스제작프로그래머에게만관심

.cpp파일사용

Page 25: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

25

6일째객체지향프로그래밍

#include <iostream>

class Cat{public:

Cat (int initialAge);~Cat( );int GetAge( ) const {return itsAge;}void SetAge( ) const {itsAge = age;}void Meow( ) const {std::cout << “Meow. \n”;}private:int itsAge;

};

list 6.6

CAT.hpp

Page 26: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

26

6일째객체지향프로그래밍

#include "cat.hpp"

Cat::Cat(int initialAge) {

itsAge = initialAge;}

Cat::~Cat(){}

int main(){

Cat Frisky(5);Frisky.Meow();std::cout << "Frisky is a cat who is " ;std::cout << Frisky.GetAge() << " years old.\n";Frisky.Meow();Frisky.SetAge(7);std::cout << "Now Frisky is " ;std::cout << Frisky.GetAge() << " years old.\n";return 0;

}

list 6.7

CAT.cpp

Page 27: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

27

6일째객체지향프로그래밍

클래스메소드의 inline 구현

방법 1 : inline keyword 사용

방법 2: 정의를클래스안에포함

inline int Cat::GetWeight( ){

return itsWeight;}

class Cat{public:

int GetWeight( ) {

return itsWeight;} void SetWeight( int a );returnint itsWeight;

};

Page 28: 객체지향프로그램밍 - 아틀란티스15 6일째객체지향프로그래밍 생성자와소멸자 z생성자(constructor) 주로클래스의멤버자료(data) 초기화 클래스그자신과동일한이름을가진특별한

28

6일째객체지향프로그래밍

기타

다른클래스를멤버자료로가지는클래스

list 6.8 / list 6.9

구조체 (struct)멤버가기본적으로범용

cf) class는멤버가기본적으로전용