강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

정현종님의 프로필 이미지
정현종

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘

연결 리스트 구현 연습

궁금한점이 몇가지가 있는데요..

작성

·

257

0

6강. 연결리스트 구현연습 동영상의 [07:30] 부분에서

 위쪽에 class Room<T> 이렇게 코딩하시고

그 아래에

class RoomList<T>

{

       public Room<T> Head;

       ~~

}

이렇게 코딩하셨는데

궁금한점이 Room<T>를 클래스가 다른데 그냥

RoomList<T> 의 중괄호 안으로 가져올수 있는건가요?;;

그리고 첫부분에서 

class Room

{

      public Room Next;

}

이렇게 됬을때 참조한다고 하셨는데

좀더 구체적으로 설명해주실수 있을까요??

답변 3

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

안녕하세요

질문주신걸 보니 거의 80%까지 근접하신 것 같네요.

Q) class Room {  Room Next; } 에서 Room의 주소값을 Next에 저장한다는 것인지?

맞긴 한데 약간 헷갈려 하시는 부분이 있는 것 같네요,.

딱히 class Room { Room Next; }가 아니더라도, C#에서 class는 무조건 참조형으로 사용됩니다.

즉 Room r = new Room(); 을 하게 되면 실제 데이터가 r 변수에 있는게 아니라,

Room의 주소값이 r이라는 변수에 저장되고,

실제 데이터는 힙 영역이라는 멀~리 있는 공간에 저장되어 안전하게 보관됩니다.

이게 참조(reference)의 개념이고 C++로 치면 포인터와 유사하죠.

따라서 class Room { Room Next; }의 경우,

[Room이라는 데이터 안에, 또 다른 Room의 주소를 저장하겠다]는 의미가 됩니다. (본인의 주소라는 보장은 X)

어떤 상자 A를 열어서 내용물을 보니, 다음 상자 B의 위치를 메모로 남겨둔 느낌이랄까요?

Q) Generic 관련

Generic을 정의할 때는 <> 안에 "조커 카드"가 될 이름을 지어서 넣어주는데,

참고로 <T>로 하는 경우가 많지만 <CowLevel> 이런식으로 다른 이름으로 만들어도 상관없습니다.

class Room<T> 와 같이 정의했으면,

class Room<T> { } 범위 안에서 T를 마치 고정된 형식처럼 사용할 수 있게 됩니다.

다만 사용할 때는 실제 존재하는 형식을 넣어주셔야 합니다.

따라서 Room<T> newRoom = new Room<T>();  이건 안 되고,

Room<int> newRoom = new Room<int>() 이건 됩니다.

class RoomList<T> { Room<T> room; } 이 되었던 것은,

RoomList<T> 자체도 Generic이기 때문에,

RoomList 클래스 정의 내에서는 T를 고정된 형식처럼 사용할 수 있기 때문입니다.

0

정현종님의 프로필 이미지
정현종
질문자

음... 잘 이해가 안되네요.. ㅠㅠ

참조형설명에서

class Room

{

       Room Next;

}

이렇게 되어있다면, Room의 주소값을 Next에 저장한다는 뜻인가요?;;

그리고 제네릭 설명부분에서는

제가 알기로는 class는 커스텀 자료형이라고 알고있는데

(제네릭 클래스는 처음보네요)

public Room<T> Head = null;

-> 이 코드는 커스텀 자료형 Room<T>를 쓴것이고,

Room<T> newRoom = new Room<T>(); 

-> 이 코드는 객체를 찍어낸게 맞나요??

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

안녕하세요, 

클래스 옆에 <T>가 붙은걸 Generic (일반화) 형식이라고 하는데,

"나중에 실제로 사용할 때 <> 안에 있는 T를 정확히 알려주겠다!"는 의미로 선언한다고 보시면 됩니다.

한마디로 <T>는 조커 카드처럼 무엇이든 들어갈 수 있기 때문에,

나중에 실제로 사용할 때 Room<int>, Room<float> 이런 식으로 T를 지정해서 사용하면 됩니다.

RoomList<T>의 경우, 어차피 RoomList를 실제로 사용할 때 T를 지정해서 알려줄 것이고,

그 시점에서 Room<T>의 T도 같이 정해져서 만들어지니, 문법적으로 아무런 문제가 없습니다.

ex.) RoomList<int>을 사용하면, T = int이니, RoomList<int> 안에 Room<int>를 들고 있게 됨.

한마디로 요약하면 저렇게 사용할 수 있는건 RoomList도 Generic 형식이기 때문에 가능한겁니다.

두번째로 참조에 관한 질문을 주셨는데,

C++이나 C#이나 값/참조의 개념을 이해하는게 매우 중요합니다.

C#에서 struct는 값 형식이고, class는 참조 형식입니다.

값 형식에서는 변수 안에 실제 데이터가 진짜로 들어있고,

참조 형식에서는 변수 안에 존재를 알 수 없는 묘한 숫자만 들어있으며,

실제 데이터는 그 숫자에 해당하는 [메모리 주소]에 가면 있습니다.

이해를 돕기 위해 아래 메모리 분석 그림을 보시면,

값 형식인 r1 이라는 바구니 안에 실제로 int 두개가 (1과 1)이 들어있는 반면,

참조 형식인 r2이라는 바구니 안에는, r1과는 다르게 0x000002d2a6bcab60이라는 엉뚱한 숫자가 들어있습니다.

그리고 실제 데이터 (2과 2)는 0x000002d2a6bcab60 주소에 가보면 근처에 있는 것을 볼 수 있습니다.

정현종님의 프로필 이미지
정현종

작성한 질문수

질문하기