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 |