그린티라떼
개발공간
그린티라떼
전체 방문자
오늘
어제
  • 분류 전체보기 (26)
    • unity (6)
      • 개발 (4)
      • iTween (0)
      • error (2)
    • 게임서버 (5)
    • C++ (7)
      • 문법 (5)
      • 알고리즘 (2)
    • C# (5)
    • CS지식 (1)
    • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • var
  • Gradle build failed
  • Functions
  • Delegate
  • 일반화컬렉션
  • Container
  • 유니티 빌드 에러
  • cs지식
  • 일반화
  • 형식매개변수의 제약
  • Dynamic
  • delegate chain
  • interface
  • 다중상속의 문제점
  • 유니티
  • 컨테이너
  • 함수호출
  • unity
  • 메모리영역
  • C++
  • 데이터타입
  • c#
  • regex
  • property
  • object
  • 정규 표현식
  • 제네릭
  • inline 함수
  • cout 스트림 버퍼
  • 함수 호출 오버헤드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
그린티라떼

개발공간

C#

C#) var & dynamic & object

2022. 1. 13. 19:46

var

C# 3부터 메서드 범위에서 선언된 변수에 암시적 “형식” var을 사용할 수 있다. 암시적 형식 지역 변수는 형식을 직접 선언한 것처럼 강력한 형식이지만 컴파일러가 형식을 결정한다. i의 다음 두 선언은 기능이 동일하다.

var i = 10; // Implicitly typed.
int i = 10; // Explicitly typed.

var사용에는 제약이 있다.

1. 예를 들어 string으로 선언된 var형 변수는 다른 타입으로 변경할 수 없다.

2. var타입으로 선언된 변수는 한 번 이상 무조건 값을 넣어야 한다.

 

dynamic

위의 var 타입에 대한 문제를 해결해주는 것이 dynamic 이다.

dynamic은 항상 런타임 시에 데이터 타입을 결정하게 된다.

dynamic i;
i = 101;  //success
i = "string type!"; //success

dynamic 타입은 내부적으로 object 타입을 사용한다.

dynamic을 남용하다가는 문제가 생길 수 있는데 그 이유는 아래 object에서 설명해주겠다. 

 

object

var의 형식은 직접 선언한 것처럼 강력한 형식이지만, object의 형식은 object이다.

꺼내 쓸 때마다 캐스팅을 해줘야 한다.

objcet obj1 = 3;
objcet obj2 = "string type";

int num = (int)obj1;
string str = (string)obj2;

변수를 선언할 때 전부 object, dynamic을 사용하면 편하지 않을까라는 생각을 할 수도 있도 있지만, 단점도 존재한다.

내부적으로 object는 힙에 메모리를 할당한 후 값을 저장시키고, 꺼내올 땐 힙에 있는 값을 빼와 스택에 저장시키는 참조타입이다.

(덕타이핑이라고도 한다.)

이러한 동적인 동작 때문에 느려질 수 있다.

 

'C#' 카테고리의 다른 글

C#) delegate 대리자  (0) 2022.01.14
C#) property  (0) 2022.01.13
C#) interface 인터페이스  (1) 2022.01.13
C#) Generic 일반화  (0) 2022.01.13
    'C#' 카테고리의 다른 글
    • C#) delegate 대리자
    • C#) property
    • C#) interface 인터페이스
    • C#) Generic 일반화
    그린티라떼
    그린티라떼

    티스토리툴바