wn42
코딩이랑 이것저것
wn42
전체 방문자
오늘
어제
  • 분류 전체보기 (113)
    • 프로그래머스 (23)
      • LV1 (11)
      • LV2 (1)
      • LV3 (3)
      • 연습 (8)
    • 딥러닝 공부 (0)
      • 머신러닝&딥러닝 이론 (0)
    • 임베디드 (17)
      • Adventure Design (1)
      • 센서기반모바일로봇 (5)
      • ROS (9)
      • Google Coral (2)
    • C++ (38)
      • C++ 기초 (34)
      • 자료구조 및 알고리즘 (4)
    • Python (14)
      • 기본 파이썬 문법 (6)
      • Python 기초 (8)
    • 빅데이터 (9)
      • 빅데이터 첫걸음 시작하기(국비지원) (5)
      • 빅데이터 공부 (4)
    • 알고리즘 공부 (2)
      • 기본 알고리즘 (2)
    • 전자공학 (10)
      • 반도체 공정 (3)
      • 무선데이터통신 (7)
      • 반도체공학 (0)
    • C# (0)
      • C# 기본 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 변수
  • c++
  • 큐
  • 내일배움카드
  • Queue
  • numpy
  • 프로그래머스
  • 스택/큐
  • 빅데이터 첫걸음 시작하기
  • 노드
  • 인스턴스
  • K디지털크레딧
  • 클래스
  • 딥러닝
  • 바이트디그리
  • 반복문
  • google coral
  • 정렬
  • 스택
  • 조건문
  • stl
  • 파이썬
  • 빅데이터
  • Python
  • 상속
  • 소멸자
  • 데이터분석
  • 패스트캠퍼스
  • 데이터분석 인강
  • ROS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
wn42

코딩이랑 이것저것

C++/C++ 기초

[C++] 클래스에서 static 이용하기 (+ const)

2023. 1. 6. 17:48

Static 이용하기

Static 변수

  • static 변수는 한번 생성되면 객체가 종료될 때가 아닌, 프로그램이 종료될 때 소멸되므로 이를 생성된 객체의 개수를 세는데 활용할 수 있다.
  • 클래스 내부에서 static 변수를 선언하는 경우에는 초기화를 할 수 없기 때문에 외부에서 초기화를 진행한다. (기존에는 static은 따로 초기화를 하지 않아도 0으로 설정되었지만, 클래스는 그것이 이뤄지지 않음)

 

static 변수를 이용하여 객체 개수 세기

#include <iostream>
using namespace std;

class Ex {
private:
	static int objectNum;	// static 변수

public:
	Ex();
	~Ex();
};

int Ex::objectNum = 0;     // static 변수 초기화

Ex::Ex() {
	objectNum++;     // 객체 생성하고 개수 추가
	cout << "객체 생성 및 초기화 완료." << endl;
	cout << "현재 생성된 객체의 수는 " << objectNum << "입니다. " << endl;
}

Ex::~Ex() {
	objectNum--;     // 객체가 소멸되면 개수 감소
	cout << "객체가 소멸되었습니다." << endl;
	cout << "현재 남아있는 객체의 수는 " << objectNum << "입니다. " << endl;
};

int main() {
	Ex* ex[3];
	ex[0] = new Ex;
	ex[1] = new Ex;
	ex[2] = new Ex;
	cout << endl;

	// 동적 메모리 해제
	delete ex[0];
	delete ex[1];
	delete ex[2];

	return 0;
}
객체 생성 및 초기화 완료.
현재 생성된 객체의 수는 1입니다.
객체 생성 및 초기화 완료.
현재 생성된 객체의 수는 2입니다.
객체 생성 및 초기화 완료.
현재 생성된 객체의 수는 3입니다.

객체가 소멸되었습니다.
현재 남아있는 객체의 수는 2입니다.
객체가 소멸되었습니다.
현재 남아있는 객체의 수는 1입니다.
객체가 소멸되었습니다.
현재 남아있는 객체의 수는 0입니다.

 

Static 함수

  • 클래스에 static 함수를 정의할 수 있다.
  • static 함수는 객체에 종속되는 것이 아니기 때문에, 클래스 자체에서 호출할 수 있다.
  • 객체에 종속되는 것이 아니기 때문에 다른 변수에 접근할 수 없고, static 변수만 이용할 수 있다는 점에 유의하자.

 

Static 함수 구현하기

#include <iostream>
using namespace std;

class Ex {
private:
	static int objectNum;

public:
	static void printNum();
	Ex();
	~Ex();
};

int Ex::objectNum = 0;

Ex::Ex() {
	objectNum++;
}

Ex::~Ex() {
	objectNum--;
};

void Ex::printNum() {
	cout << "현재 객체의 수는 " << objectNum << "입니다. " << endl;
}

int main() {
	Ex* ex[3];
	ex[0] = new Ex;

	// 개수 확인 1
	Ex::printNum();		// 클래스 자체에서 호출한다.

	ex[1] = new Ex;
	ex[2] = new Ex;

	// 개수 확인 2
	Ex::printNum();

	// 동적 메모리 해제
	delete ex[0];
	delete ex[1];
	delete ex[2];

	// 개수 확인 3
	Ex::printNum();

	return 0;
}
현재 객체의 수는 1입니다.
현재 객체의 수는 3입니다.
현재 객체의 수는 0입니다.

 

Const

  • Class를 구현할 때 대부분의 경우 변수를 초기화할 수 없지만, const 키워드를 이용하여 상수 처리한다면 정의와 동시에 초기화할 수 있다.
  • 그리고 '상수 함수'로 읽기만 수행하는 함수를 선언하여 사용할 수 있다. 상수 멤버 함수로 정의하여 해당 함수는 멤버 변수를 변경하지 않는 함수임을 명시할 수 있다. 상수 함수 내에서 호출할 수 있는 함수는 다른 상수 함수밖에 없다.
  • 상수 멤버 함수는 다음과 같이 정의한다.
(기존 함수의 정의) const;

// example
void printNum() const;

 

상수 멤버 변수 & 상수 멤버 함수

#include <iostream>
using namespace std;

class Ex {
private:
	const int x = 10;

public:
	void printNum() const;
	Ex();
	~Ex();
};

Ex::Ex() {
}

Ex::~Ex() {
};

void Ex::printNum() const {
	cout << "x = " << x << "입니다. " << endl;
}

int main() {
	Ex ex;
	ex.printNum();

	return 0;
}
x = 10입니다.
  • 상수 키워드 const를 이용하면 class 정의에서도 멤버 변수를 초기화할 수 있다.
    'C++/C++ 기초' 카테고리의 다른 글
    • [C++] explicit
    • [C++] this 포인터
    • [C++] 오버로딩 (Overloading) - 1. 함수, 생성자
    • [C++] 생성자 (Constructor)
    wn42
    wn42
    코딩이랑 이것저것 하는 블로그

    티스토리툴바