본문 바로가기
C#

[C#] 형 변환에 대하여 (for string 그리고 메모리 관점)

by Minius 2024. 4. 17.
반응형

들어가며

자체 개발한 프로그램을 사용하여 만든 썸네일

C#을 사용하며 우리는 많은 형변환을 하게 된다. 그래서 이런 저런 형변환 방법을 사용하게 되는데, string을 예로 들자면 아래 3개를 사용한다고 할 수 있겠다.

 

  1. (string) 캐스팅
  2. .ToString() 메서드
  3. as 연산자

왜 이렇게 다양한 방법이 존재할까? 궁금했다. 그리고 이번에 회사에서 리팩토링을 진행하며, 위 3가지 방법 중 1, 2번을 사용했는데 사실 모두 .ToString()만 사용했다. (string)이 사용된 것을 보기만 하고, 심지어 (string)을 .ToString()으로 바꿔버리기도 했다.

 

이유는 잘 모르는 상태에서, 회사 분의 말씀을 듣고 저게 더 좋은 방법이라고 생각했기 때문...

 

하지만 이번 조사에서 각각의 차이점을 알게 되었고, 정리해보고자 한다.

 

각각의 장점, 단점, 사용하기 적합한 상황, 메모리 효율 관점에서 봤을 때. 이렇게 4가지로 정리해 보겠다.

 

1. (string) 캐스팅

  • 장점: 객체가 이미 'string' 타입일 경우, 가장 직관적이고 간결한 방법이다. 타입 캐스팅이 성공하면 그 결과를 확신할 수 있다.
  • 단점: 객체가 'string'이 아닐 경우, 'InvalidCastException'을 발생시킨다. 따라서 타입 안정성이 보장되지 않는 경우 사용에 주의가 필요하다.
  • 적합한 상황: 객체의 타입이 'string'이 확실하거나, 객체 타입을 명확히 알고 있을 때 사용한다. 또는 객체가 'null'이 아니라는 것이 보장될 때, 안전하게 사용할 수 있다.
  • 메모리 효율: 매우 효율적이다. 객체가 이미 'string' 타입인 경우, 새로운 메모리 할당이 일어나지 않고, 기존의 문자열 객체에 대한 참조만을 사용한다. 새로운 객체를 생성하지 않기 때문에 추가 메모리 소모가 없다.

2. .ToString() 메서드

  • 장점: 모든 객체에 대해 호출할 수 있으며, 객체의 적절한 문자열 표현을 제공한다. 객체가 어떤 클래스에 속하든 간에, 그 객체의 문자열 표현을 얻을 수 있다.
  • 단점: 객체가 'null'일 경우, 'NullReferenceException'을 발생시킨다. 따라서 호출 전에 객체가 'null'이 아닌지 확인해야 한다.
  • 적합한 상황: 객체의 문자열 표현이 필요할 때, 특히 객체의 타입에 대한 정보 없이 그 값을 문자열로 출력하고자 할 때 사용한다. 로깅이나 Message formatting에서 유용하게 사용된다.
  • 메모리 효율: '.ToString()' 메서드는 새로운 문자열 객체를 생성하여 반환한다. 따라서 이 메서드를 사용 할 때마다 기존 객체의 상태를 문자열로 변환해 새로운 문자열 객체를 메모리에 할당하게 된다. 객체가 복잡하거나 '.ToString()' 호출이 빈번하게 발생한다면, 메모리 사용량이 증가할 수 있다. 특히 문자열이 큰 경우나 호출 빈도가 높은 경우에는 메모리 부하가 클 수 있다.

3. as 연산자

  • 장점: 'as' 연산자는 타입 캐스팅을 시도하고, 실패할 경우 'null'을 반환한다. 이는 예외를 발생시키지 않기 때문에 프로그램의 안정성을 높일 수 있다.
  • 단점: 캐스팅이 실패했을 때, 'null'을 반환하기 때문에 반환한 결과가 'null'인지 아닌지를 '항상' 검사해야 한다.
  • 적합한 상황: 변환될 객체의 타입이 불확실 할 때 사용하며,  'null' 체크를 통해 안전하게 타입 변환을 처리할 수 있다. 이 방법은 타입 안정성을 중시하는 경우에 적합하다.
  • 메모리 효율: 'as' 연산자는 '(string)' 캐스팅과 유사하게 추가적인 메모리 할당 없이 타입 변환만을 시도한다. 이 연산자는 새로운 객체를 생성하지 않고, 변환 가능한 경우 기존 객체에 대한 참조만을 반환한다. 따라서 메모리 효율적인 측면에서 매우 좋다.

 

정리하며

형 변환 방법을 선택할 때는 안정성, 성능, 코드의 간결성을 고려해야 한다. 명확한 타입 정보가 있고, 예외 처리가 용이한 경우 '(string)' 캐스팅이나 '.ToString()' 메서드를 사용하고, 타입 불확실성이 있는 경우 'as' 연산자를 사용하는 것이 좋다.

 

그리고 가장 효율적인 방법은 '(string)' 캐스팅과 'as' 연산자이고 비효율적인 방법은 '.ToString()' 메서드이다.

 

이를 봐서는 앞으로 '.ToString()' 메서드 사용을 지양해야 할 것 같다. Null 일 경우 예외를 던지고, 메모리 효율 측면에서도 좋지 않기 때문이다. 그리고 다른 서비스의 프로그램을 사용하지 않고, 우리 회사가 만드는 데이터만 사용하기 때문에 형이 명확하여 다른 형일 경우가 매우 적기 때문이다.

 

위 내용을 참고하여 더 효율적인 개발을 해야겠다.

댓글