[공부] 261022 - 유니티 및 C#

강현구
∙∙조회 2

쿠키런 게임 과제

https://github.com/makerz9/CookieRun.git

총평

-경험은 있는거같으나 코딩 구조 공부 더 필요

-오류가 있을 가능성이 있거나 중복 기능이많음

-안쓰는 코드는 주석처리해도 그냥 지우기 추천

-코드가 어떻게 동작하는지 더 자세히 알 필요 있음

 


C#

구분복사되는 것한쪽을 바꾸면?
struct (값 복사)값 자체다른 쪽은 안 바뀜
class (참조 복사)객체를 가리키는 참조같은 객체의 내용을 바꾸면 다른 쪽에서도 바뀐 걸 볼 수 있음
  • 값 복사 = 각각 따로 가진다 → struct
  • 참조 복사 = 같은 객체를 가리킬 수 있다 → class

값 타입과 참조 타입

변수가 담고 있는 것

C#의 모든 타입은 둘 중 하나임.

분류변수가 담는 것예
값 타입내용 자체int, double, bool, char, decimal, 구조체, 열거형
참조 타입내용이 놓인 자리클래스, 배열, string, 인터페이스

 

즉, class와 struct의 차이를 이해할 때는 코드가 어디에 작성되어 있는지가 아니라, 지금 대입하는 변수의 타입이 무엇인지를 봐야 해.

 

https://www.notion.so/4016a544837b80efa54ddee5df914117?source=copy_link

C# 기초 정리 — 값 형식과 참조 형식

1. 값 형식(Value Type) - struct

값 형식은 변수에 값 자체가 저장되는 형식이다.

대표적인 예시:

  • int
  • float
  • bool
  • struct로 선언한 사용자 정의 형식

예제

ini
struct Name
{
    public int a;
}

Name n1 = new Name();
n1.a = 10;

Name n2 = n1;
n2.a = 99;

Console.WriteLine(n1.a);
Console.WriteLine(n2.a);

실행 결과

plain text
10
99

실행 과정

  1. n1을 생성하고 n1.a에 10을 저장한다.
  2. Name n2 = n1;에서 n1의 구조체 값이 n2로 복사된다.
  3. n2.a = 99;로 n2의 값을 변경한다.
  4. n2는 복사된 별개의 값을 가지고 있으므로 n1.a에는 영향이 없다.

핵심: 구조체를 대입하면 값이 복사된다.


2. 참조 형식(Reference Type) -class

참조 형식은 객체 자체가 아니라 객체를 가리키는 참조를 변수에 저장한다.

대표적인 예시:

  • class로 선언한 사용자 정의 형식
  • string
  • 배열

예제

ini
class Name
{
    public int a;
}

Name n1 = new Name();
n1.a = 10;

Name n2 = n1;
n2.a = 99;

Console.WriteLine(n1.a);
Console.WriteLine(n2.a);

실행 결과

plain text
99
99

실행 과정

  1. new Name()으로 객체를 생성한다.
  2. n1이 해당 객체를 가리킨다.
  3. Name n2 = n1;에서 객체가 복사되는 것이 아니라 참조가 복사된다.
  4. 따라서 n1과 n2는 같은 객체를 가리킨다.
  5. n2.a = 99;로 객체의 필드를 변경하면 n1.a로 접근해도 변경된 값인 99가 나온다.

핵심: 클래스 변수를 대입하면 참조가 복사되며, 두 변수가 같은 객체를 가리킬 수 있다.


3. class와 struct 비교

구분structclass
형식값 형식참조 형식
대입할 때값이 복사됨참조가 복사됨
위 예제의 n1.a1099
위 예제의 n2.a9999

가장 중요한 점

a는 두 예제 모두 int 필드다. a 자체의 형식은 바뀌지 않는다.

차이는 Name이라는 사용자 정의 형식을 struct로 선언했는지, class로 선언했는지에 있다.

  • struct Name → Name은 값 형식
  • class Name → Name은 참조 형식

즉, class와 struct의 차이는 중요하다. 선언 방식에 따라 Name 변수의 대입 동작이 달라진다.


4. 코드에서 헷갈리지 말아야 할 부분

Name n2 = n1;

이 한 줄의 의미는 Name이 어떻게 선언되었는지에 따라 달라진다.

  • struct Name이면: n1의 값이 n2에 복사된다.
  • class Name이면: n1이 가리키는 객체의 참조가 n2에 복사된다.

따라서 이 코드만 보고 결과를 판단하지 말고, 먼저 Name의 선언을 확인해야 한다.

n2.a = 99;

이 코드는 n2를 통해 접근한 a의 값을 99로 변경한다.

  • 구조체라면 복사된 n2의 필드만 변경된다.
  • 클래스라면 n1과 n2가 같은 객체를 가리키고 있을 경우, 두 변수로 접근했을 때 모두 변경된 값이 보인다.

5. 오늘의 핵심 요약

  1. int는 값 형식이다.
  2. struct는 값 형식이다.
  3. class는 참조 형식이다.
  4. 구조체 대입은 값을 복사한다.
  5. 클래스 대입은 참조를 복사한다.
  6. 클래스 변수 두 개가 같은 객체를 가리키면, 한쪽에서 객체의 필드를 바꿨을 때 다른 쪽에서도 변경된 값이 보인다.
  7. 결과를 판단할 때는 변수의 선언과 사용자 정의 형식의 선언을 함께 확인한다.

확인 문제

struct Name을 class Name으로 바꾸면 위 예제의 출력 결과는 어떻게 달라질까?

  • struct Name: 10, 99
  • class Name: 99, 99

struct → class 라면 참조 타입이 되겠지 그러면 99, 99?