약한 자료형의 위험성

강타입(strongly-typed) 프로그래밍 언어의 이점을 모두 알고 있을 것입니다. 코딩 중 발생하는 실수를 크게 줄일 수 있죠. 그러나 웹 프로그래밍을 몇 년 하면서 깨달은 점은 강타입 언어만으로는 완전하지 않다는 것입니다.

현대의 대부분 주류 프로그래밍 언어들은 사용자 정의 자료형을 통해 강타입을 구현할 수 있도록 허용하고 있습니다. 그렇지만 많은 개발자들은 아직도 범용적인 기본 자료형, 예를 들어 int, Guid, string을 주로 사용합니다. 이건 실수를 유발할 수 있는 행위입니다. (유지보수의 어려움)

유지보수의 어려움을 조금 더 구체적으로 설명해 보겠습니다. 다음과 같은 함수가 있다고 하죠.

int GetGrade(Guid courseID, Guid userID, Guid termID)
{
    ...
}

이 함수는 특정 사용자의 점수를 받아옵니다. 하지만, 후에 다른 개발자가 매개변수의 순서를 변경한다면 어떻게 될까요?

int GetGrade(Guid userID, Guid courseID, Guid termID)
{
    ...
}

모든 호출 위치에서 인자의 순서를 변경해야 합니다. 그런데 이런 변경사항을 놓치기 쉽고, 코드 리뷰에서도 발견하기 어렵습니다. 결국 서버를 실행할 때까지 이 문제를 인지하지 못하게 되죠.

웹 프로그래밍에서는 함수의 매개변수가 훨씬 많아, 이런 실수가 자주 발생합니다. 이런 부분에서 컴파일러의 검증 기능을 활용하는 것이 필요하죠.

Java를 선두로 한 OOP 패러다임에서는 도메인 모델링을 통해 도메인 특화 자료형을 활용하는 방법을 제안했었습니다. 예를 들어, Guid 대신 UserID 클래스를 생성하여 사용하는 방식이죠. 그러나 개체 생성(따라서 가비지 수집)에 따른 성능저하 문제 때문에 이제는 주류에서 벗어난 방식이 되었습니다.

참고로 C++은 스택에 개체를 생성할 수 있어서 성능저하 문제가 거의 없습니다. 하지만 가장 고통 받고 있는 웹 프로그래밍 분야에서 C++ 사용하는 일은 거의 없으니 별 의미없는 이야기죠?

다행히도 최신 버전의 C#에서는 record struct를 사용하여 이러한 문제를 어느 정도 해결할 수 있습니다.

얼마 전부터 제 회사에서도 적극 활용하기 시작했는데, 이 테크닉에 대해서는 다음 기회에 소개하도록 하겠습니다.

img

포인터의 확실한 이해 | C 언어 독학 | 모든 프로그래밍 언어의 어머니

5차 산업혁명을 책임질 컴퓨터 하드웨어 지식! POCU 아카데미에서 C 언어를 마스터하세요!