Object Oriented Programming(C++)/전문가를 위한 C++9 전문가를 위한 C++ | Chapter 11 C++의 까다롭고 유별난 부분(상) 11.1 레퍼런스 C++에서 레퍼런스(reference)란 일종의 변수에 대한 앨리어스(alias), 즉 별칭이다. 변수에 대한 다른 이름이라 생각해도 된다. 11.1.1 레퍼런스 변수 레퍼런스 변수는 반드시 생성하자마자 초기화해야 한다. 예를 들면 다음과 같다. xRef는 x에 대한 또 다른 이름으로 xRef를 사용하는 것은 x를 사용하는 것과 같다. int x = 5; int& xRef = x; int& yRef; /* 컴파일 에러 */ 정수 리터럴처럼 이름 없는 값에 대해서는 레퍼런스를 생성할 수 없다. 단, const 값에 대해서는 레퍼런스를 생성할 수 있다. 임시 객체도 마찬가지로 non-const 레퍼런스는 만들 수 없지만, const 레퍼런스는 얼마든지 만들 수 있다. int& ref1 = .. 2022. 3. 5. 전문가를 위한 C++ | Chapter 10 상속 활용하기(하) 10.6 상속에 관련된 미묘하고 흥미로운 문제 10.6.1 오버라이드한 메서드 속성 변경하기 대부분 메서드의 구현을 번경하기 위해 메서드를 오버라이드하지만, 간혹 이 과정에서 원래 메서드의 속성을 변경할 수도 있다. ■ 10.6.1.1 메서드 리턴 타입 변경하기 오버라이드할 메서드는 부모 클래스의 메서드 프로토타입(method prototype) 혹은 메서드 선언과 똑같이 작성하는 것이 원칙이다. 하지만 C++는 부모 클래스의 리턴 타입이 다른 클래스에 대한 포인터나 레퍼런스 타입이면, 메서드를 오버라이드할 때 리턴 타입을 다른 클래스의 자식 클래스에 대한 포인터나 레퍼런스 타입으로 바꿀 수 있다. 이런 타입을 공변 리턴 타입(covariant return type)이라 부른다. 예를 들어, 사과 과수원.. 2022. 2. 10. 전문가를 위한 C++ | Chapter 10 상속 활용하기(중) 10.3 부모를 공경하라 10.3.1 부모 클래스의 생성자 C++는 객체 생성 과정을 다음과 같이 정의하고 있다. 이 규칙은 재귀적으로 적용되어 클래스에 부모 클래스가 있다면 현재 클래스보다 부모 클래스를 먼저 초기화한다. 부모 클래스라면 디폴트 생성자를 실행하거나 생성자 이니셜라이저를 호출한다. non-static 데이터 멤버를 코드에 나타난 순서대로 생성한다. 클래스 생성자의 본문을 실행한다. 부모 클래스에 디폴트 생성자가 있으면 자동으로 호출해주고 디폴트 생성자가 없거나 있더라도 다른 생성자를 사용할 때는 생성자 이니셜라이저로 생성자를 체인으로 엮을 수 있다. CAUTION 자식 클래스에서 부모 클래스의 virtual 메서드를 오버라이드하고 그 메서드를 부모 클래스 생성자에서 호출하면 안 된다. 자.. 2022. 2. 7. 전문가를 위한 C++ | Chapter 10 상속 활용하기(상) 10.1 상속을 이용한 클래스 구현 현실에 존재하는 대상은 대체로 계층 구조에 속한다. 프로그래밍을 할 때도 클래스를 수정하거나 다른 클래스를 바탕으로 새 클래스를 정의할 때 이러한 관계를 분명히 볼 수 있다. C++는 진정한 is-a 관계를 정의하는 기능을 기본으로 제공한다. 10.1.1 클래스 상속하기 C++에서 클래스를 정의할 때 컴파일러에 클래스를 상속(inherit), 파생(derive), 확장(extend)한다고 선언할 수 있다. 이때 원본 클래스를 부모 클래스(베이스 클래스(base class) 또는 슈퍼 클래스(super-class))라고 부른다. 그러면 원본 클래스를 확장한 자식 클래스(파생 클래스(derived class) 또는 서브 클래스(sub-class))는 부모 클래스와 다른 부.. 2022. 1. 30. 전문가를 위한 C++ | Chapter 07 메모리 관리(하) 7.3 로우 레벨 메모리 연산 특정 애플리케이션이나 레거시 코드에서 로우 레벨 메모리를 다뤄야 할 때가 있다. 메모리를 저수준으로 관리하는 테크닉을 알아두면 여러모로 도움이 된다. 7.3.1 포인터 연산 C++ 컴파일러는 포인터 연산을 수행할 때 포인터에 선언된 타입을 이용한다. 예를 들어 다음과 같이 int 타입의 힙 배열을 선언한 경우를 살펴보자. 포인터 연산의 강점은 myArray + 2와 같이 표현식으로 포인터를 표현하고, 이를 이용해서 더 작은 정수 배열을 표현할 수 있다는 데 있다. int* myArray = new int[8]; myArray[2] = 10; *(myArray + 2) = 10; /* 포인터 연산으로 역참조합니다. */ 다음과 같이 와이드 문자열(wide string)을 인수.. 2022. 1. 29. 전문가를 위한 C++ | Chapter 07 메모리 관리(상) 7.1 동적 메모리 다루기 메모리는 컴퓨터의 로우 레벨 구성 요소에 속하지만, 실력 있는 C++ 프로그래머가 되기 위해서는 동적 메모리를 처리하는 과정을 확실하게 이해하고 넘어가야 한다. 7.1.1 메모리 작동 과정 이 책에서는 메모리 한 칸을 레이블이 달린 상자로 표현한다. 여기서 레이블은 그 메모리를 사용하는 변수의 이름에 해당한다. 그리고 상자에 담긴 데이터는 그 변수에 현재 저장된 값이다. int i = 10; int* ptr = nullptr; ptr = new int; 예를 들어 그림 7-1 왼쪽은 다음 코드를 실행한 후의 메모리 상태를 표현한 것이다. 지역 변수 i를 자동 변수(automatic variable)라고 부르며 스택에 저장된다. 프로그램 실행 흐름이 이 변수가 선언된 유효 범위(.. 2022. 1. 20. 전문가를 위한 C++ | Chapter 09 클래스와 객체 마스터하기(하) 9.3 메서드의 종류 C++에서 제공하는 메서드의 종류는 다양하다. 이 절에서 하나씩 자세히 소개한다. 9.3.1 static 메서드 메서드도 데이터 멤버처럼 객체 단위가 아닌 클래스 단위로 적용되는 것이 있다. 이를 정적(static) 메서드라 부른다. 예를 들어 8장에서 정의한 SpreadsheetCell 클래스를 살펴보자. 여기서 stringToDouble와 doubleToString 헬퍼 메서드는 객체 정보에 접근하지 않기 때문에 다음과 같이 static으로 선언할 수 있다. /* static 메서드 */ class SpreadsheetCell { private: static std::string doubleToString(double inValue); static double stringToDo.. 2022. 1. 16. 전문가를 위한 C++ | Chapter 09 클래스와 객체 마스터하기(상) 9.1 friend C++는 클래스 안에서 다른 클래스나 다른 클래스의 멤버 함수, 그리고 멤버가 아닌 독립 함수를 friend로 선언하는 기능을 제공한다. friend로 지정된 대상은 이 클래스의 protected, private 데이터 멤버와 메서드에 접근할 수 있다. class Foo { friend class Bar; /* 클래스를 프렌드로 지정합니다. */ friend void Bar::processFroo(const Foo& foo); /* 특정한 메서드만 프렌드로 지정합니다. */ friend void dumpFoo(const Foo& foo); /* 독립 함수를 프렌드로 지정합니다. */ }; 프렌드로 지정할 클래스, 메서드, 그리고 함수는 반드시 접근하고자 하는 클래스 안에서 지정해야 한.. 2022. 1. 14. 전문가를 위한 C++ | Chapter 08 클래스와 객체 숙달하기 8.1 스프레드시트 예제 이 장과 다음 장에서는 실제로 실행할 수 있는 간단한 스프레드시트 예제를 이용하여 여러 가지 개념을 소개한다. 여기서 만들 스프레드시트는 셀(cell)이란 단위로 구성된 2차원 격자로서, 각 셀은 숫자나 스트링(string)을 담을 수 있다. 스프레드시트 예제 애플리케이션은 Spreadsheet와 SpreadsheetCell이란 기본 클래스를 사용한다. Spreadsheet 객체마다 SpreadsheetCell 객체를 가진다. 그리고 이러한 Spreadsheet를 관리하는 SpreadsheetApplication이란 클래스도 정의한다. 이 장에서는 SpreadsheetCell을 중심으로 소개한다. 8.2 클래스 작성 방법 클래스를 작성하려면 그 클래스의 모든 객체에 적용할 동작(.. 2021. 12. 30. 이전 1 다음