📝함수호출
: 함수가 인수 (매개변수)를 처리하는 방식에는 두 가지가 있다.
: 첫 번째 값에 의한 호출 (call by value) , 두 번째로 참조에 의한 호출 (call by reference)
📝call by value
값에 의한 호출
- 함수에 변수를 전달할 때 값을 복사해서 선달함
- 함수 내부에서 값을 변경해도 원래의 변수에 영향을 미치지 않는다
- int, float, string, bool 등의 원시 타입은 값 복사
원시타입을 매개변수로 가지는 예시를 보겠다
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
int a = 10;
int b = 11;
CallbyValue(a, b);
}
public static void CallbyValue(int tempA, int tempB)
{
tempA++;
tempB++;
}
□ 함수에서 매개변수로 들어온 int값이 바뀌었지만, 원래 값은 변경되지 않는다.
□ main함수가 실행될 때 스택 메모리에 a와 b 변수가 선언된다
□ CallByValue 메서드가 호출되면 스택에 tempA와 tempB가 할당되고 , a와 b의 값을 복사한다
□ 함수 실행이 종료되면 tempA와 tempB는 스택에서 해제된다
□ 즉, 함수 내에서 복사한 값을 변경하였기 때문에 원본 값은 변경되지 않는다
📝call by reference
참조에 의한 호출
- 함수에 변수를 전달할 때 값을 참조, 즉 메모리 주소를 전달
- 원래의 변수는 함수 외부에서도 변경된 값을 유지한다
- 객체, 배열 같은 참조타입은 참조값(주소)이 복사되어 함수에 전달
클래스를 참조값으로 가지는 예시를 보겠다
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
Apple test = new Apple();
CallbyReference(test);
}
public static void CallbyReference(Apple test)
{
test.count += 10;
}
public class Apple
{
public int count = 1;
}
□ 함수 내에서 Apple클래스의 count값이 변경되었고, 원래 객체에도 변경이 반영된다
□ Apple클래스를 인스턴스와 하면 힙 메모리에 할당된다
□ apple 변수는 Apple 인스턴스의 찹조값(주소)을 가진다.
□ CallbyReference 메서드에 참조값(주소)을 전달하면, 해당 주소값이 복사되어 스택에 저장된다.
□함수 내에서는 참조값(주소)에 해당하는 객체에 접근하여 값을 변경시킨다
□ 즉, 참조된 객체의 속성을 변경하였기 때문에 원래 객체에도 변경이 반영된다
📝공통점 / 차이점
□ 공통점
- 모두 매개변수로 전달된 값 (값 자체 또는 참조값)을 복사한다
- 복사된 값은 스택에 저장되고 함수 종료 시 해제된다 (스택프레임과 연관 있음)
□ 차이점
- Call by Value : 원시타입 (int 등)의 값 자체가 복사된다
- Call by Reference : 객체의 참조 주소값이 복사된다
(+) 스택프레임
함수가 호출될 때, 스택 영역에 차례대로 저장되는 함수의 호출정보이다.
함수가 호출될 때, 매개변수를 스택에 할당하기 때문에 두 방식 다 매개변수로 전달된 값을 복사한다.
( 참조타입의 경우 객체 자체는 힙에 있고, 참조만 스택에 복사된다! )
또한 함수의 호출이 끝나면 스택메모리에서 해제되기 때문에 복사된 값은 스택에서 해제된다.
스택프레임에 대한 자세한 설명은 아래 링크를 참고
2025.02.13 - [용어정리] - [용어정리]스택 프레임 (stack frame)
[용어정리]스택 프레임 (stack frame)
🔖 메모리 구조에 대해서 잘 모르시는 분들은 이전 글을 참고해 주세요! 2025.02.12 - [c#] - [c#]힙메모리와 스택 메모리 [c#]힙메모리와 스택 메모리메모리의 공간 1. 코드 (code) 영역2. 데이터 (data)
youcheachae.tistory.com
'용어정리' 카테고리의 다른 글
[Unity] Monobehavior (0) | 2025.03.07 |
---|---|
[c#] Action,Func,Delegate 차이점 (0) | 2025.02.28 |
[c#]static 정적 변수, 정적 메서드 , 정적 클래스 (0) | 2025.02.24 |
[용어정리]스택 프레임 (stack frame) (0) | 2025.02.13 |
[용어정리]힙메모리와 스택 메모리 (1) | 2025.02.12 |