C# - 형변환과 리터럴
C#의 형변환
다른 언어와 동일하게 형변환에는 암시적 형변환과 명시적 형변환으로 나눌 수 있다.
1. 암시적 형변환
암시적 형변환은 데이터의 손실이 없을때 자동으로 일어나는 변환으로 작은 범위(크기)의 타입에서 큰 범위(크기)의 타입으로 형변환할때 자동으로 형변환을 진행한다.
그런데 int형이 float로 형변환이 되는데 int는 32byte이고 float는 모든 비트를 정수로 사용할 수 없기에 일부 큰수의 경우는 소실되는 데이터가 발생할 수 도 있다는 점을 알아두자.
2. 명시적 형변환
명시적 형변환은 큰 범위의 타입에서 작은 범위의 타입으로 형변환을 하는 것으로 데이터의 손실이 발생할 수 도 있으며 직접 형변환을 지정해줘야만 한다.
명시적 형변환을 하는 방법은 아래의 두가지 방법에 해당한다.
Convert 의 메서드는 형변환하고자 하는 타입의 메서드로 잘 골라서 사용하면 된다.
#조금은 다른 Convert의 ToString
ToString의 경우는 두번째 전달인자를 담을 수 있는데 이는 진법의 종류를 조절하는 설정값으로 사용할 수 있다.
이를 사용하면 2진법 데이터를 표현할 수 도 있게 된다.
다만 추가로 PadLeft() 메서드를 사용해줘야 하는데 방식은
이렇게 실제 데이터의 형태 옆에 8자리로 0이 빈자리에 들어갈 수 있도록 만들어주면 간단하게 8비트의 형태로 2진법 데이터를 표현할 수 있게 된다.
형변환 메서드 Parse와 TryParse
1. Parse() 메서드
문자열을 특정 타입으로 변환하는 메서드로 변환이 실패하면 Exception을 던진다
Parse 메서드 안에는 문자열만을 전달할 수 있다는 점과 전달하는 문자열은 숫자로 이루어진 문자열이여야 함을 알아두자.
# 숫자가 아닌 문자열이 전달되는 경우
2. TryParse() 메서드
Parse() 메서드와 유사하나 예외를 발생시키지 않고 true/false로 성공 여부를 반환한다.
이는 안전하게 형변환하고 싶을 때 사용된다.
TryParse의 기본 원형은 아래와 같은 형태를 가지고 있다.
bool TryParse(string s, out T result);
- string s : 변환할 문자열
- out T result : 변환된 값을 저장할 변수(out 키워드 사용)
- 반환값 : 반환 성공여부(true / false)
# 숫자로 이루어지지 않은 문자열이 전달되는 경우
이래서 TryParse함수는 사용자의 입력을 받아 사용하는 경우 용이하게 사용될수 있다.
위 두개의 함수를 사용하는 주된 타입은 int, float, bool, DateTime으로 각각의 타입의 형태에 맞는 문자열을 전달해줘야함을 알고 있자,
(bool.Parse를 사용한다면 문자열은 "true"나 "false"를 가져야하고, DateTime.Parse를 사용한다면 문자열은 "2025-01-01"과 같은 문자열을 전달해줘야 한다는 점을 알고 있자.)
# 묵시적으로 타입을 파악하는 var타입
var이라는 타입은 할당하는 값에 따라 타입에 맞게 알아서 저장이 된다.
리터럴
리터럴은 소스코드에 직접 적는 고정된 값을 말하며 프로그램의 실행 중에는 변하지 않는 상수값이다
예를 들면
이렇게 우항에 있는 것을 리터럴이라고 부른다는 것이다.
리터럴의 종류는 정수 , 실수, 문자, 문자열, 불리언, null, 열거형 리터럴이 있다.
리터럴을 사용할때에는 접미사를 붙여줘야만 하는 타입들이 존재한다.
이 또한 어느정도는 언어들마다 비슷한 부분이 있으니 전체 내용이나 차이점을 훑어 보는 정도로 넘어가자
1. 정수 리터럴
모든 타입의 접미사는 대/소문자를 구분하지 않으나 long타입의 리터럴의 경우는 L말고 l을 쓰는 경우 글자가 혼동될수 있으니 대문자 L을 사용하라고 경고를 띄우나 실행에는 문제는 없다.
다만 헷갈릴 수 있으니까 대문자 L을 사용하도록 하자.
2. 실수 리터럴
double형도 D/d를 사용할 수 있으나 궂이 사용하지 않더라고 해도 기본적인 실수 리터럴은 double형으로 생성된다.
3. 문자 리터럴
문자 리터럴은 아래와 같이 이스케이프 시퀀스도 포함되는 내용이다
4. 문자열 리터럴
문자열 리터럴에서 특이한 점은 일반적인 문자열의 경우는 줄바꿈, 탭과 같은 기능을 사용하기 위해서는 이스케이프 시퀀스를 필요로 한다.
그러나 Verbatim 문자열을 만드는 @문자를 사용하면 이스케이프 문자(\, \n 등..)를 그대로 사용이 가능하다.
5. 기능은 없으나 가독성을 좋게해주는 리터럴 _ (언더바)
2진수의 경우는 0000 0000의 형태로 4개씩 띄어 볼 수 있으면 가독성이 훨씬 좋아지는데 저장 자체를 0000 0000과 같이 공백을 포함한 형태로 저장할 수는 없기에 그대로 사용하면 코드를 읽을때 가독성이 떨어지게 되는데 이럴때 _를 사용해서 코드 가독성을 높일 수 있다.
동일하게 8진수 혹은 16진수 및 숫자를 금액으로써 사용하기 위해서 사용할때도 동일하게 가독성을 높일 수 있다.
6. 튜플 리터럴
C#에서는 튜플 리터럴이란것을 제공한다
이는 나중에 자세히 배우겠지만 간단하게 설명하겠다.
먼저 간단하게 튜플을 사용할때는 var 타입을 사용한다
그리고 이렇게 선언한 순서대로 Item1, Item2에 각각 저장되게 되어 있다
또한 튜플 내부의 각 값을 각자의 변수에 담는 것 또한 가능하다.
이 경우에는 Item1, Item2와 같은 방법으로 값을 사용하지 않고 싶을 때 유용하다.
그럼 var에서만 사용이 가능한가하면 그렇지 않다
타입에 각 부분에 대한 값을 지정해주면 각각의 타입으로도 받는게 가능하다
그리고 선언한 변수의 값이 아닌 기존처럼 Item1, Item2 .. 를 사용해서도 값의 사용이 가능하다
7. 리터럴 없이 변수에 기본값을 설정해주는 키워드 default
변수를 초기화하기 위해서는 어떠한 리터럴을 사용해야만 하는데 C#에서는 기본으로 제공해주는 기본값이 존재한다
이 기본값을 사용할때는 우항에 default라는 키워드를 사용해서 값을 할당할 수 있다.
이 기본값이 뭔지 확인하려면 default() 함수에 전달인자로 타입을 전달하면 값이 출력된다.