• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

구조체 6번째 강의

21.04.28 03:43 작성 조회수 79

0

구조체 6번째 강의에서는 구조체를 선언할 때는 초기화가 필수 라고 하셨는데

여기선 반대로 말씀하시는 것 같아서 어떤게 맞는건지 궁금합니다

답변 1

답변을 작성해보세요.

0

안녕하세요. 

둘다 초기화가 필수입니다. 

그런데 꼭 new 와 생성자를 사용해서 초기화를 해야 합니다. 

ClassPos cpos; 만 사용해서는 클래스가 실행되지 않습니다.

(구조체는 이렇게 사용하고 대입해서 사용가능합니다)

클래스는 아래와 같이 꼭 생성자와 new 를 사용해서 해야 클래스가 동작합니다. 

cPos = new ClassPos();

한줄로 사용할때는 ClassPos cPos = new ClassPos(); 라고 해도 동작하고요. 

구조체의 경우에도 StructPos sPos = new StructPos(); 로 해도 동작하지만 클래스의 경우에는 레퍼런스와 실제 데이터가 생겨나고 클래스의 경우에는 기본타입(int 등)과 같은 형태의 실제 데이터만 생겨납니다.

(내부적인 동작이 다릅니다)

이게 처음 보실때 혼란스러울수 있는데 같은 문법을 사용해서 사용하는데 내부적인 동작이 달라지는 현상들이 많습니다. C#의 특징중 하나라고 생각하고 있습니다. 

질문하신 내용의 답변중의 하나로 생성자가 초기화를 담당하는 함수입니다. 값을 새로 하나하나 대입하는 것도 초기화이지만 생성자 자체를 사용하는 것도 초기화입니다. (내부적으로 멤버변수들이 기본생성자가 실행되면 초기화 되는 것으로 알고 있습니다)

Hyobin Kim님의 프로필

Hyobin Kim

질문자

2021.04.30

그럼 값형식들은 new랑 생성자 없이도 껍데기랑 본체(실제 데이터)가 스택에 생겨서 바로 값만 넣어주면 되고

참조형들은 일단 변수 생성만 하면, 스택에 껍데기만 생성이 되고 본체는 아직 힙에 생기지 않은 상태이며, new랑 생성자를 실행했을 때 비로서, 힙에 본체가 생겨나고 껍데기와 본체사이에 연결이 이뤄지는 거겠네요? 그리고 이걸 참조라고 부르고요

네 멤버변수의 경우에도 동일하게 동작합니다. 그런데 멤버변수는 스택에 생겨나지 않고 함수안에서 있는 변수만 스택에 생겨납니다. 

그래서 값타입(구조체, 기본타입변수)은 데이터 그대로 생겨나고 클래스타입들은 껍데기랑 본체가 같이 생겨난다고 보시면 됩니다 .

전에 질문하신 이 그림을 한번 더 보시면 "스택은 함수안에서 생겨납니다" 저기 있는 노란 사각형이 스택영역입니다. 

나중에 강의를 좀 추가해야 겠네요. 

https://www.inflearn.com/questions/202436