Download presentation
Presentation is loading. Please wait.
Published byKatharina Stieber Modified 6년 전
1
윤성우의 열혈 C++ 프로그래밍 Chapter C++에서의 구조체 윤성우 저 열혈강의 C++ 프로그래밍 개정판
2
C++에서의 구조체 윤성우의 열혈 C++ 프로그래밍 구조체의 등장배경
연관 있는 데이터를 하나로 묶으면 프로그램의 구현 및 관리가 용이하다. 구조체는 연관 있는 데이터를 하나로 묶는 문법적 장치이다. 구조체의 등장배경 연관 있는 데이터들은 생성 및 소멸의 시점이 일치하고, 이동 및 전달의 시점 및 방법이 일치하기 때문에 하나의 자료형으로 묶어서 관리하는 것이 용이하다.
3
C++에서의 구조체 변수 선언 윤성우의 열혈 C++ 프로그래밍
따라서 C++에서는 구조체 변수 선언시 struct 키워드의 생략을 위한 typedef 선언이 불필요하다. C 스타일 구조체 변수 초기화 C++ 스타일 구조체 변수 초기화 Car와 관련된 연관된 데이터들의 모임 Car와 관련된 연관된 함수들의 모임 데이터 뿐만 아니라, 해당 데이터와 연관된 함수들도 함께 그룹을 형성하기 때문에 함수도 하나로 묶는 것에 대해 나름의 가치를 부여할 수 있다.
4
구조체 안에 함수 삽입하기 윤성우의 열혈 C++ 프로그래밍
C++에서는 구조체 안에 함수를 삽입하는 것이 가능하다. 따라서 C++에서는 구조체가 아닌, 클래스라 한다. 함께 선언된 변수에는 직접 접근이 가능하다.
5
C++에서의 구조체 변수 선언 윤성우의 열혈 C++ 프로그래밍 변수의 생성
실제로는 구조체 변수마다 함수가 독립적으로 존재하는 구조는 아니다. 그러나 논리적으로는 독립적으로 존재하는 형태로 보아도 문제가 없으니, 위의 그림의 형태로 변수(객체)를 이해하자!
6
구조체 안에 enum 상수의 선언 윤성우의 열혈 C++ 프로그래밍 Car 클래스를 위해 정의된 상수!
이렇듯 연관 있는 상수들을 하나의 이름공간에 별도로 묶기도 한다! 이렇듯 구조체 안에 enum 선언을 둠으로써 잘못된 외부의 접근을 제한할 수 있다.
7
함수는 외부로 뺄 수 있다. 윤성우의 열혈 C++ 프로그래밍 구조체 안에 삽입된 함수의 선언!
구조체 안에 선언된 함수의 정의! 구조체 안에 정의된 함수는 inline 선언된 것으로 간주한다. 따라서 필요하다면,함수의 정의를 외부로 뺄 때에는 다음과 같이 명시적으로 inline 선언을 해야 한다.
8
Chapter 03-2. 클래스(Class)와 객체(Object)
윤성우의 열혈 C++ 프로그래밍 Chapter 클래스(Class)와 객체(Object) 윤성우 저 열혈강의 C++ 프로그래밍 개정판
9
클래스와 구조체의 유일한 차이점 윤성우의 열혈 C++ 프로그래밍
왼쪽과 같이 단순히 키워드만 class로 바꾸면 선언된 멤버의 접근이 불가능하다. 따라서 별도의 접근제어와 관련된 선언을 추가해야 한다. 키워드 struct를 대신해서 class를 사용한것이 유일한 외형적 차이점이다.
10
접근제어 지시자 윤성우의 열혈 C++ 프로그래밍 접근제어 지시자 public 어디서든 접근허용
protected 상속관계에 놓여있을 때, 유도 클래스에서의 접근허용 private 클래스 내(클래스 내에 정의된 함수)에서만 접근허용 접근제어 지시자 private! public! Car의 멤버함수는 모두 public이므로 클래스의 외부에 해당하는 main 함수에서 접근가능!
11
용어정리: 객체(Object), 멤버변수, 멤버함수
윤성우의 열혈 C++ 프로그래밍 왼쪽의 Car 클래스를 대상으로 생성된 변수를 가리켜 ‘객체’라 한다. 왼쪽의 Car 클래스 내에 선언된 변수를 가리켜 ‘멤버변수’라 한다. 왼쪽의 Car 클래스 내에 정의된 함수를 가리켜 ‘멤버함수’라 한다.
12
C++에서의 파일 분할 윤성우의 열혈 C++ 프로그래밍
클래스의 선언은 일반적으로 헤더파일에 삽입한다. 객체생성문 및 멤버의 접근문장을 컴파일하기 위해서 필요하다. 클래스의 이름을 때서 Car.h로 헤더파일의 이름정의하기도 한다. 단! 인라인 함수는 컴파일 과정에서 함수의 호출문을 대체해야 하기 때문에 헤더파일에 함께 정의되어야 한다 Car 클래스의 멤버함수의 몸체는 다른 코드의 컴파일 과정에서 필요한 게 아니다. 링크의 과정을 통해서 하나의 바이너리로 구성만 되면 된다. 따라서 cpp 파일에 정의하는 것이 일반적이다. 클래스의 이름을 따서 Car.cpp로 소스파일의 이름을 정의하기도 한다.
13
Chapter 03-3. 객체지향 프로그래밍의 이해
윤성우의 열혈 C++ 프로그래밍 Chapter 객체지향 프로그래밍의 이해 윤성우 저 열혈강의 C++ 프로그래밍 개정판
14
“나는 과일장수에게 두 개의 사과를 구매했다!”
객체지향 프로그래밍의 이해 윤성우의 열혈 C++ 프로그래밍 사전적 의미 물건 또는 대상 객체지향 프로그래밍 객체 중심의 프로그래밍 객체에 대한 간단한 정의 객체 객체 객체 “나는 과일장수에게 두 개의 사과를 구매했다!” 데이터 행위, 기능 객체지향 프로그래밍에서는 나, 과일장수, 사과라는 객체를 등장시켜서 두 개의 사과 구매라는 행위를 실체화한다. 객체지향 프로그래밍은 현실에 존재하는 사물과 대상, 그리고 그에 따른 행동을 있는 그대로 실체화 시키는 형태의 프로그래밍이다.
15
객체를 이루는 것은 데이터와 기능입니다. 윤성우의 열혈 C++ 프로그래밍 행위 상태 상태 과일장수 객체의 표현
과일장수의 데이터 표현 과일장수의 행위 표현 이제 남은 것은 데이터와 행위를 한데 묶는 것!
16
‘과일장수’의 정의와 멤버변수의 상수화 윤성우의 열혈 C++ 프로그래밍 추가 추가 초기화를 위한 추가
과일 값은 변하지 않는다고 가정할 때 APPLE_PRICE는 다음과 같이 선언하는 것이 좋다! const int APPLE_PRICE; 그러나 상수는 선언과 동시에 초기화 되어야 하기 때문에 이는 불가능하다. 물론 클래스를 정의하는 과정에서 선언과 동시에 초기화는 불가능하다. 추가 추가 초기화를 위한 추가 얼마나 파셨어요? 라는 질문과 답변을 위한 함수
17
‘나(me)’를 표현하는 클래스의 정의와 객체생성
윤성우의 열혈 C++ 프로그래밍 ‘나’의 클래스 정의 상태 행위 일반적인 변수 선언 방식의 객체생성 동적 할당 방식의 객체생성
18
사과장수 시뮬레이션 완료 윤성우의 열혈 C++ 프로그래밍 아저씨 사과 2000원어치 주세요.
아저씨 오늘 얼마나 파셨어요.. 라는 질문의 대답 너 사과 심부름 하고 나머지 잔돈이 얼마야.. 라는 질문의 대답 FruitBuyer 객체가 FruitSeller 객체의 SaleApples 함수를 호출하고 있다. 그리고 객체지향에서는 이것을 ‘두 객체가 대화하는 것’으로 본다. 따라서 이러한 형태의 함수호출을 가리켜 ‘메시지 전달’이라 한다.
19
OOP
20
C++ 언어란? (2) 객체 지향 프로그래밍 C++ 언어 오렌지를 넣는다(처리) 오렌지를 꺼낸다(처리) 한 개 꺼내 주세요!
오렌지의 개수를 센다(처리 몇 개 들어 있나요? 개 1 0 개 요! 오렌지의 개수(데이터)
21
클래스와 오브젝트 클래스의 개념 C++ 언어 구조체 구조체 변수 변수 변수 클래스 클래스 변수 변수 함수
클래스는 C언어의 구조체를 확장한 것입니다. C 언어의 구조체는 여러 타입의 변수를 하나로 묶은 것인데, 클래스는 변수뿐만 아니라 함수도 하나로 묶을 수 있습니다. C++ 언어 구조체 구조체 변수 변수 변수 클래스 클래스 변수 변수 함수
22
클래스와 오브젝트 클래스의 개념 클 래 스 변수 a 변수 b 함수 c ( ) 멤버 변수 멤버 함수
클래스에 포함되는 변수를 멤버 변수라고 하며, 함수를 멤버 함수라고 합니다. 클 래 스 멤버 변수 변수 a 변수 b 함수 c ( ) 멤버 함수
23
클래스는 ‘오브젝트의 설계도’ 같은 것입니다.
클래스와 오브젝트 오브젝트의 개념 클래스는 ‘오브젝트의 설계도’ 같은 것입니다. 클래스 변수 a 변수 b 함수 c 함수 c 클래스를 바탕으로 오브젝트를 만듭니다. 변수 b 변수 a 오브젝트
24
클래스와 멤버 함수의 정의 클래스의 정의 class OrangeBox { public :
클래스명 class OrangeBox { public : void Add(int addorangeBox) ; void Del(int delorangeBox) ; void Empty( ) ; int GetTotal( ) ; private : int total ; } ; 멤버 함수 멤버 변수 ;(세미콜론)을 잊지 마세요!
25
클래스와 멤버 함수의 정의 클래스의 정의 Orange Box
오렌지 상자 크래스는 오렌지 상자 속에 있는 오렌지의 개수를 관리하는 클래스입니다. 이때 멤버 함수를 이용하여 상자에 들어 있는 오렌지의 개수를 구할 수 있습니다. Orange Box
26
멤버 변수 total에 추가할 오렌지의 개수를 더한다
클래스와 멤버 함수의 정의 멤버 함수의 정의 void OrangeBox::Add(int addorange) { total += addorange ; } 클래스명 멤버 변수 total에 추가할 오렌지의 개수를 더한다 Orange Box Apple Box
27
오브젝트의 생성 오브젝트의 생성 OrangeBox myOrangeBox1 ; 클래스명 오브젝트명 Orange Box
28
오브젝트의 생성 복수 오브젝트의 생성 OrangeBox myOrangeBox1 ; OrangeBox myOrangeBox2 ;
29
멤버 함수의 호출 같은 오브젝트 내의 멤버 함수 호출하기 void OrangeBox::Empty( ) { total = 0 ;
} void OrangeBox::Del(int delorange) total -= delorange ; if(total < 0 ) Empty( ) ; 호출 호출
30
멤버 함수의 호출 다른 오브젝트의 멤버 함수를 호출하기 int main( ) { OrangeBox myOrangeBox ;
myOrangeBox.Empty( ) ; myOrangeBox.Add(1) ; … 클래스명 오브젝트명 오브젝트의 생성 멤버 함수의 호출 호출
31
접근 제어 ( 1 ) 접근 제한자 class OrangeBox { public :
void Add(int addorange) ; void Del(int delorange) ; void Empty( ) ; int GetTotal ; private : int total ; } ; public 멤버 private 멤버 접근 제한자 myOrangeBox
32
접근 제어 ( 1 ) public public 멤버는 다른 오브젝트의 멤버 함수와 일반 함수에서 접근할 수 있습니다.
물론 같은 오브젝트 내의 멤버 함수에서도 접근할 수 있습니다.
33
접근 제어 ( 1 ) private private 멤버에는 다른 오브젝트의 멤버 함수와 일반 함수가 접근할 수 없습니다.
같은 오브젝트 내의 멤버 함수만 접근할 수 있습니다.
34
접근 제어 ( 2 ) 접근 제한자의 기술 public이나 private는 클래스의 정의 속에서 몇 번이라도 기술할 수 있습니다. class OrangeBox { public : void Add(int addorange) ; void Del(int delorange) ; private : int total ; public : void Empty( ) ; int GetTotal( ) ; } ; public private private
35
접근 제어 ( 2 ) 접근 제한자의 생략 접근 제한자를 생략하면 모든 멤버가 private가 됩니다.
class OrangeBox { void Add(int addorange) ; void Del(int delorange) ; void Empty( ) ; int GetTotal( ) ; int total ; } ; private
36
생성자(constructor) 멤버 변수의 초기화
OrangeBox 클래스에서는 지금까지 Empty( ) 함수로 오렌지 상자를 먼저 비우고(오렌지의 개수를 0으로 하고), Add( ) 함수로 오렌지를 상자에 넣었습니다. int main( ) { OrangeBox myOrangeBox ; myOrangeBox.Empty( ) ; myOrangeBox.Add(5) ; ? return 0; } 오브젝트를 생성 ① 오렌지 상자를 비운다 ② 오렌지를 5개 넣는다
37
생성자(constructor) 멤버 변수의 초기화
그런데 Empty( ) 함수를 호출하지 않은 채 Add( ) 함수를 호출하면, 오렌지의 수를 나타내는 멤버 변수 total을 초기화하지 않은 상태에서 값을 더하게 됩니다. 그렇기 때문에 예측할 수 없는 동작을 하게 됩니다. … OrangeBox myOrangeBox ; myOrangeBox.Add(5) ; 오브젝트를 생성하고 곧바로 오렌지를 넣으면… 예측할 수 없는 동작
38
생성자(constructor) 생성자의 정의
생성자는 public으로 합니다. private로 하거나 접근 제한자를 생략하게 되면, 오브젝트 생성시에 컴파일 에러가 납니다. class OrangeBox { public : OrangeBox( ) ; … } ; OrangeBox::OrangeBox( ) { total = 0 ; } int main( ) OrangeBox myOrangeBox ; 생성자 선언 생성자는 클래스명과 같은 이름으로 합니다. 생성자 정의 멤버 변수 초기화 오브젝트 생성=생성자 호출
39
OrnageBox myOrangeBox ;
생성자(constructor) 생성자의 정의 Orange Box Orange Box ( ) OrnageBox myOrangeBox ; 호출 Orange Box ( ) myOrangeBox 생성자
40
소멸자(destructor) 소멸자란? class OrangeBox { public : OrangeBox( ) ;
… } ; OrangeBox::~OrangeBox( ) { printf("오렌지 상자 오브젝트 임무 완료₩n") ; } int main( ) OrangeBox myOrangeBox ; myOrangeBox.Add(5) ; printf("상자 속의 오렌지 : %d개₩n" , myOrangeBox.GetTotal( ) ) ; return 0; 소멸자 선언 소멸자의 이름은 클래스명에 틸드(~)를 붙여서 만듭니다 소멸자 정의 myOrnageBox
41
소멸자(destructor) 소멸자가 사용되는 곳
42
소멸자(destructor) 소멸자의 특징 소멸자는 반환값을 가지지 않으며(void형도 지정하지 않음) 인수도 없습니다.
또한 클래스 안에 하나만 정의할 수 있습니다. ~Orange Box ( ) Orange Box ( ) 소멸자 myOrangeBox
43
멤버 함수의 메리트 ( 1 ) 멤버 변수로의 접근을 제한한다 ... int main ( ) {
값을 직접 넣으려고 하면… ... int main ( ) { OrangeBox myOrangeBox ; myOrangeBox.total = 10 ; 컴파일 에러!! myOrangeBox
44
멤버 함수의 메리트 ( 1 ) 값을 체크할 수 있다 void OrangeBox::Add(int addOrange) {
total += addOrange ; if(total > 100) total = 100 ; } 100을 넘어가면 100으로 재설정한다.
45
멤버 함수의 메리트 ( 2 ) 수정이 용이하다 값을 직접 입력하는 경우 … OrangeBox myOrangeBox ;
단위 : 개수 … OrangeBox myOrangeBox ; myOrangeBox.total = 10 ; myOrangeBox.total = 30 ; myOrangeBox.total = 50 ; 변경 단위 : 그램 … OrangeBox myOrangeBox ; myOrangeBox.total = 500 ; myOrangeBox.total = 1500 ; myOrangeBox.total = 2500 ;
46
멤버 함수의 메리트 ( 2 ) 수정이 용이하다 함수를 이용하는경우 변경 단위 : 개수
void OrangBox::Add(int addOrange) { total += addOrange ; } void OrangeBox::Del(int delOrange) total -= delOrange ; 변경 단위 : 그램 void OrangBox::Add(int addOrange) { total += addOrange * 50 ; } void OrangeBox::Del(int delOrange) total -= delOrange * 50 ;
47
new 연산자 동적 오브젝트의 생성
48
OrangeBox myOrangeBox ;
new 연산자 동적 오브젝트의 생성 호출 생성자 OrangeBox의 오브젝트 호출 생성자 OrangeBox myOrangeBox ;
49
new 연산자 메모리를 확보할 때 주의할 점
50
delete 연산자 동적으로 생성한 오브젝트를 해제한다 New 연산자로 확보한 메모리는 delete 연산자로 해제합니다.
51
delete 연산자 동적으로 생성한 오브젝트를 해제한다
52
new/delete 연산자의 응용 int형 등의 메모리 영역을 확보/해제한다
53
new/delete 연산자의 응용 int형 등의 메모리 영역을 확보/해제한다
54
new/delete 연산자의 응용 배열용 메모리를 확보/해제한다
55
new/delete 연산자의 응용 배열용 메모리를 확보/해제한다
56
new/delete 연산자의 응용 오브젝트의 배열을 확보/해제한다 오브젝트의 배열을 확보/해제할 때도 방법은 동일합니다.
57
생성자의 응용 복수의 생성자
58
생성자의 응용 복수의 생성자
59
생성자의 응용 동적으로 오브젝트를 생성할 때의 인수
60
생성자의 응용 디폴트 생성자
61
복사 생성자 ( 1 ) 복사 생성자란?
62
복사 생성자 ( 1 ) 복사 생성자란?
63
복사 생성자 ( 1 ) 복사 생성자의 선언과 정의
64
복사 생성자 ( 1 ) 디폴트 복사 생성자 복사 생성자를 기술하지 않는 경우, 디폴트 복사 생성자가 준비 됩니다.
65
복사 생성자 ( 2 ) 복사 생성자를 정의해야만 하는 경우
66
복사 생성자 ( 2 ) 복사 생성자를 정의해야만 하는 경우
Similar presentations