본문 바로가기

프로그램/유니티 C# 강좌

[유니티 C# 강좌] 2. 데이터 형식(Data Type), 변수(Variable), 상수(Constant)

728x90
반응형

1. 데이터 형식(Data Type)

 

프로그래밍은 데이터를 조작하여, 원하는 작업을 수행하는 일련의 작업입니다.

여기서 데이터는 프로그램에서 처리되는 어떤 의미를 가지는 숫자, 문자, 기호 등입니다.

데이터 형식이란 이 데이터가 어떤 종류(숫자, 문자, 기호 등)의 데이터인지를 정의해 주는 것입니다.

 

 

1.1 값 형식(Value Type), 참조 형식(Reference Type)

 

1.1.1 값 형식, 참조 형식

 

C# 형식은 값 형식과 참조 형식이 있습니다.

값 형식의 변수는 해당 데이터가 직접 포함되지만, 참조 형식의 변수에는 데이터(객체라고도 함)에 대한 참조가 저장됩니다.

값 형식은 변수에 데이터의 사본이 들어 있기 때문에 변수의 값이 바뀌어도 영향을 별로 미치지 않지만(ref, out 매개변수는 예외), 참조 형식은 두 가지 이상의 변수가 같은 객체를 참조할 때에는 한 변수의 작업이 다른 변수에 영향을 미칠 수 있기 때문에 주의하여야 합니다.

 

코더제로 유니티 C# 강좌 데이터 형식(Data Type), 변수(Variable), 상수(Constant) 값 형식 vs. 참조 형식
그림. 값 형식 vs. 참조 형식

 

위의 그림은 값 형식의 경우 int age = 45;라고 변수 선언 후 할당을 하면 메모리 스택의 어느 주소에 값이 할당되고,

string name = "Coder zero"; 라고 변수 선언 후 할당을 하면 먼저 메모리의 힙 영역의 어느 주소에 변수의 주소가 할당이 된 후 그 주소가 가르치는 메모리의 주소에 값이 할당 됩니다.

 

 

1.1.2 메모리 영역

 

C#은 두 가지 메모리 영역을 사용하는데, 스택(Stack), 힙(Heap)입니다.

 

스택에는 값 형식 데이터를 저장됩니다.

스택은 차례대로 데이터를 저장하였다가, 사용이 끝나면 데이터를 모두 제거합니다.

 

에는 참조형식 데이터를 저장됩니다.

힙은 데이터를 다 사용 후 제거하는 메커니즘을 가지고 있지 않기 때문에, 가비지 켈렉터(Garbage Collector)를 사용하여 제거합니다.

가비지 켈렉터는 개발자가 별도로 신경을 쓰지 않아도 된다는 편안함을 제공하지만, 가끔 가비지 켈렉터 실행 시 프로그램이 느려지는 문제점이 있습니다.

 

 

1.2 C# 데이터 형식

 

다음은 C#의 형식 시스템의 데이터 형식입니다.

 

종류 내용
값 형식 단순 형식 부호 있는 정수 sbyte -128, 127
short -32768, 32767
int -2147483648, 2147483647
long 9223372036854770000
부호 없는 정수 byte 0, 255
ushort 0, 65535
uint 0, 4294967295
ulong 18446744073709500000
유니코드 문자 char a', 'b'
IEEE 이진 부동 소수점 float 0, 12, 3.45
double 0, 12, 3.45
고정밀 10진수 부동 소수점 decimal 0, 12, 3.45
부울 bool true, false
열거형 형식 enum E {...} 양식의 사용자 정의 형식
구조체 형식 struct S {...} 양식의 사용자 정의 형식
Nullable 값 형식 null 값을 갖는 다른 모든 값 형식의 확장
참조 형식 다른 모든 형식의 기본 클래스 object  
유니코드 문자열 string "String"
클래스 형식 class C {...} 양식의 사용자 정의 형식
인터페이스 형식 interface I {...} 양식의 사용자 정의 형식
배열 형식 단일 차원 및 다차원(: int[] int[,])
대리자 형식 delegate int D(...) 양식의 사용자 정의 형식

 

 

1.3 데이터 형식 범위 및 크기

 

데이터 형식은 각 데이터 형식별로 데이터를 규현 할 수 있는 범위와 메모리에 되는 크기가 있습니다.

예로 같은 정수형이라도, byte는 0 ~ 255까지의 숫자만 정의할 수 있으며, 이렇게 정의 된 데이터 형식은 메모리에 8 bit에 크기로 정의 됩니다.

 

데이터 형식 범위 크기
sbyte -128 ~ 127 부호 있는 8bit 정수
byte 0 ~ 255 부호 없는 8bit 정수
short -32,768 ~ 32,767 부호 있는 16bit 정수
ushort 0 ~ 65,535 부호 없는16bit 정수
int -2,147,483,648 ~ 2,147,483,647 부호 있는 32bit 정수
uint 0 ~ 4,294,967,295 부호 없는 32bit 정수
long -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 부호 있는 64bit 정수
ulong 0 ~ 18,446,744,073,709,551,615 부호 없는 64bit 정수
float ±1.5e-45 ~ ±3.4e38 4byte
double ±5.0e-324 ~ ±1.7e308 8byte
decimal ±1.0 × 10 -28 ±7.9 × 10 28 16byte
bool   4 byte
char   유니코드 16 bit 문자

 

 

1.3 정수형

 

정수형은 정수입니다.

소수점이 없는 0, 1, -1 같은 데이터형식입니다.

 

byte, short, int, long은 모두 정수형인데, bit 크기가 틀리고, 나타낼 수 있는 숫자의 범위가 틀립니다.

또한 위 정수형에 u 접두어가 붙으면, 0부터 양수로 표현되며, 원래 정수형의 2배의 범위를 표현할 수 있습니다.

 

유니티에서는 특별한 경우를 제외하곤 int 형을 주로 사용합니다.

여기서 특별한 경우는 네트워크시리얼 통신에서 전송 데이터의 양을 줄이기 위해서 byte를 사용할 때도 있습니다.

 

 

1.4 부동 소수점 숫자 형식(실수형)

 

부동 소수점 숫자 형식은 실수입니다.

기본적으로 1.2, 3.4와 같이 소수점이 포함된 숫자형이지만, 1과 같이 정수형도 실수형으로 선언하면 실수가 됩니다.

 

float, double, decimal은 모두 실수형인데, byte 크기가 틀리고, 나타낼 수 있는 숫자의 범위가 틀립니다.

유니티에서는 주로 float 형을 사용합니다.

 

 

1.5 문자형

 

문자형은 문자입니다.

문자형은 char와 string이 있습니다.

char 형은 ''(작은 따옴표)를 사용하며 문자 하나를 표현합니다.

string 형은 ""(큰 따옴표)를 사용하며 문자열을 표현합니다.

 

예제 : 문자형
char c = 'a';
string s = "ab";

 

 

1.6 논리형

 

논리형은 참, 거짓입니다.

논리형은 bool입니다.

논리형의 값은  true(참)와 false(거짓)

 

예제 : 논리형
bool b1 = true;
bool b2 = false;

 

 

1.7 object 형

 

모든 데이터 형식은 object의 상속을 받고 있기 때문에, object 형은 모든 데이터 형식의 값을 사용할 수 있습니다.

 

예제 : object 형
object s = "string";
object i = 1;
object b = true;

 

 

1.8 var 형

 

형 추론이란 형을 따로 추론하지 않고, 컴파일러가 대입된 값을 확인한 후 자동적으로 형을 할당하는 기능입니다.

컴파일러시 행위가 이루어지면, 빌드 때 이미 형이 지정되기 때문에 빌드한 파일은 이미 형을 가지고 있다는 뜻입니다.

형 추론 때 사용하는 데이터 형식이 var 형입니다.

 

예제 : var 형
var i = 1; // int 형 변수 i
var f = 2f; // float 형 변수 f

 

형 추론은 메서드 안에서만 가능합니다.

그리고 var를 변수 선언 시 반드시 초기값을 대입해야 합니다. (초기값이 없으면 컴파일러 에러가 남.)

 

 

2. 변수

 

변수란 숫자, 문자, 기호 등의 값들이 저장되는 메모리 공간의 이름입니다.

문자를 데이터로 사용하고 싶다면 char 데이터 형식을, 정수를 사용하고 싶다면 int 데이터 형식을 사용합니다.

 

 

2.1 변수 선언

 

변수 선언은 데이터-형식 변수-이름;으로 구성되어 있습니다.

 

사용 방법 : 변수 선언
데이터-형식 변수-이름;
int age;

 

 

위의 코드는 정수형 변수를 메모리 공간에 할당하고 그 공간에 age라는 이름을 붙여줍니다.

여기서 int는 데이터 형식이고, age는 변수이름입니다.

그리고 마지막에는 문장의 끝을 알리는 세미콜론(;)이 붙입니다.

 

 

2.2 값 할당

 

대입 연사자인 = 을 사용하여 값을 넣어 주면 됩니다.

 

사용 방법 : 값 할당
age = 46;

 

 

2.3 초기화 

 

: 변수 선언과 동시에 값을 대입하는 것을 초기화라고 합니다.

 초기화는 리터럴 데이터를 직접 넣기도 하고, 자주 사용하지는 않지만 default 연산자를 사용하기도 합니다.

 

예제 : 초기화
int age = 46;
int i = default(int);

 

변수는 값을 계속 바꿀 수 있기 때문에, 필요에 따라서 값을 계속 바꾸어도 됩니다.

 

예제 : 변수값 변경
int age = 46;
age = 45;

 

데이터 형식이 같다면, 한 줄에 여러 변수를 선언할 수도 있습니다.

 

예제 : 한 줄에 여러 변수 선언
int age = 46, brother = 2;

 

 

2.4 참조 형식 초기화 

 

참조 형식은 new 연산자를 사용하여 초기화를 합니다.

 

사용 방법 : 초기화
데이터-형식 변수-이름 = new 데이터-형식();
string s1 = new string();

 

using UnityEngine; 

public class VariableExample : MonoBehaviour 
{ 
    void Start() 
    { 
        // 일반 변수 정의 및 선언 
        int number1; 
        number1 = 1; 

        int number2 = 2; // 초기화 

        float number3 = 3, number4 = 4; // 같은 데이터 형식의 여러 변수 선언 

        bool isBool = true; 

        Debug.Log(number1.ToString()); // 출력 : 1 
        Debug.Log(number2.ToString()); // 출력 : 2 
        Debug.Log(number3.ToString()); // 출력 : 3 
        Debug.Log(number4.ToString()); // 출력 : 4 
        Debug.Log(isBool.ToString()); // 출력 : True 
    } 
}

 

위 예에서 ToString()이란 숫자형(정수형, 실수형) 데이터 형식을 문자열로 변환해 주는 메서드입니다.

또한 14번째 줄 bool의 변수 이름 앞에 is라는 글자는 bool형 선언 시 즐겨 사용하는 접두어입니다.

bool형인 경우, 변수 이름 앞에 is라는 글자를 넣어서 다른 변수 이름과 구별하는 데 사용하면 좋습니다.

 

 

2.5 변수 이름 수정

 

변수 이름은 코딩을 하는데 가장 많은 스트레스를 주는 것 중 하나입니다.

한번 만들어 놓고, 작업하다 보면 바꾸고 싶은 경우가 생각보다 많습니다.

그러면, 변수 이름 선언 한 곳과 사용되는 곳을 모두 바꾸어야 하는데, 이때 사용하는 것이 Ctrl + R, Ctrl + R (Ctrl + R 2번)입니다.

위 명령어를 사용하면, 사용된 모든 변수 이름을 한꺼번에 바꿀 수 있습니다.

 

 (1) 수정하고 싶은 변수 이름에 마우스 클릭을 합니다.

 

코더제로 유니티 C# 강좌 데이터 형식(Data Type), 변수(Variable), 상수(Constant) 변수 이름 수정 마우스 클릭
그림. 변수 이름 수정 마우스 클릭

 

 (2) Ctrl + R, Ctrl + R

  위 기능키를 사용하면, 이름 바꾸기 창이 뜹니다.

 

코더제로 유니티 C# 강좌 데이터 형식(Data Type), 변수(Variable), 상수(Constant) 이름 바꾸기 창
그림. 이름 바꾸기 창

 

 (3) 변수 이름을 바꾸면, 모든 참조한 변수의 변수 이름이 모두 바뀝니다.

 이름 바꾸기 창에 적용을 누르거나, 엔터키를 누르면 됩니다.

 

코더제로 유니티 C# 강좌 데이터 형식(Data Type), 변수(Variable), 상수(Constant) 이름 바꾸기 창 적용
그림. 이름 바꾸기 창 적용

 

2.6 변수 종류

 

(1) 전역 변수(Global Variable, 필드(Field))

 : 클래스 내의 멤버 변수.

  전역 변수는 선언된 클래스 내의 모든 메서드에서 접근이 가능합니다.

  전역 변수는 인스턴스가 생성될 때 초기화가 되고, 클래스에 대한 자원이 반환될 때 같이 반환됩니다.

  전역 변수는 값을 할당하지 않고 사용하면, 초기값이 자동으로 할당됩니다.

 

(2) 지역 변수(Local Variable)

: 메드 내부에서 사용되는 변수.

 지역 변수는 메드가 호출될 때 초기화가 되고 사용이 끝나면 반환됩니다.

 지역 변수는 값을 할당하지 않고 사용하면, 에러가 발생합니다.

 

(3) 정적 변수(Static Variable)

: 정적 변수는 static 키워드를 사용하여 선언되는 변수입니다.

 객체의 인스턴스를 단 한 번만 생성하며, 프로그램 종료될 때 리소스를 반환합니다.

 접근 범위 내에서 자유롭게 사용을 할 수 있지만, 한번 생성하면 프로그램 종료까지 계속 메모리를 점유하고 있기 때문에 적절히 사용해야 합니다.

 정적 변수는 전역 변수에서만 선언할 수 있습니다.

 그리고, 정적 변수는 유니티 에디터 인스펙터 창에서 보이지 않습니다.

 

(4) 매개변수(Parameter)

: 함수나 메드에서 사용되는 값을 전달하는 변수입니다.

 함수나 메드에서 괄호 안에 값을 넣어서 사용합니다.

 

using UnityEngine; 

public class VariableType : MonoBehaviour 
{ 
    // 필드  
    static public bool staticVariable = true; // 정적 변수  
    private int m_GlobalVariable = 1; // 전역 변수      

    void Start() 
    { 
        int localVariable1 = 1; // 지역변수 

        int localVariable2; // 값을 할당하지 않은 지역변수 

        Debug.Log(localVariable2.ToString()); // 에러 
        LocalVariable(1 /* 매개변수 */); 
    } 

    // 메서드  
    void LocalVariable(int parameter/* 매개변수 */) 
    { 
        float localVariable = parameter; // 지역변수  
    } 
}

 

위 예 7번째 줄의 m_GlobalVariable의 변수 이름 앞에 m_ 가 있는데 이 접두어는 전역 변수(멤버 변수) 앞에 즐겨 사용하는 접두어입니다.

또한, m_GlobalVariable 앞에 private는 접근제한자입니다.

 

 

2.7 접근 제한자

 

접근 제한자는 클래스 내에 멤버(전역 변수, 메드)의 접근을 제한하는 역할을 합니다.

 

  • public : 클래스의 외부에서도 접근 가능.
  • protected : 상속받은 자식 클래스에게만 접근 가능.
  • private : 클래스의 내부에서만 사용.

 

코더제로 유니티 C# 강좌 데이터 형식(Data Type), 변수(Variable), 상수(Constant) 접근 제한자
그림. 접근 제한자

 

using UnityEngine; 

public class AccessModifier : MonoBehaviour 
{ 
    public int m_PublicVariable = 1; // AccessModifier 클래스 외에 다른 클래스에서도 접근 가능 
    private int m_PrivateVariable = 2; 

    void Start() 
    { 
        Debug.Log(m_PublicVariable.ToString()); // 출력 : 1 
        Debug.Log(m_PrivateVariable.ToString()); // 출력 : 2 
    } 
}

 

 

 public 변수 주의사항

 

여기에서 public 변수는 사용할 때 주의해야 하는 것이 하나 있습니다.

 

using UnityEngine; 

public class PublicVariable : MonoBehaviour 
{ 
    public int m_PublicVariable = 1; 

    void Start() 
    { 
        Debug.Log(m_PublicVariable.ToString()); // 출력 : 1 
    } 
}

 

변수를 public으로 선언하게 되면, 인스펙터 창에 변수가 보이게 됩니다.

 

코더제로 유니티 C# 강좌 데이터 형식(Data Type), 변수(Variable), 상수(Constant) 인스펙터 창
그림. 인스펙터 창

 

접근 제한자 예제 소스에서 m_PublicVariable의 초기값을 4로 수정해 보겠습니다.

 

using UnityEngine; 

public class Variable : MonoBehaviour 
{ 
    public int m_PublicVariable = 4; 

    void Start() 
    { 
        Debug.Log(m_PublicVariable.ToString()); // 출력 : 1 
    } 
}

 

m_PublicVariable 인스펙터 창의 값은 바뀌지 않습니다.

인스텍터 창에 나오는 값은 public 변수의 초기값이 아니기 때문입니다.

그리고, 이 값을 사용하게 되면, 인스펙터 창에 있는 값이 적용됩니다.

 

코더제로 유니티 C# 강좌 데이터 형식(Data Type), 변수(Variable), 상수(Constant) 인스펙터 창 값 수정
그림. 인스펙터 창 값 수정

 

2.8 변수 이름 규칙

 

  • 모든 C# 변수의 이름은 대소문자를 구별(Case-Sensitive)합니다.
  • 영문과 숫자를 이용해 작성해야 하고, 시작은 영문으로 해야 합니다.
  • 공백이나 언더바(_)를 제외한 특수 문자 사용 불가합니다.
  • 유니티 C# 키워드는 사용 불가하고, 영역 내에서 변수 이름을 중복 선언할 수 없습니다.

 

 

C# 키워드
abstract, as, base, bool, break, byte, case, catch, char, checked, class, const, continue, decimal,efault, delegate, do, double, else, enum, event, explicit, extern, false, finally, fixed, float, for, foreach, goto, if, implicit, in, int, interface, internal, is, lock, long, namespace, new, null, object, operator, out, override, params, private, protected, public, readonly, ref, return, sbyte, sealed, short, sizeof, stackalloc, static, string, struct, switch, this, throw, true, try, typeof, uint, ulong, unchecked, unsafe, ushort, using, virtual, void

 

using UnityEngine; 

public class VariableKeyword : MonoBehaviour 
{ 
    void Start() 
    { 
        // name과 Name은 다른 변수임.  
        int name = 1; 
        int Name = 2; 
        float name1 = 3; 
        float 1name = 4; // 에러 : 숫자로 시작  
        bool name_ = true; // 특수문자 _ 사용  
        bool name& = false; // 에러 : 특수문자 &  

        string class = "Keyword"; // 에러 : 키워드 class 사용  
    }  
}

 

 

3. 상수

 

상수는 한번 정의되면 바뀌지 않는 데이터입니다.

상수는 const 한정자를 사용하여 정의됩니다.

 

사용 방법 : 상수
const 데이터-형식 변수-이름 = 리터럴-상수;
const int constVaule = 10;


const와 비슷한 한정자로 readonly가 있습니다.

readonly는 읽기 전용입니다.

 

예제 : readonly
readonly int constVaule = 10;

 

 

 const와 readonly 차이

 

  const readonly
변수 사용 시기 컴파일 런타임
Static static입니다. static은 아니지만, static으로 선언할 수 있습니다.
메모리 위치 스택
장점 접근이 빠르다. 생성시 선언만 하고 생성자에서 초기화를 하여 유연하게 사용할 수 있습니다.
단점 값 수정시 모두 재 컴파일을 해야 합니다.  

 

const을 사용해도 되지만, readonly를 사용할 것을 권장합니다.

 

 

4. 리터럴(Literal) 데이터

 

리터럴 데이터는 데이터 그 자체를 의미합니다.

1234, true, "ABCD"를 얘기합니다.

 

 

4.1 디폴트 리터럴 타입

 

C# 컴파일러는 int, double, char, string, bool 데이터 형은 별도의 접미어(Suffix)를 붙이지 않아도 해당 데이터 타입으로 인지하고 값을 할당합니다.

이 것을 디폴트 리터럴 타입이라고 합니다.

 

예제 : 리터럴
1234 // int 리터럴
123.4 // double 리터럴
"A" // string 리터럴
'a' // char 리터럴
true // bool 리터럴

 

 

4.2 접미어

 

다음 데이터 형식은 접미어를 붙어야 합니다.

 

리터럴 데이터 타입 접미어(대소문자 모두 사용 가능) 예제
long L, l 1234L, 1234l
uint U, u 1234U, 1234u
ulong UL, ul 1234UL, 1234ul
float F, f 123.4F, 123.4f
double D, d 123.4D, 123.4d, 123.4
decimal M, m 123.4M, 123.4m

 

예제 : 접미어
bool b = true;
short sh = -123;
int i = 1234;
long l = 1234L;
float f = 123.45f;
double d1 = 123.45;
double d2 = 123.45D;
decimal d = 123.45M;
char c = 'A';

 

4.3 접두사

 

정수 리터럴의 경우 다음과 같은 접두사를 붙입니다.

 

  • 10진수 : 접두사가 없음.
  • 16진수 : 0x, 0X 접두사 사용.
  • 2진수 : 0b, 0B 접두사 사용.(C# 7.0 이후)

 

 

예제 : 접두사
var decimalLiteral = 1;
var hexLiteral = 0x12;
var binaryLiteral = 0b_1001_1010;

 

5. 최대값, 최소값

 

정수형(sbyte, short, int, long, byte, ushort, uint, ulong), 실수형(float, double, decimal) 데이터 형식은 최대값과 최소값을 지원합니다.

그 프로퍼티가 MaxValue, MinValue입니다.

 

예제 : 최대값, 최소값
int i = int.MaxValue; // 2147483647
float f = float.MinValue; // -3.402823E+38

 

 

6. default 연산자

 

default 연산자는 데이터 형식의 기본값을 생성합니다.

 

사용 방법 : default
데이터-형식 변수-이름 = default(데이터-형식);
int i = default(int); // 0

 

형식 기본값
참조 형식 null
정수형 0
실수형 0
bool false
char '\0'
enum 0
struct null

 

 

7. null

 

변수를 선언 후 대입을 하지 않으면, 어떤 데이터를 가지지 않기 때문에 이것을 null이라고 합니다.

기본적으로 참조 형식(class, interface, delegate, dynamic, object, string) 데이터 형식은 null 할당을 할 수 있습니다.

 

예제 : null
string s = null;

 

 

8. Nullable Type

 

값 형식 데이터 형식은 일반적으로 null 할당을 할 수 없습니다.

하지만 Nullable <T>와 ?를 사용하면 null 할당하여 사용할 수 있습니다.

 

예제 : Nullable
// Nullable 예
Nullable i1 = null;
i1 = 20;
       
// ? 예제
float? f1 = null;
f1 = 1.2;

 

 

9. dynamic

 

C# 4.0부터 추가된 dynamic 키워드는 중간에 데이터형을 변환할 수 있습니다.

 

예제 : dynamic
dynamic dType = 1;
dType = "abc";

 

 

10. DateTime

 

DateTime은 날짜와 시간에 관한 구조체(struct) 데이터 형식입니다.

DateTime은 using 지시문을 사용하여 using System을 호출하여야 사용할 수 있습니다.

 

네임스페이스
using System;

 

생성자 호출

 

예제 : 생성자 호출
DateTime dt = new DateTime(연, 달, 일, 시간, 분, 초);
DateTime dt = new DateTime(2019, 10, 1, 1, 23, 45);

 

분류 이름 내용
Now 현재 날짜와 시간
Today 현재 날짜. 시간은 12시 00분 00초로 인식 됨.
UtcNow 현재 날짜, 시간이 협정세계시(Universal Time Coordinated)기준으로 출력.
Year 연도
Month
Day
Hour
Minute
Second
Millisecond 천분의 1초
AddYears 연도 더하기. (음수도 가능)
AddMonths 달 더하기. (음수도 가능)
AddDays 일 더하기. (음수도 가능)
AddHours 시간 더하기 (음수도 가능)
AddMinutes 분 더하기 (음수도 가능)
AddSeconds
초 더하기 (음수도 가능)
AddMilliseconds 천분의 1초 더하기 (음수도 가능)

 

using System; 
using UnityEngine; 

public class DateTimeExample : MonoBehaviour 
{ 
    void Start() 
    { 
        Debug.Log(default(DateTime)); // 출력 : 01/01/0001 00:00:00  
        Debug.Log(DateTime.Now); // 출력 : 오늘 날짜와 현재 시간이 나옵니다.  
        Debug.Log(DateTime.Now.Year); // 출력 : 현재 연도  
        Debug.Log(DateTime.Now.Month); // 출력 : 현재 달  
        Debug.Log(DateTime.Now.Day); // 출력 : 현재 일  
        Debug.Log(DateTime.Now.Hour); // 출력 : 현재 시  
        Debug.Log(DateTime.Now.Minute); // 출력 : 현재 분  
        Debug.Log(DateTime.Now.Second); // 출력 : 현재 초  

        DateTime dt = new DateTime(2019, 10, 01, 01, 23, 34); 
        Debug.Log(dt.Year); // 출력 : 2019  

        DateTime today = DateTime.Today; // 오늘  
        Debug.Log(today); // 출력 : xx/xx/2019 00:00:00  

        DateTime tomorrow = today.AddDays(1); // 하루 더 해서 내일 
        DateTime yesday = today.AddDays(-1);  // 하루 빼서 어제 
    } 
}

 

 

11. TimeSpan

 

TimeSpan는 시간의 간격을 나타내는 구조체입니다.

DateTime을 계산하기 위해 사용됩니다.

TimeSpan은 using 지시문을 사용하여 using System을 호출하여야 사용할 수 있습니다.

 

네임스페이스
using System;

 

2개의 DateTime 빼면 TimeSpan 값을 얻을 수 있습니다.

 

사용 방법
TimeSpan 변수-이름 = DateTime1 -  DateTime2;

 

분류 이름 내용
Days 두 DateTime의 날짜만의 차이
Hours 두 DateTime의 시간만의 차이
Minutes 두 DateTime의 분만의 차이
Seconds 두 DateTime의 초만의 차이
TotalDays 두 DateTime의 날짜 차이
TotalHours 두 DateTime의 시간 차이
TotalMinutes 두 DateTime의 분 차이
TotalSeconds 두 DateTime의 초 차이

 

using System; 
using UnityEngine; 

public class TimeSpanExample : MonoBehaviour 
{ 
    void Start() 
    { 
        DateTime dateTime1 = new DateTime(2018, 08, 1, 2, 3, 4); 
        DateTime dateTime2 = new DateTime(2019, 10, 20, 12, 0, 5); 

        TimeSpan timeSpan = dateTime2 - dateTime1; 

        int timeSpanDays = timeSpan.Days; 
        Debug.Log(timeSpanDays.ToString()); // 출력 : 445  

        int timeSpanHoures = timeSpan.Hours; 
        Debug.Log(timeSpanHoures.ToString()); // 출력 : 9  

        int timeSpanMiniute = timeSpan.Minutes; 
        Debug.Log(timeSpanMiniute.ToString()); // 출력 : 57  

        int timeSpanSecond = timeSpan.Seconds; 
        Debug.Log(timeSpanSecond.ToString()); // 출력 : 1  

        double timeSpanHours = timeSpan.TotalHours; 
        Debug.Log(timeSpanHours.ToString()); // 출력 : 10689.9502777778  

        double timeSpanMiniutes = timeSpan.TotalMinutes; 
        Debug.Log(timeSpanMiniutes.ToString()); // 출력 : 641397.016666667  
    } 
}

 

 

여기서 주의할 것은, 두 시간이 하루 정도 차이가 나면 Hours가 0으로 나옵니다.

이것은 단순히 시간만 비교하기 때문에 두 시간의 총 시간 차이를 구하려면 TotalHours 메드를 사용하면 됩니다.

 

 

12. Stopwatch

 

Stopwatch는 명령을 수행하는 시간을 측정할 때 사용됩니다.

Stopwatch는 using 지시문을 사용하여 using System.Diagnostics을 호출하여야 사용할 수 있습니다.

 

네임스페이스
using System.Diagnostics;

 

여기에서 주의할 점은 System.Diagnostics을 사용하게 되면, System.Diagnostics.Debug 메드와 UnityEngine.Debug 메드 사이에 충돌합니다.

그래서 UnityEngine.Debug 메드를 사용하기 위해서는 using Debug = UnityEngine.Debug 라고 별칭 선언을 해 주어야 합니다.

 

using 별명 지시문
using Debug = UnityEngine.Debug;

 

Stopwatch 선언 후 Start 메드와 Stop 메드를 사용하여 시간을 얻을 수 있습니다.

 

사용 방법 : Stopwatch
Stopwatch 변수-이름 =new Stopwatch();
변수-이름.Reset(); // 다시 시간을 0으로 리셋함. 처음 사용할 때는 생략 가능.
변수-이름.Start(); // 시작
...
변수-이름.Stop(); // 종료

 

분류 이름 내용
Reset Stopwatch 리셋
Start Stopwatch 시작
Stop Stopwatch 종류
변수 Elapsed TimeSpan 데이터 형식으로 경과 시간 출력
ElapsedMilliseconds TimeSpan 데이터 형식으로 경과 천만의 1초

 

using UnityEngine; 
using System.Diagnostics; 
using Debug = UnityEngine.Debug; 

public class StopwatchExample : MonoBehaviour 
{ 
    private Stopwatch m_Stopwatch = new Stopwatch(); 

    void Start() 
    { 
        m_Stopwatch.Reset(); 
        m_Stopwatch.Start(); 
    } 

    void Update() 
    { 
        if (Input.GetKeyDown(KeyCode.S)) // 키보드 S를 누르면 실행되는 조건입니다. 
        { 
            m_Stopwatch.Stop(); 
            Debug.Log(m_Stopwatch.ElapsedMilliseconds.ToString()); // 시작부터 지금까지 시간을 출력 

            m_Stopwatch.Reset(); 
            m_Stopwatch.Start(); 
        } 
    } 
}

 

728x90
반응형