클래스 객체 사용법
앞에서 SpreadsheetCell을 정의할 때 데이터 멤버 하나, public 메서드 네 개, private 메서드 두 개를 작성했다.
그런데 이렇게 클래스를 정의한다고 해서 곧바로 SpreadsheetCell 객체가 생성되는 것은 아니다.
단지 형태와 동작만 표현한 것이다.
SpreadsheetCell 객체를 생성하려면 SpreadsheetCell 타입의 변수를 따로 선언해야 한다.
SpreadsheetCell 클래스 하나로 SpreadsheetCell 객체를 여러 개 만들 수 있다.
객체를 생성해서 사용하는 방법은 크게 두 가지가 있다.
하나는 스택에 생성하는 것이고 다른 하나는 힙에 생성하는 것이다.
1. 스택에 생성한 객체
SpreadsheetCell 객체를 스택에 생성해서 사용하는 예를 살펴보자
SpreadsheetCell myCell, anotherCell;
myCell.setValue(6);
anotherCell.setString("3.2");
cout << "cell 1: " << myCell.getValue() << endl;
cout << "cell 2: " << anotherCell.getValue() << endl;
객체를 생성하는 방법은 변수를 선언하는 방법과 같다.
변수 타입이 클래스 이름이라는 점만 다르다. myCell.setValue(6);에 나온 .을 닷 연산자라 부른다.
이 연산자로 객체에 속한 메서드를 호출한다.
객체의 public 데이터 멤버도 이 연산자로 접근할 수 있다.
참고로 데이터 멤버를 public으로 선언하는 것은 바람직하지 않다.
이 코드를 실행한 결과는 다음과 같다.
2. 힙에 생성한 객체
다음과 같이 new를 사용해서 객체를 동적으로 생성할 수도 있다.
SpreadsheetCell* myCellp = new SpreadsheetCell();
myCellp->setValue(3.7);
cout << "cell 1: " << myCellp->getValue() << " " << myCellp->getString() << endl;
delete myCellp;
myCellp = nullptr;
힙에 생성한 객체는 화살표 연산자(->)로 멤버에 접근한다.
화살표 연산자는 역참조 연산자(*)와 멤버 접근 연산자(.)를 합친 것이다.
화살표 대신 두 연산자를 조합해서 사용해도 되지만 다음과 같이 코드가 복잡해진다.
SpreadsheetCell* myCellp = new SpreadsheetCell();
(*myCellp).setValue(3.7);
cout << "cell 1: " << (*myCellp).getValue() << " " << (*myCellp).getString() << endl;
delete myCellp;
myCellp = nullptr;
힙에 할당한 메모리를 항상 해제해야 하듯이 힙에 할당한 객체 메모리도 반드시 delete로 해제해야 한다.
메모리 관련 문제가 발생하지 않게 하려면 다음과 같이 반드시 스마트 포인터를 사용한다.
auto myCellp = make_unique<SpreadsheetCell>();
// 다음과 같이 적어도 된다.
// unique_ptr<SpreadsheetCell> myCellp(new SpreadsheetCell());
myCellp->setValue(3.7);
cout << "cell 1: " << myCellp->getValue() << " " << myCellp->getString() << endl;
스마트 포인터를 사용하면 메모리를 자동으로 해제하기 때문에 직접 해제하는 문장을 작성할 필요가 없다.
'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글
[C++ 8.3.1-1] 객체 생성과 생성자 (1) | 2022.10.15 |
---|---|
[C++ 8.2.2-2] this 포인터 (0) | 2022.10.03 |
[C++ 8.2.2-1] 메서드 정의 방법 (0) | 2022.10.03 |
[C++ 8.2.1] 클래스 정의 (0) | 2022.10.03 |
[C++ 7.5.1] 메모리 누수, 비주얼 C++을 이용한 메모리 누수 탐지 및 수정 방법 (0) | 2022.10.03 |