갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (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# Thread
  • 롤 골드그래프
  • 유니티 그래프
  • c# unboxing
  • c# delegate
  • pc 게임 순위
  • c# collection
  • C++ 소멸자
  • C++
  • 글로벌게임매출
  • c# 코루틴
  • 모바일 게임 순위
  • C# 예외 처리
  • pc게임 순위
  • 게임 디자인 패턴
  • 전세계 게임 매출
  • 유니티 그래프 그리기
  • 알고리즘
  • C++ virtual
  • 강남 방탈출
  • 게임 매출 순위
  • c# coroutine
  • 전세계게임매출순위
  • 자바
  • C# boxing
  • 2020년 게임 매출
  • C++ 상속
  • Unity Graph

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

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

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

2020. 2. 17. 15:55
728x90
반응형

1. 참조 타입과 매개 변수 전달

using System;

class Point {
    public int x = 0;
    public int y = 0;
    public Point(int a, int b) { x = a; y = b; }
}

class Program {
    public static void f1(Point p) { // Point p = p1
        p.x = 2;
    }
    
    public static void Main() {
        Point p1 = new Point(1, 1);
        f1(p1);
        Console.WriteLine(p1.x);
    }
}

 

Point 클래스가 있고 메인함수에서 p1 객체를 만든 후 p1객체의 멤버변수인 x를 2로 바꾸고 출력해보는 코드이다.
앞선 int와 같은 값타입과 다르게 참조타입인 class는 인자를 전달해 줄때와 받을 때 ref를 붙이지 않아도 될까?
그림으로 먼저 살펴보자.

먼저 객체를 생성하면 위와 같은 그림이 된다.
여기서 16번째 라인의 f1(p1); 코드를 실행하면
인자를 전달받을 때 Point p = p1 과 같은 코드를 실행하고 복사본을 만들게 된다.
그런데 이 복사본은 값을 들고 있는게 아닌 p1과 같이 주소를 복사한다.
따라서 이 주소는 같은 값을 바라보게 된다.

코드를 살짝 바꿔보자.

 

using System;

class Point {
    public int x = 0;
    public int y = 0;
    public Point(int a, int b) { x = a; y = b; }
}

class Program {
    public static void f1(Point p) {
        p.x = 2;
        p = new Point(5, 5);
    }
    
    public static void Main() {
        Point p1 = new Point(1, 1);
        f1(p1);
        Console.WriteLine(p1.x);
    }
}

 

f1 메소드 안에 새로운 객체를 만드는 코드가 추가되었다.
그렇다면 결과값이 여전히 2로 나올까? 아니면 새로운 객체를 만들었으니 5로 나올까?
이것도 그림으로 먼저 보면 쉽다.

새로운 객체를 만들게 되지만 결국 p1이 가리키는건 변하지 않기에 결과값은 그대로 2로 나온다.
이번에는 ref를 붙여서 다른 예제를 보자.

 

using System;

class Point {
    public int x = 0;
    public int y = 0;
    public Point(int a, int b) { x = a; y = b; }
}

class Program {
    public static void f1(ref Point p) { // ref Point p = ref p1
        p.x = 2;
        p = new Point(5, 5);
    }
    
    public static void Main() {
        Point p1 = new Point(1, 1);
        f1(ref p1);
        Console.WriteLine(p1.x);
    }
}

 

전과 동일한 코드에서 ref를 붙였다. 
위의 그림과 어떤 차이가 있을 지 그림으로 다시 살펴보자.

그림이 바뀐 부분은 p1의 복사본이 p가 되는게 아닌 p가 만들어지고 p1을 가리킨다는 점이다.
p의 값이 바뀌면 p가 가리키는 p1이 가리키는 값을 바꾸어 전과같이 x가 2로 바뀌게 된다.
이제 12번 라인의 코드가 실행됬을 때 어떻게 변하는지 보자.

p가 새로운 객체를 만들어 넣었는데 이 p가 가리키는게 p1이므로 결국 p1이 새로운 객체를 가리키게 된다.
따라서 결과값은 이제 2가 아닌 5가 나온다.

 

 ① 참조 타입을 값으로 전달하면 객체의 상태를 변경할 수 있지만 새로운 객체를 담아 올 수는 없다.

 

 ② 참조 타입을 ref로 전달하면 객체의 상태를 변경할 수 있고 새로운 객체도 담아 올 수 있다.

728x90
반응형

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

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

    티스토리툴바