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

꿈냥이 님의 프로필 이미지

작성한 질문수

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

연결 리스트 구현 연습

코드 질문입니다

해결된 질문

작성

·

297

1

class Room<T>
    {
        public T data;
        ① public Room<T> Next ; 
        ② public Room<T> Prev ;  
  }

class RoomList<T>
    {
        ③ public Room<T> Head =  null;
        ④ public Room<T> Tail = null;  

        public int count = 0;

        public Room<T> AddLast(T data)
        {
           ⑤ Room<T> NewRoom = new Room<T>();
        }
    }


[1] 5번은 생성자 호출로 객체(NewRoom)를 만들었는데 1~4번은 왜 생성자 호출이 없는지 궁금합니다ㅠ

[2] 그리고 위 2개의 Class안에 생성자가 있어야 하는것 아닌지요? 그러니까 . . . 
class Room<T> {  public Room<T>(){ ... } →생성자  }
이런 식으로  있어야 하는거 아닌가 해서요ㅠ ( 아 기본생성자는 자동으로 만들어지기 때문인게 답일까요? )

답변 4

1

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

생성자 호출없이 만든게 아니고, 아직 안 만들고 비워둔 상태입니다.
Next, Prev, Head, Tail 모두 null (없는) 상태이고
뒤늦게 다른 함수에서 new해서 만들어진 객체를 연결하는 것이죠.

1

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

우선 유의 깊게 살펴봐야 되는 부분이,
class란 일종의 설계도에 해당합니다.
가령 class Room에 data, Next, Prev란 멤버 변수들이 있는데
이는 Room이라는 객체를 만들면,
같이 메모리에 포함되어 들어가는 변수라고 보면 됩니다.
예를 들어 스타크래프트 마린을 생성하면, hp=40이고 공격력=6이고 이런 수치들이 있겠죠?

반면 함수 내부 코드에서 변수를 만들고 Room<T> newRoom = new Room<T>();
과 같은 형태로 만들 때는, 완전 얘기가 달라집니다.
이는 class 바로 안에 들어간게 아니라,
함수 내부에서 선언된 변수이기 때문이죠.
함수는 일종의 동작 (코드 로직)이라 생각하면 편한데,
그 과정에서 잠시 사용할 변수들을 만들 수 있으며
그렇게 때문에 함수 내부에서 선언된 변수들은
class 직속 변수들처럼 class 설계도에는 포함되지 않습니다.
위에서 newRoom은 함수() 내부에서만 사용할 수 있는 임시 변수라고 생각하시면 됩니다.
그래서 결과적으로 해당 코드가 실행되면, 메모리에 새로운 Room 객체가 생성되고,
이를 함수 내부에서 newRoom이라는 이름으로 접근할 수 있는 상태가 되는 것입니다.

마지막으로 시리즈가 별도의 선수지식은 가정하진 않지만
그렇다고 아예 0부터 시작하는 초보 용도로 만들어진 것은 아니라,
코딩 기초가 없으면 따라가기 매우 벅찬게 맞습니다.
다른 C# 기본서를 하나 같이 보시는 것을 추천 드립니다.

0

꿈냥이 님의 프로필 이미지
꿈냥이
질문자

감사합니다!

0

꿈냥이 님의 프로필 이미지
꿈냥이
질문자

네, 감사합니다! 함수내에서 Class의 객체를 만들면 함수 내에서만 임시적으로 사용한다는거군요. 말씀해주신 부분은 이해를 하였는데요. 
그런데, 1~4번에서는 클래스형 인스턴스를 선언하면서 생성자 호출없이 어떻게 만들수 있는지... 특히 3, 4번의 경우는 생성자 호출(→힙에 공간할당→인스턴스 생성)없이 Null이라는 값을 넣었는데요. 이런 부분들이 문법적으로 쉽지는 않은데, 일단은 좀 더 공부해보도록 하겠습니다. 감사합니다!