학습일지/C와 C++

C/C++ Class

Tsukino Ren 2026. 3. 9. 19:40

Class

  • 객체를 만들기 위한 설계도이자 멤버변수와 멤버함수를 묶은 정의 자료형.
  • 캡슐화, 상속, 다형성을 통해 객체지향 프로그래밍을 지원하여 코드 재사용성과 유지보수성을 높인다.

Pointer

  • 메모리 주소값을 저장하는 변수
  • 선언 : 자료형* 변수명 = 메모리 주소 값;
  • 역참조 : *변수명 = 메모리 주소 값;

Reference

  • 이미 존재하는 변수에 대한 별명
  • 포인터와 유사하게 메모리 주소를 다루나, 일반 변수처럼 사용할 수 있다.
  • 선언 : 자료형 &변수명 = 메모리 주소 값;
  • 별도의 역참조 연산자 없이 참조자 이름으로 직접 사용하여 원본 변수의 값을 읽거나 수정 가능하다.

 

// SwapWithPointer.h

#pragma once

namespace SWPointer
{
	void Pointer(int* LHS, int* RHS);
}

스왑 포인트 헤더파일 - 스왑포인트에 대한 것을 선언해준다.

// SwapWithReference.h

#pragma once

namespace SWReference
{
	void Reference(int& LHS, int& RHS);
}​

레퍼런스 헤더파일 - 레퍼런스에 대한 것을 선언해준다

// Main.cpp

#include <iostream>
#include "SwapWithPointer.h"
#include "SwapWithReference.h"

void SWValue(int LHS, int RHS)
{
	std::cout << "SwapWithValue() has been clled" << std::endl;
	int Temp = LHS;
	LHS = RHS;
	RHS = Temp;
}

int main(void)
{
	int A = 10, B = 20;
	std::cout << "A: " << A << " // B: " << B << std::endl;
	SWValue(A, B);
	std::cout << "A: " << A << " // B: " << B << std::endl;
	
	SWPointer::Pointer(&A, &B);

	SWReference::Reference(A, B);


	return 0;
}

메인 함수 - 헤더파일을 통해 다른 파일에 있는 함수들을 호출하여 사용한다.

// SwapWithPointer.cpp

#include <iostream>
#include "SwapWithPointer.h"

void SWPointer::Pointer(int* LHS, int* RHS)
{
	std::cout << "SWPointer() has been called" << std::endl;
	int Temp = *LHS;
	*LHS = *RHS;
	*RHS = Temp;
	std::cout << "A: " << *LHS << " // B: " << *RHS << std::endl;

}

포인터함수 소스파일 - 포인터 함수를 구현, 정의한다.

// SwapWithReference.cpp

#include <iostream>
#include "SwapWithReference.h"

void SWReference::Reference(int& LHS, int& RHS)
{
	std::cout << "SWReference() has been called" << std::endl;
	int Temp = LHS;
	LHS = RHS;
	RHS = Temp;
	std::cout << "A: " << LHS << " // B: " << RHS << std::endl;
}

레퍼넌스함수 소스파일 - 레퍼넌스 함수를 구현, 정의한다.


복습겸 처음부터 작성 하다보니 여기에 통합시키는게 나을것같아서 넣음

참조(Reference)

  • 이미 존재하는 변수명에 또 하나의 별명을 붙여주는 문법
  • NULL 대입을 할 수 없고 반드시 존재하는 변수에다 참조해야된다.
int Number = 20;
int& Num = Number; 

//int& Num;
//int& Num = NULL;
//참조하는 변수가 없으므로 안됨
  • 참조는 다른 참조하는 대상으로 바꿀 수 없다.
// Main.cpp

#include <iostream>

int main(void)
{
	int A = 10, B = 20;
	int& ReferenceOfA = A;

	std::cout << "A: " << A << " // B: " << B << " // ReferenceOfA: " << ReferenceOfA << std::endl;
	ReferenceOfA = B;
	std::cout << "A: " << A << " // B: " << B << " // ReferenceOfA: " << ReferenceOfA << std::endl;
	ReferenceOfA += 1;
	std::cout << "A: " << A << " // B: " << B << " // ReferenceOfA: " << ReferenceOfA << std::endl;

	return 0;
}
  • 첫번째 출력은 10 , 20 으로 출력이 되며
  • 두번째 출력은 ReferenceOfA  = B; 를 한다해도 참조 대상이 바뀌는게 아닌 참조중인 대상의 값이 바뀐다. 고로 20 20 출력
  • 세번째 출력은 참조 대상에 += 1 하게되어 1증가하여 21 20 출력
