C# - Implict, explicit, opertator 키워드
먼저 Operator라는 키워드는 사전적으로 연산자라는 의미이다.
C#에서 Operator 키워드를 작성하면 기존 연산자를 오버 로딩 하거나
클래스 또는 구조체에서 사용자 정의 변환할 수 있다.
A라는 클래스를 int처럼 쓰겠다는 식으로 말이다.
이 경우엔 반드시 Implict 또는 explicit라는 키워드와 함께 사용해야 한다.
더 자세한 내용은 아래의 링크를 참조하자.
연산자 키워드 - C# 참조
기본 제공 C# 연산자를 오버로드하는 방법 알아보기
docs.microsoft.com
Implict는 함축적인이라는 사전적 정의가 있고, 암묵적인이라고 해석해도 좋다.
Implict 키워드는 어떤 형식을 암묵적으로 형 변환해주는 키워드이다.
(형변환시 오퍼레이터 함수의 리턴이 반환됨.)
아래 주소에서 예제 코드를 확인할 수 있다.
implicit - C# 참조
implicit(C# 참조) 읽는 데 2분 참가자 implicit 키워드는 암시적 사용자 정의 형식 변환 연산자를 선언하는 데 사용됩니다. 변환 시 데이터가 손실되지 않는 경우 이 키워드를 통해 사용자 정의 형식과 다른 형식 간에 암시적 변환을 사용할 수 있습니다. 예제 class Digit { public Digit(double d) { val = d; } public double val; // ...other members // User-defined conversion from Digit to d...
docs.microsoft.com
explicit는 명백한이라는 뜻을 가지고 있으며, 명시적 사용자 정의 형 변환에 사용된다.
(형변환시 오퍼레이터 함수의 리턴이 반환됨.)
예제 코드는 아래 링크에서 확인할 수 있다.
explicit 키워드 - C# 참조
explicit(C# 참조) 읽는 데 2분 참가자 explicit 키워드는 캐스트를 통해 호출해야 하는 사용자 정의 형식 변환 연산자를 선언합니다. 다음 예제에서는 Fahrenheit 클래스에서 Celsius 클래스로 변환하는 연산자를 정의합니다. 연산자는 Fahrenheit 클래스 또는 Celsius 클래스 내에서 정의되어야 합니다. public static explicit operator Celsius(Fahrenheit fahr) { return new Celsius((5.0f / 9.0f) * (fahr.Degrees...
docs.microsoft.com
명시적 변환과 암시적 변환의 차이를 보자면
명시적 변환은 코드상에서 변환이 눈에 보이기 때문에 프로그래머가 이것이 변환된 타입이라는 것을 알 수 있다.
하지만 암시적 변환은 코드상에서 프로그래머가 해당 타입이 변환된 것인지 알기가 어렵다.
코드가 단순해진다는 장점이 있지만 그만큼 나중에 찾아내기가 어렵다는 말이다.
그래서 MSDN에서는 예외 처리를 함께 하라고 추천하고 있다.
더 간단하게 압축해보면
implict는 나중에 사용할 때
int a = Test b;
이게 가능하도록 하는 것이고
explict는 나중에 사용할 때
int a = (int)Test b;
이렇게 할 수 있게 만든다는 얘기다.
다시 말해서 클래스 내부에 저 두 개의 오퍼레이터를 만들지 않으면
명시적이고 암시적이고 형 변환이 불가능하다.
그리고 반대로 형변환도 해당 클래스 내에서 정의한다.
예를 들어 Digit를 double로 형변환하고 싶으면,
public static implicit operator double(Digit d) { return d.val; }
(스태틱 필수)
반대로 double을 Digit로 형변환하고싶으면,
public static implicit operator Digit(double d) { return new Digit(d); }
(클래스 내부에 없는 값이니까 new로 할당하는 거임.)
(스태틱 필수)
결론
public static 명시적 혹은 암시적 operator 반환하고 싶은 타입(형변환 할 타입) { return new 반환할 값을 만드는 함수; }
'게임 개발 사전 > C#' 카테고리의 다른 글
C# - Equals() (0) | 2019.07.13 |
---|---|
C# - 소멸자 "~" 틸드(Tilde) 기호 (0) | 2019.07.13 |
C# - 자료형 (0) | 2019.07.13 |
C# - GC(가비지 컬렉션) (0) | 2019.07.13 |
C# - Break, Return 차이 (0) | 2019.07.13 |