📝함수호출                                                                               

: 함수가 인수 (매개변수)를 처리하는 방식에는 두 가지가 있다.

: 첫 번째 값에 의한 호출 (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

 

+ Recent posts