inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

유니티(Unity)로 시작하는 게임개발: Part 2. C# 프로그래밍 입문

구조체의 다른 선언방법과 생성자

생성자 질문드립니다

170

gw Lee

작성한 질문수 7

1

섹션 8 구조체의 다른 선언방법과 생성자에서

객체 생성 예를 들어주셨는데

StructPos pos=new StructPos();

의 new StructPos();를  

타입(구조체 or 클래스) 중심으로 양쪽으로 나눠서

new StructPos: 타입(구조체 or 클래스) 사이즈 메모리 생성 해서

pos 객체(변수=메모리 명칭)에 할당하고,

/ StructPos():  구조체 StructPos()의  멤버 변수 0으로 초기화 

이렇게 생각했는데 제 생각이 맞을까요?

unity C#

답변 1

2

UDevApp

안녕하세요.

저도 이문제로 고민을 많이 했는데요. 말씀하신 동작은 클래스의 동작입니다. 예를 들어서 구조체의 다음코드가 있으면 이 문장을 실행해보면 오류로 초기화가 실행되지 않았다고 나옵니다.

메모리가 없다는 내용이 아니고요.

// 1
StructPos pos;
print(pos);

이 상황에서 다음과 같이 해주면 정상 동작합니다.

// 2
StructPos pos;
pos.x = 1; pos.y = 2; pos.z = 3;
print(pos);

그리고 다음과 같이 해도 잘 실행됩니다. 구조체가 new 를 통해서 메모리가 생성된다고 생각하면 위에 있는 두번째 코드는 실행이 되면 안됩니다. 

// 3 
StructPos pos = new StructPos();
print(pos);

반면에 클래스의 경우는 다음과 같이 문장이 실행되면 인스턴스가 없다는 오류가 생깁니다.

//4
ClassPos cPos;
print(cPos);

아래의 문장도 마찬가지이고요. 

// 5
ClassPos cPos;
cPos.x = 1; cPos.y = 2; cPos.z = 3;
print(cPos);


​

클래스 같은 경우는 꼭 다음과 같이 new 를 붙여서 인스턴스를 만들지 않으면 실행이 안됩니다. 

// 6
ClassPos cPos = new ClassPos();
cPos.x = 1; cPos.y = 2; cPos.z = 3;
print(cPos);


​

그래서 저도 고민을 많이 했는데 내린 결론은요. 

구조체에서의 new StructPos(); 은 그냥 생성자의 호출입니다.

구조체의 경우는 값타입이라 그자리에 가보면 데이터가 있습니다. 즉 메모리생성이 이미 끝난 상태이고 초기화만 진행되면 되지만 이것을 new 로 해도 되는 이유는 클래스의 문법과 형식을 동일하게 만들기 위함이라고 생각합니다. (2번 코드에서 초기화를 진행하지 않으면 코드가 실행되지 않는다는 이야기는 초기화가 필요하지 메모리할당이 필요한 것이 아니라고 예상할수 있습니다)

클래스에서의 new ClassPos(); 은 생성자의 호출과 더불어 인스턴스의 메모리 생성입니다.

클래스의 경우 레퍼런스의 타입이라 말씀하신 대로의 내용대로 동작합니다. 클래스는 new로 만들지 않으면 실행이 되지 않습니다. 스택에 변수의 참조가 있고 이 참조가 힙에 있는 실제 데이터를 가르키고 있습니다. 

C# 언어 설계자들이 초보자들이 많이 접근하기를 원해서 같은 문법으로 다른 기능을 만들었다고 생각하고 있습니다. 초보자들의 입장에서 보기에는 혼돈스러울 경우 무조건 둘다 new 를 실행하면 되기 때문입니다. 구조체가 new로 실행되어도 메모리는 이미 초기화 되어 있는 상태이고 문법의 통일성을 위해서 new도 가능하다라는 것입니다. (4번코드나 5번코드가 실행이 안된다는 것을 보시고 오류 메시지를 보시면 이해가 될 것입니다.)

사실 언어도 프로그래밍의 산물입니다. C# 에서 선언한 스펙을 따라서 C# 언어가 만들어집니다. 닷넷버전에 따라서 구현의 상세 내용이 달라지기 때문에 실제의 구현된 메모리 구조는 저도 알지 못합니다. (제가 설명하는 메모리는 언어스펙에 따른 간략화딘 메모리구조입니다) 나중에 C# 어셈블리를 조금 공부해서 피씨용에서라도 메모리를 따라가 보고 이 내용을 다시 설명드리겠습니다만 우선 제가 알고 있는 내용은 이렇습니다. 

구조체는 어떻게 선언하든 메모리에 생겨납니다. 그저 초기화가 되었는지(new로 선언하여 생성자를 호출) 초기화가 되지 않았는지(그냥 변수로 선언) 의 차이가 있습니다.

클래스는 꼭 new로 선언해야 합니다. 메모리 할당이 이루어져야 하기 때문에 new 를 하지 않으면 실행이 되지 않습니다. 문법이 똑같은 이유는 초보자가 사용하기에 미심적으면 무조건 new 를 하면 되므로 이렇게 선언합니다. 

예를 들어 StructPos pos = StructPos(); 이 것이 없는 이유는 통일성이 없기 때문이라고 생각합니다.

공부해본 바로는 C#의 언어 설계의 철학이 내부로 들어가는 것은 어려워도 외부로 나오는 것들은 통일성 있게 보여주고자 하는 것이라고 판단하고 있습니다. 

C# 첫 질문이시네요. 정말 감사합니다. 좋은 하루 되십시오. ^^

Part4 유니티로 세가지의 게임만들기 강의도 들을 수 있는건가요?

0

263

1

플레이 버튼이 없어요

0

758

1

전체 연습문제 다운방법, 현재 연습문제 파일이 깨져서 열립니다.

0

377

2

연습문제파일

0

262

1

중단점을 찾을수가 없습니다

0

470

1

10분 24초에 만약 b를 0으로 둘시, "나눗셈이 불가능"대신 attempt to divide by zero 오류가 뜹니다.

0

313

1

if문의 비교(10분56초~59초사이)

0

219

1

NullReferenceException을 기대했는데....

0

326

1

C#에서의 메모리 관리

0

273

1

Heap 과 Stack

0

303

1

앞선 강의에서 Instance와 연관 지어서

0

270

3

Instance와 variable

0

243

1

구조체 6번째 강의

0

190

1

제공 함수는 실제 구현하는 몸체가 없다

1

343

1

인자와 매개변수

1

215

1

코드에서 new GameObject를 실행했을 때 유니티 화면상의 상태 문의

2

624

1

유니티 콘솔화면에 나타난 내용 문의

1

353

1

멤버변수를 전역변수라고 생각해도 되는지요?

1

1226

1

출력만 있는 함수 관련 질문

1

422

2

문제 파일은 어디에 있나요?

0

235

1

제 윈도우용 visual studio에서는 코드행 앞에 아무것도 안찍힙니다.

0

321

2

혹 강의내용을 캡쳐해서 블로그에 공개해도 되나요?

0

364

1

비쥬얼 스튜디오에서 강의대로 입력했는데 콘솔창에 아무것도 안나타나네요.

0

263

1

저는 윈도우즈에서 모니터를 두개로 나눠 강의영상과 Unity작업창으로 나눠서 하고 있는데 무슨 얘긴지 하나도 모르겠어요

0

230

2