갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • c# coroutine
  • C++
  • C# 예외 처리
  • c# collection
  • c# 코루틴
  • C++ 상속
  • pc게임 순위
  • Unity Graph
  • C# boxing
  • 전세계게임매출순위
  • 자바
  • 유니티 그래프
  • C++ virtual
  • C++ 소멸자
  • c# unboxing
  • 게임 매출 순위
  • c# delegate
  • 2020년 게임 매출
  • pc 게임 순위
  • 알고리즘
  • 강남 방탈출
  • 전세계 게임 매출
  • 유니티 그래프 그리기
  • 게임 디자인 패턴
  • 글로벌게임매출
  • c# Thread
  • 롤 골드그래프
  • 모바일 게임 순위
  • 게임매출순위
  • 유니티 골드그래프

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C#] 인자 전달 방식 (1)
프로그래밍/C#

[C#] 인자 전달 방식 (1)

2020. 2. 15. 16:21
728x90
반응형

1. ref local variable

using System;

class Program {
    public static void Main() {
        int n1 = 10;
        int n2 = n1;
        
        n2 = 20;
        
        Console.WriteLine($"{n1}, {n2}");
        
        int n3 = 10;
        ref int n4 = ref n3;
        
        n4 = 20;
        
        Console.WriteLine($"{n3}, {n4}");
    }
}

C# 문법 중
ref int n4 = ref n3;
값 타입 앞에 ref 라고 붙이는 문법이 있다.
이렇게 만들면 정수형 변수를 만들지만 일반 변수가 아닌, 참조 변수로 만들겠다. 라는 뜻이다.
따라서 값을 직접 들지 않고 주소를 가지고 있다.
나중에 덩치가 큰 구조체를 만들었는데 코딩하며 복사본이 생기는 상황은 안 좋을텐데
그러한 상황에서 주소를 가지게 되면 효율적으로 사용할 수 있게된다.

2. 매개 변수 전달 방식 #1

using System;

class Program {
    public static void inc1(int n) { ++n; }
    // int n = n1
    
    public static void Main() {
        int n1 = 10;
        
        inc1(n1);
        
        Console.WriteLine(n1);
    }
}

 

위의 코드는 정수를 전달하면 inc1 함수를 통해 1이 증가된 값을 출력해보는 코드이다.
처음 n1을 10으로 선언하고 inc1함수의 인자로 n1을 전달했다.
결과값은 11이 되야할 것 같지만 막상 실행해보면 여전히 결과는 10임을 볼 수 있다.
이는 인자를 전달하며 새로운 n이라는 객체가 만들어지고 그 객체가 증가하여
n1은 그대로인 상황이다. 그림으로 보면 아래와 같다.

그렇다면 위의 코드를 의도대로 돌게 하려면 어떻게 수정해야 할까?
using System;

class Program {
    public static void inc1(ref int n) { ++n; }
    
    public static void Main() {
        int n1 = 10;
        
        inc1(ref n1);
        
        Console.WriteLine(n1);
    }
}

 


3. 매개 변수 전달 방식 #2

using System;

class Program {
    // 메소드로부터 2개의 결과 값을 반환 받고 싶다.
    public static int prev_next_number1(int n) {
        return n - 1;
    }
    
    public static void Main() {
        int n1 = 10;
        int result2 = 0;
        
        int result1 = prev_next_number1(n1);
        
        Console.WriteLine($"{result1}, {result2}");
    }
}

 

위의 코드의 prev_next_number1 메소드를 통해 결과값을 result1, result2 두 개에 전달하고 싶다.
하지만 결과값 리턴은 하나만 가능하다. 어떻게 해야 할까?
using System;

class Program {
    // 메소드로부터 2개의 결과 값을 반환 받고 싶다.
    public static int prev_next_number1(int n, ref int r) {
        r = n - 1;
        return n - 1;
    }
    
    public static void Main() {
        int n1 = 10;
        int result2 = 0;
        
        int result1 = prev_next_number1(n1, ref result2);
        
        Console.WriteLine($"{result1}, {result2}");
    }
}

 

위에서 result2는 뭔가를 전달하기보단 꺼내오려고 쓰고 있는데
이러한 인자를 out parameter라고 한다. 이럴 때는 아래와 같이 조금 더 낫게 고칠 수 있다.
using System;

class Program {
    // 메소드로부터 2개의 결과 값을 반환 받고 싶다.
    public static int prev_next_number1(int n, out int r) {
        r = n - 1;
        return n - 1;
    }
    
    public static void Main() {
        int n1 = 10;
        int result2 = 0;
        
        int result1 = prev_next_number1(n1, out result2);
        
        Console.WriteLine($"{result1}, {result2}");
    }
}

 

위의 두 개의 코드에서 ref로 적는 것과 out으로 적는것의 차이점은 무엇일까?

728x90
반응형

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

[C#] 가변 길이 매개 변수 (params)  (0) 2020.02.26
[C#] 인자 전달 방식 (2)  (0) 2020.02.17
[C#] 다차원 배열, 가변 배열  (1) 2020.02.14
[C#] 배열 기본  (0) 2020.02.14
[C#] Boxing / Unboxing (3)  (1) 2020.02.11
    '프로그래밍/C#' 카테고리의 다른 글
    • [C#] 가변 길이 매개 변수 (params)
    • [C#] 인자 전달 방식 (2)
    • [C#] 다차원 배열, 가변 배열
    • [C#] 배열 기본
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바