전체 글보기

    [C++ 8.3.1-1] 객체 생성과 생성자

    객체 생성 스택(에 생성되는) 객체는 선언하는 시점에 생성되고, 스마트 포인터나 new, new[]를 사용할 때는 직접 공간을 할당해야 한다. 예를 들면 다음과 같다. #include class MyClass { private: std::string mName; }; int main() { MyClass obj; return 0; } MyClass 안에 있는 string 객체(mName)는 main() 함수에서 MyClass 객체가 생성될 때 함께 생성되고, MyClass 객체가 소멸될 때 함께 소멸된다. 그래서 변수를 선언할 때 초깃값을 설정하는 것이 좋다. 예를 들면 다음과 같다. int x = 0; 이 작업은 생성자라 부르는 특수한 메서드에 객체를 초기화하는 코드를 작성하는 방식으로 처리할 수 있다..

    [C++ 8.2.3] 객체 사용법

    [C++ 8.2.3] 객체 사용법

    클래스 객체 사용법 앞에서 SpreadsheetCell을 정의할 때 데이터 멤버 하나, public 메서드 네 개, private 메서드 두 개를 작성했다. 그런데 이렇게 클래스를 정의한다고 해서 곧바로 SpreadsheetCell 객체가 생성되는 것은 아니다. 단지 형태와 동작만 표현한 것이다. SpreadsheetCell 객체를 생성하려면 SpreadsheetCell 타입의 변수를 따로 선언해야 한다. SpreadsheetCell 클래스 하나로 SpreadsheetCell 객체를 여러 개 만들 수 있다. 객체를 생성해서 사용하는 방법은 크게 두 가지가 있다. 하나는 스택에 생성하는 것이고 다른 하나는 힙에 생성하는 것이다. 1. 스택에 생성한 객체 SpreadsheetCell 객체를 스택에 생성해서 ..

    [C++ 8.2.2-2] this 포인터

    this 포인터 일반 메서드를 호출하면 항상 메서드가 속한 객체의 포인터인 this가 숨겨진 매개변수 형태로 전달된다. this 포인터로 해당 객체의 데이터 멤버나 메서드에 접근할 수 있으며, 다른 메서드나 함수에 매개변수로 전달할 수도 있다. 떄로는 이름을 명확히 구분하는 용도로도 사용된다. 예를 들어 SpreadsheetCell 클레스에 mValue가 아닌 value란 이름으로 데이터 멤버를 만들고, 이 값을 설정하는 setValue() 메서드가 받는 매개변수 이름도 inValue가 아닌 value라고 정했다고 하자. 그러면 코드는 다음과 같다. void SpreadsheetCell::setValue(double value) { value = value; // 모호한 문장 } 이렇게 작성하면 valu..

    [C++ 8.2.2-1] 메서드 정의 방법

    메서드 정의 방법 앞서 정의한 SpreadsheetCell 클래스만으로도 이 클래스의 객체를 충분히 생성할 수 있다. 하지만 setValue()나 getValue() 메서드를 호출하면 이 메서드가 정의되지 않았다는 링커 에러가 출력된다. 클래스 정의에서 메서드의 프로토타입만 선언했을 뿐 구현 코드를 작성하지 않았기 때문이다. 클래스 정의는 주로 해더 파일에 작성하고, 메서드 정의는 소스 파일에 작성한 뒤 소스 파일에서 #include 문으로 해더 파일을 불러오는 방식으로 사용한다. SpreadsheetCell 클래스의 두 메서드를 다음과 같이 정의한다. #include "SpreadsheetCell.h" void SpreadsheetCell::setValue(double inValue) { mValue ..

    [C++ 8.2.1] 클래스 정의

    클래스 정의 SpreadsheetCell 클래스의 첫 버전을 작성해보자. 여기서는 각 셀마다 숫자 하나만 저장하도록 정의한다. class SpreadsheetCell { public: void setValue(double inValue); double getValue() const; private: double mValue; }; 클래스 정의는 항상 class 키워드와 클래스 이름으로 시작한다. C++에서 클래스 정의는 문장이다. 따라서 반드시 세미콜론(;)으로 끝나야 한다. 클래스 정의를 작성한 파일의 이름은 주로 클래스 이름과 똑같이 짓는다. 예를 들어 SpreadsheetCell 클래스 정의 파일은 SpreadsheetCell.h 파일에 저장한다. 1. 클래스 멤버 클래스는 여러 개의 멤버를 가질 ..

    [C++ 7.5.1] 메모리 누수, 비주얼 C++을 이용한 메모리 누수 탐지 및 수정 방법

    [C++ 7.5.1] 메모리 누수, 비주얼 C++을 이용한 메모리 누수 탐지 및 수정 방법

    1. 메모리 누수 메모리 누수 문제는 C/C++ 프로그래밍 과정에서 발견하거나 해결하기 가장 힘든 작업이다. 원하는 결과를 내도록 프로그램이 실행될수록 메모리 공간을 잡아먹는다면 메모리 누수 현상이 발생한 것이다. 메모리 누수 현상은 할당했던 메모리를 제대로 해제하지 않을 때 발생한다. new에 대응되는 delete를 빠짐없이 작성하더라도 누수 현상이 발생하는 경우가 있다. 다음 Simple 클래스 코드를 보면 할당한 메모리를 적절히 해제하도록 작성했다. class Simple { private: int* mIntPtr; public: Simple() { mIntPtr = new int(); } ~Simple() { delete mIntPtr; } void setValue(int value) { *mIn..