갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (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)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C#] 값 타입 vs 참조 타입(2)
프로그래밍/C#

[C#] 값 타입 vs 참조 타입(2)

2020. 1. 30. 20:18
728x90
반응형

1. int (System.Int32)

using System;

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

 

int는 값 타입일까? 참조 타입일까?
값 타입이라면 n2는 10이 될 것이고, 참조 타입이라면 n2는 1이 될 것이다.
int의 정의를 따라가면 int는 struct로 만들어 진것을 볼 수 있다.
따라서 값 타입으로 n2는 10이 된다.

 


2. array (System.Array)

using System;

class Program {
    public static void Main() {
        int[] arr1 = {1, 2, 3};
        int[] arr2 = arr1;
        
        arr2[0] = 10;
        Console.WriteLine(arr1[0]);
    }
}

 

위의 코드에서 arr2 = arr1; 에서 arr1의 배열을 그대로 복사할까?
그림으로 값 타입일 경우와 참조 타입일때의 모습을 보자.

위의 그림은 위는 값 타입일 경우, 아래 그림은 참조 타입일 경우의 모습을 나타냈다.
Int와 마찬가지로 array에서 정의로 이동해보면 array는 class인 것을 확인할 수 있다.
따라서 아래 그림이며 결과값은 10임을 볼 수 있다.

 


3. string (System.String)

using System;

class Program {
    public static void Main() {
        string s1 = "Hello";
        string s2 = s1;
        
        s2 = "world";
        Console.WriteLine(s1);
    }
}

 

마지막으로 string이다.
바로 정의로 이동해보면 string은 class인 것을 알 수 있다.
그렇다면 모습은 아래 그림처럼 될 것이다.

따라서 결과값은 world가 나와야 정상일 것 같다.
하지만 결과를 출력해보면 여전히 "Hello"가 찍히는 것을 볼 수 있다.
왜 이런 결과가 나오게 되는 걸까?
사실 아래에 써있다시피 s2 = "world" 의 의미가 다르다.
using System;

class Program {
    public static void Main() {
        string s1 = "Hello";
        string s2 = s1;
        
        s2 = "world"; // s2 = new stirng("world");
        Console.WriteLine(s1);
    }
}

 

그림으로 보면 아래와 같다.

 


4. value type / referece type 을 조사하는 방법

using System;

class Program {
    public static void Main() {
        int[] arr = {1, 2, 3};
        
        Type t = arr.GetType();
        
        Console.WriteLine(t.IsValueType);
        
        
        int n = 1;
        
        Type t2 = n.GetType();
        
        Console. WriteLine(t2.IsValueType);
    }
}

 ① value type / referece type을 조사하는 방법

    => C#의 모든 타입에는 GetType() 메소드가 있다.

    => Type 클래스의 isValueType 속성으로 확인

728x90
반응형

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

[C#] Nullable<T>  (0) 2020.02.04
[C#] 동등성 (Equality)  (0) 2020.02.04
[C#] 값 타입과 참조 타입(1)  (1) 2020.01.22
[C#] System.Object  (0) 2020.01.21
[C#] 타입과 변수의 특징  (0) 2020.01.20
    '프로그래밍/C#' 카테고리의 다른 글
    • [C#] Nullable<T>
    • [C#] 동등성 (Equality)
    • [C#] 값 타입과 참조 타입(1)
    • [C#] System.Object
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바