// Main.cpp

#include <iostream>

void SwapWithValue(int LHS, int RHS)
{
	std::cout << "SwapWithValue() has been called." << std::endl;
	int Temp = LHS;
	LHS = RHS;
	RHS = Temp;
}

void SwapWithPointer(int* LHS, int* RHS)
{
	std::cout << "SwapWithPointer() has been called." << std::endl;
	int Temp = *LHS;
	*LHS = *RHS;
	*RHS = Temp;
}

void SwapWithReference(int& LHS, int& RHS)
{
	std::cout << "SwapWithReference() has been called." << std::endl;

	int Temp = LHS;
	LHS = RHS;
	RHS = Temp;
}

int main(void)
{
	int A = 10, B = 20;

	std::cout << "A: " << A << " // B: " << B << std::endl;
	SwapWithValue(A, B);
	std::cout << "A: " << A << " // B: " << B << std::endl;
	SwapWithPointer(&A, &B);
	std::cout << "A: " << A << " // B: " << B << std::endl;
	SwapWithReference(A, B);
	std::cout << "A: " << A << " // B: " << B << std::endl;

	return 0;
}
  • int A = 10 , B = 20이 초기화 된 상태
  • 첫번째 출력은 A, B 초기화 된 상태에서 변화 없이 출력하니 10 , 20 출력
  • SwapWithValue(A, B); 값을 복사해 전달하고 함수 내에서 복사된 값으로만 변화되기에 원본은 변하지 않음
  • 두번째 출력은 원본 값은 그대로 이기에 10 , 20 출력
void SwapWithPointer(int* LHS, int* RHS)
int Temp = *LHS;
*LHS = *RHS;
*RHS = Temp;
  • SwapWithPointer(&A, &B)는 해당 함수에 포인터로 메모리 주소를 전달하여 주소값을 변경 및 해당 값 자체 변경이 가능함
  • Temp = A / A = B / B = Temp 이런 느낌이 되므로 세번째 출력값은 서로 값이 바뀌어 20 10 출력
void SwapWithReference(int& LHS, int& RHS)
{
	std::cout << "SwapWithReference() has been called." << std::endl;

	int Temp = LHS;
	LHS = RHS;
	RHS = Temp;
}
  • 참조는 참조한 변수의 별명이기도 하고 포인터와 비슷하게 메모리 주소 값을 저장한다.
  • 그러므로 해당 메모리 주소안에 있는 값을 변경하기에 A 와 B는 값이 바뀌게된다
  • 출력하면 10 20 이 출력된다.

참조와 포인터

공통점

  • 특정 데이터의 메모리 주소를 통해 해당 데이터에 접근
  • 복사본을 만들지 않고 원본 데이터를 조작하여 메모리와 시간을 절약
  • 함수에서 외부의 변수 값을 직접 변경할 때 사용

차이점

  포인터 참조
정의 주소 값을 저장하는 독립된 변수 기존 변수의 별명
초기화 선언 후 초기화 가능 선언과 동시에 반드시 초기화 해야됨
NULL NULL을 허용함 NULL 불가능하며 항상 대상을 참조해야됨
재할당 가리키는 대상을 언제든 변경가능 한 번 지정하면 변경할 수 없음
메모리 포인터 자체를 위한 메모리 공간을 가짐 별도의 메모리 공간을 차지하지 않음
문법 *, &, -> 등 연산자가 필요 일반 변수와 동일한 문법으로 사용

 

nullptr

  • NULL은 정수 0으로 해설될 수 있지만, nullptr은 정수로 변환되지 않도록 설계되어 있어 포인터 상수로 사용 한다.
 

'학습일지 > C와 C++' 카테고리의 다른 글

C++ 복사 생성자와 오버로딩  (0) 2026.03.11
C/C++ 전직  (0) 2026.03.10
C++ Console IO  (0) 2026.03.08
C/C++ 지금까지 배운 C 문법 활용해보기!  (0) 2026.03.06
C/C++ 상태창 구현<과제>  (0) 2026.03.06