참조 타입 (Reference Type)에 대한 정리이다.
C#에서 참조 타입이란 ?
값 타입은 값 자체를 복사해 객체에 저장하는 것 이라면
참조 타입은 객체 자체를 저장하는 것이 아니라,
객체가 존재하는 메모리 주소(참조)를 저장하는 타입이다.
Heap 메모리 영역에 할당 된다.
대표적인 참조 타입 :
- class
- array
- List, Dictionary
- string (특수한 참조 타입)
- Unity에선 GameObject, Component, Monobehaviour
🔹 특징 1. 대입하면 "객체" 가 아니라 "참조" 가 복사된다.
이 코드에서 a와 b는 서로 다른 변수지만 같은 객체를 가리킨다.
Player a = new Player(); Plyaer b = a;
값 타입이였다면, 값 자체를 복사하는 것이기 때문에 b만 100이 되었을 것이다.
하지만 참조의 경우 같은 객체를 가르키고 있기 때문에 어디에서 바꿔도 결과가 공유된다.
따라서 이런 일이 생긴다.b.HP = 100; Console.WriteLine(a.HP); // 100
🔹 함수 인자로 참조 타입을 넘기면?
함수에 전달된 것은 객체가 아니라 참조 값이다.
그 참조가 같은 객체를 가리키므로 객체 내부 상태 변경이 원본에도 반영된다.void Damage(Player p) { p.HP -= 10; } Player player = new Player { HP = 50 }; Damage(player); //결과 = player.HP == 40
1. 함수 인자로 굳이 넘겨야 하는 이유를 모르겠다.
참조 타입이기 때문에 함수 내부, 외부 어느곳에서 설정해도 값은 어처피 바뀌는것 아닌가?
해답
값을 변경하는것에 있어서는 인자로 안넘겨 주어도 상관 없다.
인자로 넘기는 방식을 쓰는 이유는 동작의 문제가 아니라 설계의 문제이다.
이유 1 : 의존성 명시
이유 2 : 재사용성
이유 3 : 테스트와 유지보수
이유 4 : 함수의 책임을 명확히 가능하다
- 참조 타입 변수는 객체가 아니라 참조를 저장한다.
- 대입/인자 전달 시 참조가 복사된다.
- 같은 객체를 가리키면 상태가 공유된다.
- new는 참조를 바꾸는 것이지, 객체를 수정하는것이 아니다.
- 값 타입은 항상 복사, 참조 타입은 관계 복사.