
안녕하세요. 2nan 입니다.
여러분들은 int 형, double 형 등등... 숫자로 형 변환을 할때 어떤 방식으로 변환 하시나요?? 저는 대부분의 경우 Parse 를 사용해 왔습니다. 특별한 이유가 있는것은 아니고 문자열 형변환인 ToString 을 자주 쓰다보니 int 가 뒤에 있는 Convert.ToInt32 보단 Int32.Parse 를 주로 써왔습니다. 결과는 같지만 다른 방식이 있으니.. 궁금증이 생기지 않나요?? 😏
예시 코드부터 같이 보시죠
// Convert.ToInt32 vs Int32.Parse vs Int32.TryParse | |
// 테스트를 위한 string 변수 생성 및 다양한 값 할당 | |
string a = "123"; | |
string b = "0.1"; | |
string c = null; | |
// Convert.ToInt32 | |
Convert.ToInt32(a); // 123 | |
Convert.ToInt32(b); // FormatException | |
Convert.ToInt32(c); // 0 | |
// Int32.Parse | |
Int32.Parse(a); // 123 | |
Int32.Parse(b); // FormatException | |
Int32.Parse(c); // ArgumentNullException | |
// Int32.TryParse | |
int i; | |
Int32.TryParse(a, out i); // true (123) | |
Int32.TryParse(b, out i); // false (0) | |
Int32.TryParse(c, out i); // false (0) | |
// Convert 와 Parse의 차이는 파라미터가 null 일때 0을 반환하는지, 예외처리를 해주는지의 차이이다. | |
// 상황에 맞게 사용해야 하지만 가급적이면 안전하게 사용하기 위해서 자체 예외 핸들링을 해주는 TryParse 를 쓰도록 하자. |
1. Convert
먼저 Convert 의 정의는 "기본 데이터 형식을 다른 기본 데이터 형식으로 변환한다." 라고 합니다. Boolean, Char, Byte, Int, Double, Decimal, String, DateTime 등등.. 이러한 형식들을 지원한다고 합니다.
string strA = "10";
string strB = "12.345";
string strC = null;
Convert.ToInt32(strA); // 10
Convert.ToInt32(strB); // FormatException
Convert.ToInt32(strC); // 0
string 값을 int 형으로 바꿀 수 있는 값들은 잘 변환이 되지만, strB 처럼 int 형이 아니거나, 또는 숫자가 아닌 문자열이 할당되어 있다면, FormatException 이 발생합니다. 하지만 strC 의 경우에는 null 값이 들어 있으므로 0이 반환이 되는군요.
2. Parse
Parse 는 "문자열 표현을 해당하는 형 으로 변환한다." 라고 되어있네요. ToString 과 비슷한 표현중 하나인 것 같습니다. 예를 들어 문자열을 Int 형 으로 변환하고 싶다면 Int32.Parse("문자열") 이렇게 사용하면 됩니다.
string strA = "10";
string strB = "12.345";
string strC = null;
Int32.Parse(strA); // 10
Int32.Parse(strB); // FormatException
Int32.Parse(strC); // ArgumentNullException
Convert 와 Parse 의 다른점이 보이시나요?? Convert 의 경우처럼 int 형 으로 변환할 수 없는 값이 할당되어 있으면 마찬가지로 FormatException이 발생합니다. 그런데 strC 의 경우 Convert 는 0 을 반환했는데, Parse 는 ArgumentNullException 이 발생합니다. null 값 을 변환시킬때, 0을 반환하냐, 예외 처리를 해주느냐 의 차이가 있습니다.
3. TryParse
TryParse 는 "문자열 표현을 해당하는 형 으로 변환한다. 반환 값은 변환의 성공 여부를 나타낸다." 라고 되어있습니다. Convert 와 Parse 는 단순한 값만 변환하고 반환했는데, 정의에 나와있는 것 처럼 변환의 성공 여부 즉, true 와 false 값을 반환한다는 것을 알 수 있습니다.
string strA = "10";
string strB = "12.345";
string strC = null;
int i;
Int32.TryParse(strA, out i); // true (123)
Int32.TryParse(strB, out i); // false (0)
Int32.TryParse(strC, out i); // false (0)
Convert 와 Parse는 문자열 값만 필요했는데 이번엔 i 라는 변수가 보이는군요. 보아하니 TryParse에 대해서 아직 자세하게는 모르겠지만, ture 와 false 를 반환한다고 했으니, out 연산자를 이용해서 변수 i 에 변환된 값이 저장된다는 느낌이 옵니다. 코드에서도 보시다시피 false 가 반환되면 i 의 값이 0 이 되는군요.
결론적으로는 문자열 값을 int 형 으로 변환한 경우는 true 를 반환하면서 i 에 변환된 값이 할당되고, 변환이 실패한 경우에는 false 를 반환하면서 i 에는 0 이 할당되는 것을 알 수 있습니다.
Convert vs Parse vs TryParse 의 각각 특성을 알아봤습니다. 물론 상황에 맞게 사용하는것이 가장 중요하지만, 안전한 코드를 위해서는 되도록이면 TryParse 를 사용하는 것이 좋을 것 같습니다. 반환값을 이용해서 아래와 같은 코드도 작성할 수 있으니까요.
// 어떤 문자열을 꼭 int 형으로 바꿔야만 정상동작하는 코드
if(Int32.TryParse(어떤 문자열, out in result))
{
...
}
공감이나 도움이 되셨다면, 공감버튼을 눌러주세요ㅎㅎ
질문이나 오타, 잘못된 내용 등은 댓글로 남겨주시면 감사하겠습니다 :)
'개발 > C#' 카테고리의 다른 글
C# - (string) vs ToString vs as string (0) | 2020.09.05 |
---|---|
C# - 닷넷 프레임워크(.Net FrameWork)와 C# (4) | 2020.06.16 |
C# - 명령 프롬프트(CMD)로 컴파일 해보기(2) (1) | 2020.06.14 |
C# - 명령 프롬프트(CMD)로 컴파일 해보기(1) (0) | 2020.06.14 |
C# - null 병합 연산자에 대해서(?? 연산자) (4) | 2020.05.27 |
댓글