같은편
홍익대 게임소프트웨어전공의 프로그래밍 단련 공간
같은편
깃허브 주소
https://github.com/madongchan
GitHub 아이콘
  • 분류 전체보기 (85)
    • 게임 프로그래밍 패턴 (2)
    • C# 프로그래밍 (26)
    • C++ 프로그래밍 (32)
      • 함수 (8)
      • 클래스 (22)
    • 알고리즘 공부 (2)
      • codingame 사이트 문제 (11)
    • 유니티엔진 - 게임 공부 (3)
    • 언리얼엔진 - 게임 공부 (4)
    • 쓸모 있을 수 있는 팁 (2)
    • 일상이야기 (3)

최근 댓글

태그

  • task
  • 비동기
  • 예외 처리
  • 복사 생성자
  • queue
  • 스레드
  • 탐욕 알고리즘
  • 문제 풀이
  • DFS
  • 객체
  • c++
  • 언리얼엔진4
  • C#
  • 함수
  • 최단 경로
  • 언리얼엔진
  • 언리얼
  • 람다식
  • 클래스
  • 알고리즘

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
같은편

홍익대 게임소프트웨어전공의 프로그래밍 단련 공간

C++, C# 에서 "call by reference" , "pass by reference"
C# 프로그래밍

C++, C# 에서 "call by reference" , "pass by reference"

2023. 2. 22. 16:05

C++에서는 "call by reference"와 "pass by reference"를 구분하여 사용하지 않고, 둘 다 "참조에 의한 호출(call by reference)"이라는 용어를 사용합니다.

 

C#에서는 "pass by reference"를 "참조에 의한 전달"이라는 용어로 사용하고, "call by reference"를 "참조에 의한 호출"이라는 용어로 사용합니다.

 

즉, C#에서는 "pass by reference"와 "call by reference"를 구분하여 사용합니다. 하지만 C++에서는 둘 다 "참조에 의한 호출"로 통용되며, 구분하여 사용하지 않습니다.

 


언어마다 쓰는 매개 변수 키워드가 다르다

  • C++에서는 "call by reference"를 사용할 때 매개 변수 앞에 & 기호를 사용합니다.
  • C#에서는 "pass by reference"를 사용할 때 매개 변수 앞에 ref 키워드를 사용합니다.

C++에서 "call by reference"를 사용하는 예시 코드:

#include <iostream>

void swap(int& a, int& b) { // &를 사용하여 call by reference 방식으로 매개변수를 전달
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 5, y = 10;
    std::cout << "Before swap: x = " << x << ", y = " << y << std::endl;
    swap(x, y); // call by reference로 x와 y를 swap 함수에 전달
    std::cout << "After swap: x = " << x << ", y = " << y << std::endl;
    return 0;
}

C#에서 "pass by reference"를 사용하는 예시 코드:

using System;

class Program {
    static void Swap(ref int a, ref int b) { // ref 키워드를 사용하여 pass by reference 방식으로 매개변수를 전달
        int temp = a;
        a = b;
        b = temp;
    }

    static void Main(string[] args) {
        int x = 5, y = 10;
        Console.WriteLine($"Before swap: x = {x}, y = {y}");
        Swap(ref x, ref y); // pass by reference로 x와 y를 Swap 메서드에 전달
        Console.WriteLine($"After swap: x = {x}, y = {y}");
    }
}

추가:

C#에서 메소드 선언의 매개변수, 그리고 메소드 호출의 매개 변수 앞에 ref 기호를 붙이면 됩니다.다만 C#은 안정성을 위해 "입력 전용 매개 변수" in, "출력 전용 매개 변수" out 키워드를 많이 사용합니다. in과 out 모두 ref과 유사하지만 차이점이 있습니.

 

in 키워드는 매개변수를 읽기 전용으로 전달하고자 할 때 사용됩니다.

in 키워드를 사용하면 함수 내에서 해당 매개변수의 값을 변경할 수 없습니다.

in 키워드는 ref 키워드와 유사하지만, 함수 내에서 해당 매개변수를 초기화하지 않기 때문에 보다 안전하게 사용할 수 있습니다.

 

예를 들어, 다음과 같이 in 키워드를 사용하여 매개변수를 전달할 수 있습니다.

void Foo(in int x) {
    // x = x + 1; // 오류: 읽기 전용 매개변수
    Console.WriteLine(x);
}

int main() {
    int a = 1;
    Foo(in a);
}

 

out 키워드는 함수 내에서 새로운 값을 반환하고자 할 때 사용됩니다.

out 키워드를 사용하면 함수 내에서 해당 매개변수의 값을 변경할 수 있습니다.

out 키워드는 ref 키워드와 유사하지만, 함수 내에서 매개 변수에 값이 할당 안 되면 에러를 내뱉습니다.

void Bar(out int x) {
    x = 2;
}

int main() {
    int a;
    Bar(out a);
    Console.WriteLine(a); // 출력 결과: 2
}
저작자표시 비영리 변경금지 (새창열림)

'C# 프로그래밍' 카테고리의 다른 글

[C#] 컬렉션 초기화  (0) 2023.02.24
[C#] 일반화 컬렉션  (0) 2023.02.23
[C#] 컬렉션  (1) 2023.02.23
[C++][C#] 클래스 객체 인스턴스 생성  (0) 2023.02.22
프로퍼티  (0) 2022.10.31
    같은편
    같은편
    책을 통해 이때까지 블로그나 유튜브에서 얻었던 지식의 파편들을 정립하고 합쳐 단단한 발판으로 만들기 위한 블로그

    티스토리툴바