39
The C++ Programming Language 10클래스 아꿈사 스터디 이재정 소스코드: https://github.com/jjuiddong/TCPL

The c++ programming language 10장 클래스 발표

  • Upload
    -

  • View
    300

  • Download
    5

Embed Size (px)

Citation preview

Page 1: The c++ programming language 10장 클래스 발표

The C++ Programming

Language

10장 클래스아꿈사 스터디

이재정

소스코드: https://github.com/jjuiddong/TCPL

Page 2: The c++ programming language 10장 클래스 발표

클래스는 사용자 정의 타입이다.

기본제공 타입만으로는 부족하기 때문에 만들었다.

잘 만든 타입은 프로그램의 이해도와 유지보수성을 높여준다.

필요한 정보만 노출시키는 캡슐화 설계 가능

클래스

Page 3: The c++ programming language 10장 클래스 발표

class = struct멤버 접근 제외만 다름 protected

클래스가 생성될 때, 생성자 호출소멸될 때, 소멸자 호출

상수 멤버 함수 (함수 뒤에 const)

대부분 알고 있는 내용은 넘어가겠습니다.

Page 4: The c++ programming language 10장 클래스 발표

상태를 변경하고, 그 객체의 참조자를 리턴하는 것

A& operator=(A &rhs)

A a = b = c = d;a.add().add().add().add()

자기 참조

Page 5: The c++ programming language 10장 클래스 발표

const Data d1; // 논리적 상수성pd1->ChangeValue();

Data::ChangeValue() const{

Data *pd1= const_cast<Data*>(this);pd1->BlahBlahFunction(); // change value

}

물리적 상수성 과 논리적 상수성

Page 6: The c++ programming language 10장 클래스 발표

운영체제에 따라 const 변수를 읽기 전용 메모리에 넣는 경우가 있다. <- 물리적 상수성

물리적 상수성을 보장하는 곳에서 const_cast<> 변환은 결과를 예측할 수없다.

Page 7: The c++ programming language 10장 클래스 발표

물리적 상수성을 사전에 방지한다.

mutable bool value; // 논리적 상수성만 갖춰진다.

mutable

Page 8: The c++ programming language 10장 클래스 발표
Page 9: The c++ programming language 10장 클래스 발표

스트룹님의 방식클래스의 멤버 변수가 모두 public 이라면 구조체를 쓴다.

정보만 모아놓은 구조체라도 생성자를 만든다. 특정 정보만 설정하기 위함

클래스 선언

Page 10: The c++ programming language 10장 클래스 발표

class Data{ // 외부 공개용 인터페이스를 강조한다.

public:Function1();Function2();

private:int d,m,y;

}

클래스 선언

Page 11: The c++ programming language 10장 클래스 발표

클래스 선언부에 함수를 정의하면 그 함수는 인라인이 된다.

클래스내 함수 정의

Page 12: The c++ programming language 10장 클래스 발표
Page 13: The c++ programming language 10장 클래스 발표

자주 쓰이는 추상개념들은 문자, 한자, 정수, 실수 를 예로 들 수 있다.

실세계를 추상화해서 타입으로 쉽게 만들 수 있기 위해 클래스 개념을 만들었다.

사용자 정의 타입을 정의하고, 효율적으로 이용 할 수 있도록 지원하는 것, 이것은 C++이 표방하고 있는 목적이기도 하다.

추상 개념

Page 14: The c++ programming language 10장 클래스 발표

구체 클래스 (concrete type)- 실세계의 추상적인 개념을 작고 명확하

게, 그리고 효율적으로 표현하여 써먹자.- 잘 만들어진 구체 타입을 짜임새 있게 모

아 두면, 개발 시에 탄탄한 주춧돌로 사용할 수 있다.

추상 클래스 (abstract type)

클래스 종류

Page 15: The c++ programming language 10장 클래스 발표

클래스 멤버 함수에 넣기도 애매하고, 전역으로 하기는 싫은 함수들은 어떻게 할까?

namespace 에 넣자.

보조 함수

Page 16: The c++ programming language 10장 클래스 발표

class CA{

CB b;CD d;CA() : d("aa"), b("aa") { }

}

호출 순서는 CB::CB(), CD::CD() 순이다.멤버로 나열한 순서대로 호출된다. 소멸자는 그 반대

클래스 멤버로 들어있는 클래스 객체

Page 17: The c++ programming language 10장 클래스 발표
Page 18: The c++ programming language 10장 클래스 발표

- 상수 멤버- 참조자 멤버- 기본 생성자가 없는 클래스 멤버

멤버 초기화 식이 필요한 경우

Page 19: The c++ programming language 10장 클래스 발표
Page 20: The c++ programming language 10장 클래스 발표

- 생성자 호출 후 다시 대입연산을 하지 않는다.-복잡한 수식이 아닌 간단한 표현식의 경우에는 이 방식이 더 직관적이다. (개인적인 생각)

멤버 초기화식의 장점

Page 21: The c++ programming language 10장 클래스 발표

배열 갯수만큼 생성자와 소멸자가 호출된다.

배열 원소로서 만들어지는 객체

Page 22: The c++ programming language 10장 클래스 발표
Page 23: The c++ programming language 10장 클래스 발표

