Argument와 Parameter 복습
C++ 같은 프로그래밍 언어에서 argument와 parameter는 함수와 관련된 개념인데, 헷갈리기 쉬워요. 아래에 예시와 함께 쉽게 설명해볼게요.
🧩 개념 설명
용어설명
Parameter (매개변수) | 함수가 정의될 때 사용하는 변수. 함수가 어떤 값을 받을지 미리 지정하는 역할. |
Argument (인자) | 함수가 호출될 때 실제로 전달되는 값. 매개변수에 대응되는 실제 값. |
📌 예시 코드 (C++)
#include <iostream>
using namespace std;
// 함수 정의: parameter는 a와 b
int add(int a, int b) {
return a + b;
}
int main() {
// 함수 호출: argument는 3과 5
int result = add(3, 5);
cout << "결과: " << result << endl;
return 0;
}
- int a, int b → parameter: 함수 add가 어떤 값을 받을지 정의한 변수
- add(3, 5) → argument: 함수 호출 시 실제로 전달된 값 3과 5
🎯 비유로 이해하기
- Parameter는 레스토랑 메뉴에 적힌 음식 이름
- Argument는 손님이 실제로 주문한 음식
즉, 메뉴에 "파스타"라고 써 있어도 손님이 "크림 파스타"를 주문하면 그게 argument인 거죠!
두 정수를 매개변수로 받아 더하여 반환하는 함수를 사용하는 프로그래밍 언어
좋아, hawon! 아래는 다양한 프로그래밍 언어에서 두 정수를 매개변수로 받아 더한 값을 반환하는 함수를 만드는 예시야. 각 언어의 스타일을 살짝 보여줄게요:
🧮 다양한 언어별 덧셈 함수 예시
언어함수 예시 코드
C | int add(int a, int b) { return a + b; } |
C++ | int add(int a, int b) { return a + b; } |
Java | int add(int a, int b) { return a + b; } |
Python | def add(a, b): return a + b |
JavaScript | function add(a, b) { return a + b; } |
C# | int Add(int a, int b) { return a + b; } |
Swift | func add(a: Int, b: Int) -> Int { return a + b } |
Go | func add(a int, b int) int { return a + b } |
Rust | fn add(a: i32, b: i32) -> i32 { a + b } |
Kotlin | fun add(a: Int, b: Int): Int = a + b |
Ruby | def add(a, b); a + b; end |
PHP | function add($a, $b) { return $a + $b; } |
TypeScript | function add(a: number, b: number): number { return a + b; } |
Haskell | add a b = a + b |
Scala | def add(a: Int, b: Int): Int = a + b |
Perl | sub add { my ($a, $b) = @_; return $a + $b; } |
R | add <- function(a, b) { a + b } |
MATLAB | function result = add(a, b); result = a + b; end |
Dart | int add(int a, int b) => a + b; |
함수 정의, 선언, 호출
좋은 질문이에요 hawon! 함수는 크게 선언(Declaration), 정의(Definition), 호출(Call) 세 단계로 나눠서 이해할 수 있어요. 각각의 개념을 정리해볼게요.
🧩 함수의 세 가지 개념
1. 함수 선언 (Function Declaration)
- 목적: 컴파일러에게 “이런 함수가 있다”라고 미리 알려주는 것
- 내용: 함수의 이름, 반환 타입, 매개변수 타입만 명시 (구현 내용은 없음)
- 위치: 보통 코드 상단이나 헤더 파일에 작성
// 함수 선언
int add(int a, int b);
2. 함수 정의 (Function Definition)
- 목적: 함수가 실제로 어떤 일을 할지 구현하는 부분
- 내용: 함수 본문 { } 안에 실행할 코드 작성
- 특징: 선언과 정의가 동시에 이루어질 수도 있음
// 함수 정의
int add(int a, int b) {
return a + b;
}
3. 함수 호출 (Function Call)
- 목적: 정의된 함수를 실제로 실행하는 것
- 내용: 함수 이름과 인자(argument)를 전달
- 결과: 함수가 실행되고 반환값이 있으면 돌려받음
// 함수 호출
int result = add(3, 5); // result에는 8이 저장됨
🎯 정리 비유
- 선언: “이런 기능의 기계가 있어!”라고 설명서에 적어둠
- 정의: 그 기계를 실제로 조립해서 만드는 과정
- 호출: 버튼을 눌러 기계를 실제로 작동시키는 것
👉 참고로 C/C++ 같은 언어는 선언과 정의를 구분하는 경우가 많지만, Python 같은 언어는 선언 없이 곧바로 정의와 호출만 사용해요.
함수의 선언을 사용하는 언어와 사용하지 않는 언어
함수 선언(Declaration)이 필요한 언어와 그렇지 않은 언어는 언어의 컴파일 방식과 타입 시스템에 따라 달라집니다. 정리해서 표로 보여드릴게요.
📊 함수 선언 필요 여부 정리
구분함수 선언이 필요한 언어함수 선언이 필요 없는 언어
대표 언어 | C, C++ (특히 함수 정의가 호출 이후에 나올 경우), Pascal, Fortran | Python, JavaScript, Ruby, PHP, Kotlin, Swift, Go, Rust, Java, C#, Haskell |
이유 | - 컴파일러가 함수 호출 시점에 함수의 시그니처(반환 타입, 매개변수 타입)를 알아야 함<br>- 헤더 파일(.h)로 선언을 분리하는 전통적인 구조 때문 | - 인터프리터 언어(Python, JS 등)는 실행 시점에 함수 정의를 읽음<br>- 현대 컴파일 언어(Java, C#, Kotlin 등)는 컴파일러가 전체 코드를 분석하므로 별도의 선언 불필요 |
특징 | - 선언과 정의를 분리 가능<br>- 대규모 프로젝트에서 헤더 파일과 구현 파일을 나눠 관리 | - 함수 정의만 있으면 바로 호출 가능<br>- 코드가 간결해짐 |
📌 예시 비교
C (선언 필요)
#include <stdio.h>
// 함수 선언
int add(int a, int b);
int main() {
printf("%d\n", add(3, 5));
return 0;
}
// 함수 정의
int add(int a, int b) {
return a + b;
}
Python (선언 불필요)
def add(a, b):
return a + b
print(add(3, 5))
👉 정리하면, C/C++ 같은 전통적인 컴파일 언어는 선언이 필요하고, Python, Java, JavaScript 같은 언어는 선언 없이 정의만으로 충분합니다.
매개변수와 반환값
📌 코드 속 줄 다시 보기
int result = double_number(3); // 함수 호출 후 반환값 저장
1. double_number(3) 부분
- double_number라는 함수를 호출하는 거예요.
- 괄호 안의 3은 argument(인자)로, 함수의 매개변수 x에 전달돼요.
- 함수 안에서는 return x * 2;가 실행되니까, 3 * 2 = 6을 반환합니다.
즉, double_number(3)은 값 6이 됩니다.
2. int result = ... 부분
- int result =는 정수형 변수 result를 만들고 초기화한다는 뜻이에요.
- ... 자리에 들어간 값이 result에 저장됩니다.
- 여기서는 double_number(3)이 6을 반환했으니, result에는 6이 저장돼요.
3. 전체 문장의 의미
- "함수 double_number(3)을 실행해서 나온 결과값(6)을 result라는 변수에 저장한다."
🎯 비유로 이해하기
- double_number(3) = "자판기에 3을 넣으면 6이 나온다."
- int result = ... = "그 나온 6을 컵(result)에 담는다."
즉, 자판기(함수)에서 음료(반환값)를 뽑아서 컵(변수)에 담는 과정이라고 보면 돼요.
const char* vs string
C++에서 문자열을 다룰 때 const char* 과 std::string 은 자주 비교되는 개념이에요. 둘 다 문자열을 표현할 수 있지만, 성격과 사용 방식이 꽤 다릅니다.
📌 const char* vs std::string 차이
구분const char*std::string
정의 | C 스타일 문자열. 문자열 리터럴(예: "물")은 사실상 const char[]이고, 함수에서 받을 때 const char*로 취급됨 | C++ 표준 라이브러리에서 제공하는 문자열 클래스 |
저장 방식 | 메모리에 연속된 문자 배열('\0'으로 끝남) | 내부적으로 동적 배열을 관리하며 크기 자동 조절 |
수정 가능 여부 | const char*는 읽기 전용 (수정 불가). char*라면 수정 가능하지만 문자열 리터럴은 수정하면 UB(정의되지 않은 동작) | 문자열 내용 수정 가능 (+=, append, replace 등 다양한 메서드 제공) |
길이 확인 | strlen(str) 같은 C 함수 사용 | str.size() 또는 str.length() 메서드 사용 |
연산 편의성 | 문자열 연결, 비교 등을 직접 함수(strcat, strcmp)로 처리해야 함 | +, ==, < 같은 연산자 오버로딩 지원 → 직관적 사용 가능 |
안전성 | 포인터 연산 실수, 메모리 관리 문제 발생 가능 | 메모리 관리 자동화 → 안전하고 직관적 |
예시 | const char* s = "Hello"; | string s = "Hello"; |
📌 예시 코드 비교
1. const char* 사용
#include <iostream>
#include <cstring> // strlen, strcmp 등
using namespace std;
int main() {
const char* s1 = "Hello";
const char* s2 = "World";
cout << strlen(s1) << endl; // 길이 확인
cout << strcmp(s1, s2) << endl; // 문자열 비교
// strcat(s1, s2); // ❌ 문자열 리터럴은 수정 불가 → 위험
}
2. std::string 사용
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1 = "Hello";
string s2 = "World";
cout << s1.size() << endl; // 길이 확인
cout << (s1 == s2) << endl; // 문자열 비교
cout << s1 + " " + s2 << endl; // 문자열 연결
}
🎯 정리
- const char* → C 스타일 문자열 (단순, 빠르지만 불편하고 위험할 수 있음)
- std::string → C++ 스타일 문자열 (안전하고 편리, 다양한 기능 제공)
👉 그래서 현대 C++에서는 특별한 이유(성능 최적화, 레거시 C 코드 호환 등)가 없다면 std::string을 쓰는 게 권장돼요.
실매개변수 vs 형식매개변수
프로그래밍에서 함수와 관련된 중요한 개념인 실매개변수(Actual Parameter) 와 형식매개변수(Formal Parameter) 의 의미와 차이를 정리해드릴게요.
🧩 개념 정리
구분형식매개변수 (Formal Parameter)실매개변수 (Actual Parameter)
정의 위치 | 함수 선언/정의 시 괄호 안에 적는 변수 | 함수 호출 시 실제로 전달하는 값 |
역할 | 함수가 어떤 값을 받을지 “자리만 마련”해둔 변수 | 함수 실행 시 그 자리에 들어가는 실제 값 |
존재 시점 | 함수가 정의될 때만 존재, 함수 내부에서만 사용 | 함수 호출 시점에 존재, 호출하는 쪽에서 준비 |
예시 코드 | int add(int a, int b) → a, b가 형식매개변수 | add(2, 3) → 2, 3이 실매개변수 |
📌 예시 코드 (C++)
#include <iostream>
using namespace std;
// 함수 정의: a, b는 형식매개변수
int add(int a, int b) {
return a + b;
}
int main() {
// 함수 호출: 2, 3은 실매개변수
int result = add(2, 3);
cout << result << endl; // 출력: 5
return 0;
}
- int add(int a, int b) → a, b는 형식매개변수 (함수 정의 시 자리만 차지하는 변수)
- add(2, 3) → 2, 3은 실매개변수 (실제로 전달되는 값)
🎯 비유로 이해하기
- 형식매개변수 = “택배 상자에 붙은 주소 라벨의 빈칸”
- 실매개변수 = “실제로 그 칸에 적힌 주소(서울시 강남구 …)”
즉, 함수는 “빈칸(형식매개변수)”을 준비해두고, 호출할 때 “실제 값(실매개변수)”을 채워 넣는 구조예요.
Call by Value
프로그래밍에서 Call by Value (값에 의한 호출) 은 함수에 인자를 전달할 때 실제 값의 복사본을 함수로 넘겨주는 방식을 말합니다.
🧩 개념 정리
- 함수를 호출할 때 실매개변수(Actual Parameter)의 값이 형식매개변수(Formal Parameter)로 복사됩니다.
- 따라서 함수 안에서 매개변수 값을 바꿔도, 원래 변수에는 영향이 없습니다.
- C, C++, Java(기본 타입), Python(내부적으로는 객체 참조지만 값처럼 동작하는 경우) 등에서 기본적으로 사용되는 전달 방식이에요.
📌 예시 (C++)
#include <iostream>
using namespace std;
void modifyValue(int x) {
x = 10; // 함수 안에서만 값 변경
cout << "함수 안의 x: " << x << endl;
}
int main() {
int a = 5;
cout << "호출 전 a: " << a << endl;
modifyValue(a); // a의 값(5)이 복사되어 전달됨
cout << "호출 후 a: " << a << endl; // 여전히 5
return 0;
}
실행 결과
호출 전 a: 5
함수 안의 x: 10
호출 후 a: 5
👉 함수 안에서 x를 10으로 바꿨지만, 원래 변수 a는 그대로 5인 걸 볼 수 있어요.
이게 바로 Call by Value의 특징입니다.
🎯 비유로 이해하기
- Call by Value = “복사본을 빌려주는 것”
→ 친구에게 숙제 문제를 복사해서 줬더니, 친구가 그 종이에 낙서를 해도 내 원본 숙제에는 아무 변화가 없음.
정리하면, Call by Value는 원본 데이터를 보호하면서 함수 내부에서만 값이 바뀌도록 하는 안전한 방식이에요.
참고*
Call by Address
Call by Address (주소에 의한 호출) 은 함수를 호출할 때 변수의 값이 아니라 변수의 주소(메모리 위치)를 전달하는 방식이에요.
🧩 개념 정리
- Call by Value: 값 자체를 복사해서 함수에 전달 → 함수 안에서 바꿔도 원본은 안 변함
- Call by Address: 변수의 주소를 전달 → 함수 안에서 포인터를 통해 원본 값을 직접 바꿀 수 있음
즉, Call by Address는 함수가 원본 변수에 직접 접근할 수 있게 해주는 방법이에요.
📌 예시 (C++)
#include <iostream>
using namespace std;
// Call by Address 방식 (포인터 사용)
void changeValue(int* p) {
*p = 10; // 포인터가 가리키는 실제 값 변경
}
int main() {
int a = 5;
cout << "호출 전 a: " << a << endl;
changeValue(&a); // a의 주소를 전달
cout << "호출 후 a: " << a << endl;
return 0;
}
실행 결과
호출 전 a: 5
호출 후 a: 10
👉 함수 안에서 *p = 10;을 했더니, 원래 변수 a의 값이 바뀌었죠.
이게 바로 Call by Address의 특징이에요.
🎯 비유로 이해하기
- Call by Value = “열쇠 복사본을 빌려줌” → 집 원래 문은 못 바꿈
- Call by Address = “집 열쇠 원본을 빌려줌” → 집 안에 들어가서 가구를 바꿀 수 있음
💡 정리하면:
- Call by Value → 안전하지만 원본은 안 바뀜
- Call by Address → 원본을 직접 바꿀 수 있음 (포인터 사용)
- Call by Reference → C++에서 더 간단히 &를 써서 주소 전달을 자동으로 처리
Call by Value / Call by Address / 깊은 복사 / 얕은 복사 차이점
Call by Value / Call by Address와 깊은 복사 / 얕은 복사는 “원본 데이터에 영향을 주느냐”라는 점에서 비슷한 맥락이 있지만, 완전히 같은 개념은 아니에요.
🧩 공통점
- 둘 다 복사(copy)와 관련된 개념
- “원본 데이터가 바뀌는지, 안 바뀌는지”가 핵심 차이
- 따라서 학습할 때 헷갈리기 쉬움
📌 차이점 정리
구분Call by Value / Address얕은 복사 vs 깊은 복사
적용 대상 | 함수 호출 시 매개변수 전달 방식 | 객체/구조체/배열 같은 복합 자료형 복사 |
Call by Value | 값 자체를 복사 → 함수 안에서 변경해도 원본 영향 없음 | (비슷한 느낌) 얕은 복사에서 최상위 값만 복사 |
Call by Address | 주소(포인터)를 전달 → 함수 안에서 변경하면 원본도 바뀜 | (비슷한 느낌) 얕은 복사에서 내부 참조 공유로 원본 영향 가능 |
깊은 복사 | 대응되는 개념은 없음 (함수 호출과는 별개) | 내부 객체까지 전부 새로 복사 → 원본과 완전히 독립 |
🎯 쉽게 비유하기
- Call by Value = “친구한테 숙제 문제 복사본을 줌 → 친구가 낙서해도 내 원본은 그대로”
- Call by Address = “친구한테 내 숙제 원본을 줌 → 친구가 낙서하면 내 것도 망가짐”
- 얕은 복사 = “책 표지만 새로 사서 씌운 것 → 안에 있는 내용(내부 객체)은 여전히 공유됨”
- 깊은 복사 = “책을 통째로 새로 사서 복사한 것 → 원본과 완전히 독립”
✅ 정리하면:
- Call by Value/Address는 함수 호출 시 인자 전달 방식
- 얕은 복사/깊은 복사는 객체나 자료구조를 복사하는 방식
- 하지만 “원본에 영향을 주느냐”라는 관점에서 유사한 사고방식으로 이해할 수 있어요
Call by Value와 Call by Address의 차이 예제
앞서 보여준 두 코드는 겉보기에는 비슷하지만, 함수에 인자를 전달하는 방식이 다릅니다.
즉, Call by Value와 Call by Address의 차이를 보여주는 예제예요.
📌 두 코드의 차이점
구분첫 번째 코드 (값 전달)두 번째 코드 (주소 전달)
함수 선언 | int sum(int x, int y); | int sum(int* a, int* b); |
호출 방식 | c = sum(a, b); → 값 자체를 복사해서 전달 | c = sum(&a, &b); → 변수의 주소를 전달 |
함수 내부 매개변수 | int a, int b → 복사본 | int* a, int* b → 원본 주소를 가리키는 포인터 |
함수 내부 동작 | a = a + 2; b = b + 5; → 복사본만 변경됨 | *a = *a + 2; *b = *b + 5; → 원본 변수 값이 직접 변경됨 |
호출 후 원본 변수 변화 | a=2, b=5 그대로 유지 | a=4, b=10으로 값이 바뀜 |
결과 | c = 14, 하지만 a=2, b=5 | c = 14, 그리고 a=4, b=10 |
📌 실행 흐름 비교
1. Call by Value (값 전달)
int sum(int a, int b) {
a = a + 2; // 복사본만 바뀜
b = b + 5;
return a + b;
}
- main의 a=2, b=5는 그대로
- sum 안에서만 a=4, b=10
- 반환값 14만 c에 저장
👉 원본 변수는 변하지 않음
2. Call by Address (주소 전달)
int sum(int* a, int* b) {
*a = *a + 2; // 원본 값 직접 변경
*b = *b + 5;
return *a + *b;
}
- main의 a=2, b=5가 함수 안에서 직접 바뀜
- 함수 실행 후 a=4, b=10
- 반환값 14가 c에 저장
👉 원본 변수도 변함
🎯 정리
- 첫 번째 코드: Call by Value → 원본 변수는 그대로, 반환값만 바뀜
- 두 번째 코드: Call by Address → 원본 변수까지 바뀜
구조체를 사용하는 이유
C 언어에서 구조체(struct)를 사용하는 이유는 “서로 다른 자료형을 하나로 묶어 새로운 자료형을 만들기 위해서”예요. 배열은 같은 자료형만 묶을 수 있지만, 구조체는 다양한 자료형을 하나의 논리적 단위로 묶을 수 있다는 점이 가장 큰 장점입니다.
🧩 구조체를 사용하는 이유
- 서로 다른 자료형을 묶을 수 있음
- 배열: 같은 타입만 저장 가능 (예: int arr[5])
- 구조체: int, char, double 등 서로 다른 타입을 하나로 묶음
struct Student { char name[20]; int age; double grade; };
- 데이터를 논리적으로 그룹화
- 예: 학생(Student)이라는 개념은 이름, 나이, 성적 등 여러 속성으로 구성됨
- 각각 따로 변수로 관리하면 불편하지만, 구조체로 묶으면 한 단위로 관리 가능
- 코드 가독성과 유지보수성 향상
- 관련된 데이터를 하나의 구조체로 묶으면 코드가 직관적이고 관리하기 쉬움
- 함수 인자로 전달하기 편리
- 구조체 하나만 전달하면 여러 개의 데이터를 한 번에 함수로 넘길 수 있음
void printStudent(struct Student s) { printf("이름: %s, 나이: %d, 성적: %.2f\n", s.name, s.age, s.grade); }
- 복잡한 데이터 모델링 가능
- 구조체 안에 또 다른 구조체를 넣을 수 있음 (중첩 구조체)
- 포인터와 함께 사용하면 연결 리스트, 트리 같은 자료구조 구현 가능
🎯 비유로 이해하기
- 배열 = 같은 크기의 아파트 여러 채 (예: int만 모여 있음)
- 구조체 = 방마다 용도가 다른 집 (거실=int, 방=char[], 주방=double 등)
즉, 구조체는 현실 세계의 개체(사람, 책, 자동차 등)를 프로그래밍적으로 표현할 수 있게 해주는 도구예요.
struct와 class의 차이
많은 사람들이 “C++에서 struct와 class의 차이는 public이냐 private이냐 뿐이다”라고 말하는데, 사실상 문법적으로는 맞는 말이에요. 하지만 조금 더 깊게 들어가면 의미적·관례적 차이도 있습니다.
📌 문법적 차이
- 기본 접근 지정자(default access specifier)
- struct의 멤버는 기본적으로 public
- class의 멤버는 기본적으로 private
- 기본 상속 지정자(default inheritance specifier)
- struct는 기본 상속이 public
- class는 기본 상속이 private
즉, 접근 지정자와 상속 지정자 기본값만 다르고, 나머지 기능(캡슐화, 상속, 다형성, 생성자/소멸자, 연산자 오버로딩 등)은 둘 다 똑같이 지원합니다.
📌 의미적·관례적 차이
- struct
- 주로 단순 데이터 묶음(POD, Plain Old Data) 표현에 사용
- 예: 좌표(x, y), RGB 색상, 단순 데이터 레코드 등
- class
- 객체지향적 개념(캡슐화, 은닉, 상속, 다형성)을 표현할 때 사용
- 예: 학생(Student), 자동차(Car), 동물(Animal)처럼 속성과 동작을 함께 가지는 개체
📌 예시 코드
#include <iostream>
using namespace std;
struct Point { // 기본 public
int x;
int y;
};
class Student { // 기본 private
string name;
int age;
public:
Student(string n, int a) : name(n), age(a) {}
void print() { cout << name << " (" << age << ")" << endl; }
};
int main() {
Point p = {1, 2};
cout << p.x << ", " << p.y << endl; // 접근 가능 (public)
Student s("Hawon", 20);
s.print(); // 접근 가능 (public 함수 통해서만)
}
🎯 정리
- 문법적 차이: 기본 접근 지정자(public vs private), 기본 상속 지정자(public vs private)
- 의미적 차이: struct는 단순 데이터 구조, class는 객체지향적 개체 표현에 주로 사용
- 실제로는 둘 다 거의 동일한 기능을 제공하므로, 어떤 키워드를 쓰느냐는 코드의 의도와 관례를 드러내는 선택이라고 볼 수 있어요.
C와 C++의 struct 차이점
🖥️ C 언어에서의 struct
- C에서는 구조체 변수를 선언할 때 반드시 struct 키워드를 붙여야 합니다.
struct Person { char name[20]; int age; }; struct Person p1; // ✅ 반드시 struct 필요
- 만약 struct 키워드를 생략하고 싶다면 typedef를 사용해야 합니다.
typedef struct { char name[20]; int age; } Person; Person p1; // ✅ typedef 덕분에 struct 생략 가능
⚡ C++에서의 struct
- C++은 C와 달리 구조체 이름 자체가 새로운 타입으로 취급됩니다.
- 따라서 변수 선언 시 struct 키워드를 생략할 수 있습니다.
struct Person { std::string name; int age; }; Person p1; // ✅ struct 생략 가능 struct Person p2; // 이렇게 써도 되지만 굳이 필요 없음
📌 핵심 차이
언어구조체 변수 선언 시생략 가능 여부
C | struct Person p; | ❌ (단, typedef 사용 시 가능) |
C++ | Person p; | ✅ 기본적으로 가능 |
👉 정리하면, C는 기본적으로 struct를 붙여야 하고, C++은 생략 가능합니다. 그래서 C 코드와 호환성을 유지하려는 경우 일부러 struct를 붙여 쓰기도 해요.
struct의 일반 변수와 포인터 변수의 선언 차이
📌 구조체 일반 변수 선언
- 구조체 자체를 메모리에 직접 생성합니다.
- 변수 안에 구조체 멤버들이 그대로 들어있습니다.
- 멤버 접근 시 .(dot) 연산자를 사용합니다.
struct Man {
char name[10];
int age;
double weight;
};
struct Man gildong; // 일반 구조체 변수 선언
gildong.age = 20; // 멤버 접근은 .
📌 구조체 포인터 변수 선언
- 구조체를 가리키는 주소값을 저장합니다.
- 구조체 자체는 따로 메모리에 있어야 하고, 포인터는 그 위치를 가리킵니다.
- 멤버 접근 시 ->(arrow) 연산자를 사용합니다.
struct Man {
char name[10];
int age;
double weight;
};
struct Man *p; // 구조체 포인터 변수 선언
struct Man minsu;
p = &minsu; // minsu의 주소를 p에 저장
p->age = 25; // 포인터는 -> 로 멤버 접근
📊 차이 정리
구분일반 변수포인터 변수
선언 | struct Man m; | struct Man *p; |
메모리 | 구조체 멤버들이 직접 저장됨 | 구조체의 주소만 저장 |
접근 연산자 | . (dot) | -> (arrow) |
사용 예 | m.age = 20; | p->age = 20; |
👉 즉, 일반 변수는 구조체 자체를 담고, 포인터 변수는 구조체의 주소를 담는다는 차이가 있어요.
실무에서는 동적 메모리 할당(malloc, new)과 함께 포인터 구조체 변수를 많이 씁니다.
'1학년 대학 수업 > C++ 프로그래밍' 카테고리의 다른 글
5주차 수업 후 과제 (0) | 2025.10.02 |
---|---|
5주차 예습 과제 (0) | 2025.09.30 |
4주차 예습 과제 (0) | 2025.09.22 |
3 주차 수업 요약 (1) | 2025.09.18 |
3주차 예습 과제 (0) | 2025.09.13 |