지역 정적 객체

지역정적 객체는 코드를 지나칠 때, 생성자가 호출된다.

Page 24: The c++ programming language 10장 클래스 발표
Page 25: The c++ programming language 10장 클래스 발표

- 소스 파일이 하나만 있을 경우 선언한 순서대로 생성자가 호출되고, 소멸자는 그 반대로 호출 된다.

- 소스 파일이 2개 이상일 때, 호출 순서는 구현별 정의 사항이다. (아무도 모른다.)

-vs2010은 워크스페이스에 등록된 파일 순서대로 생성자가 호출된다.

비지역 객체 (전역 객체)

Page 26: The c++ programming language 10장 클래스 발표
Page 27: The c++ programming language 10장 클래스 발표

라이브러리가 분할 컴파일러로 만들어 졌을 때 정적 변수로 선언한 변수는 소멸자가 호출 되는 것이 보장되지 않는다.

라이브러리 일 때의 비지역객체

Page 28: The c++ programming language 10장 클래스 발표

임시 객체는 산술 표현식에서 자주 발견 된다.

x * y + z

x * y 결과 값을 저장하는 임시 객체가 필요하다.

임시 객체

Page 29: The c++ programming language 10장 클래스 발표
Page 30: The c++ programming language 10장 클래스 발표

임시 객체 접근의 위험성

C++11 에서는 임시객체를 레퍼런스 할 수있다.

Page 31: The c++ programming language 10장 클래스 발표

흔히 placement new 라고도 한다.

생성자는 호출 되지만, delete 로 소멸자를 호출 할 수 없다. (프로그램이 죽음)

소멸자를 직접 호출해야 한다.

위치 지정에 의한 객체 생성

Page 32: The c++ programming language 10장 클래스 발표
Page 33: The c++ programming language 10장 클래스 발표

일반적으로 컴파일러에서는 공용체에서 어떤 멤버가 사용되고 있는지 알지 못한다.그래서, 생성자와 소멸자를 호출 할 수 없다.

호출해서도 안된다.

공용체 멤버로서의 객체

Page 34: The c++ programming language 10장 클래스 발표
Page 35: The c++ programming language 10장 클래스 발표

1. 개념을 클래스로 나타내자.

2. 멤버 전체가 public인 클래스는, 이 클래스가 진짜 단순한 데이터로만 쓰일 뿐이며 각 데이터 멤버에 대해 불변속성을 설정할 필요가 없을 경우에만 선언/사용할 것.

3. 구체 타입은 가장 간단한 형태의 클래스이다. 구체 타입을 쉽게 쓸 수 있다면, 복잡한 클래스와 평이한 자료구조를 사용하려거든 이것을 선호할 것. 휠씬 낫다.

4. 클래스의 내부 정보에 직접 접근해야하는 함수만 멤버로 만들 것.

바른 프로그래밍을 위한 고수의 조언

Page 36: The c++ programming language 10장 클래스 발표

5. 클래스와 그 클래스의 보조함수 사이의 명시적인 연결고리를 만드는 데는 네임스페이스가 최고.

6. 클래스 객체의 값을 바꾸지 않는 멤버 함수는 상수(const)멤버 함수로 만들자.

7. 클래스의 내부 정보에 접근해야 하지만 개개의 객체에 대해 호출할 필요는 없는 함수는 정적 멤버 함수로 만들 것.

8. 클래스의 불변속성 구축은 생성자에서 수행할 것.

9.생성자에서 자원을 획득했다면, 이 생성자가 속한 클래스에는 자원을 해제하는 소멸자가 있어야 한다.

10. 클래스에 포인터 멤버가 있는 경우에는 반드시 복사 연산을 정의해 주어야 한다.

Page 37: The c++ programming language 10장 클래스 발표

11. 클래스의 참조자 멤버에 대해서는, 경우에 따라서 복사 연산자를 정의해 주어야 한다.

12. 복사 연산 혹은 소멸자가 필요한 클래스에 대해서는, 상황에 따라 생성자, 소멸자, 복사 대입 연산자, 복사 생성자를 정의해 주어야 한다.

13. 복사 대입 연산자 안에는 반드시 자기 대입 점검 코드를 넣어두자.

14. 복사 생성자를 작성할 때는 복사되어야 하는 멤버는 반드시 빠뜨리지 않도록 주의하자.

15. 클래스에 데이터 멤버를 새로 추가할 때는 그 멤버에 해당하는 클래스에 사용자 정의 생성자가 있어서 멤버 초기화에 영향을 주는지 점검하자.

16. 클래스 선언문 안에 정수 상수를 정의해야 할 경우 나열자를 사용하자.

Page 38: The c++ programming language 10장 클래스 발표

17. 전역 및 네임스페이스 객체를 정의할 경우, 생성자 호출 순서에 따라 달라지는 사항이 있는지 점검하자.

18. 생성자 호출 순서의 의존성을 최소화하는 데는 최초사용 점검 스위치를 사용하자.

19. 잊지 말자. 임시 객체는 자신이 생성된 전체 표현식이 끝날 때 소멸된다는 것을.

Page 39: The c++ programming language 10장 클래스 발표

끝~