[궁금시리즈] 1-3. 정적 타이핑이란?

3 minute read

“C#은 정적 타이핑(Static Typing) 언어입니다.” C#을 공부하다 보면 가장 먼저 듣는 설명 중 하나다. 하지만 대부분은 단순히

“변수의 타입을 미리 정하는 언어”

정도로만 이해하고 넘어간다.

물론 틀린 설명은 아니지만, 이것만으로는 왜 정적 타이핑이 중요한지 알기 어렵다. 이번 글에서는 정적 타이핑이 무엇인지, 그리고 C#이 왜 정적 타이핑 언어인지 알아보자.  

타입(Type)이란?

먼저 타입(Type)이 무엇인지부터 알아보자. 타입이란

값의 종류와 사용할 수 있는 동작을 정의하는 정보이다.

예를 들어

int number = 10;

여기서 int는

  • 정수를 저장할 수 있고
  • 덧셈, 뺄셈 등의 연산이 가능하며
  • 메모리 크기는 4Byte

라는 정보를 가지고 있다.

반면

string text = "Hello";

string은

  • 문자열을 저장하고
  • Length를 사용할 수 있으며
  • 문자열 연결이 가능하다.

즉, 타입은 단순히 “자료형 이름”이 아니라

해당 값이 무엇을 할 수 있는지를 정의하는 규칙

이라고 생각하면 된다.  

정적 타이핑이란?

정적 타이핑(Static Typing)은

변수의 타입이 컴파일 시점에 결정되는 방식이다.

예를 들어

int number = 10;

컴파일러는 이미

number는 int다.

라는 사실을 알고 있다. 그래서

number = "Hello";

같은 코드는 실행하기도 전에 오류를 발생시킨다.

Cannot implicitly convert type 'string' to 'int'

즉, 프로그램을 실행하기 전에 타입 오류를 발견할 수 있다.

동적 타이핑은 무엇이 다를까?

대표적인 동적 타이핑 언어는

  • Python
  • JavaScript

등이 있다. Python에서는

value = 10
value = "Hello"
value = True

모두 가능하다. 같은 변수에 서로 다른 타입을 계속 저장할 수 있다. 왜냐하면 변수의 타입이 아니라 값이 자신의 타입을 가지고 있기 때문이다.

즉, 타입은 프로그램 실행 중(Runtime)에 결정된다.  

Static vs Dynamic

정적 타이핑 동적 타이핑
컴파일 시 타입 결정 실행 중 타입 결정
컴파일 단계에서 오류 발견 실행 중 오류 발생 가능
IDE 지원이 뛰어남 유연성이 높음
성능 최적화가 쉬움 런타임 검사 비용이 존재

둘 중 어느 것이 더 좋다고 말할 수는 없다. 각각 장단점이 존재한다.

C#은 안정성과 성능을 위해 정적 타이핑을 선택하였다.  

컴파일 타임(Compile Time)

컴파일 타임이란

소스 코드를 실행 파일(IL)로 변환하는 과정이다.

이 과정에서 컴파일러는

  • 타입 검사
  • 문법 검사
  • 변수 존재 여부
  • 접근 제한자 확인

등 수많은 검사를 수행한다.

예를 들어

int age = "20";

이 코드는 실행조차 되지 않는다. 컴파일 단계에서 이미 오류가 발생하기 때문이다.

즉, 정적 타이핑은 많은 오류를 실행 전에 제거한다.  

런타임(Runtime)

런타임은

컴파일이 끝난 프로그램이 실제로 실행되는 시점이다.

CLR이 프로그램을 실행하면서

  • 메서드 호출
  • 메모리 할당
  • GC 수행
  • 예외 처리

등이 이루어진다.

정적 타이핑 언어라고 해서 런타임에 타입 검사가 전혀 없는 것은 아니다. 일부 상황에서는 실행 중에도 타입 확인이 필요하다.

예를 들어

object value = "Hello";

if (value is string text)
{
    Console.WriteLine(text.Length);
}

여기서는 object 안에 실제 어떤 타입이 들어있는지 컴파일러는 알 수 없다. 따라서 실행 중(Runtime)에 타입을 확인하게 된다.

이처럼 다형성, object, 인터페이스, Reflection 등을 사용할 때는 런타임 타입 검사가 필요하다.  

정적 타이핑의 장점

1. 오류를 빨리 발견한다.

int number = "ABC";

실행 전에 오류가 발생한다. 서비스 운영 중 오류가 발생하는 가능성을 줄여준다.   2. IDE의 강력한 지원 Visual Studio나 Rider에서는

  • 자동 완성(IntelliSense)
  • 리팩터링
  • 타입 추론
  • 코드 분석

등이 가능한 이유도 타입 정보가 이미 존재하기 때문이다.  

  1. 성능 최적화 컴파일러와 JIT는 타입을 이미 알고 있기 때문에

메모리 배치 메서드 호출 인라인 최적화

등을 효율적으로 수행할 수 있다.  

정적 타이핑에도 단점은 있다.

정적 타이핑은 안정성이 높지만 유연성은 상대적으로 떨어진다.

예를 들어

int number = 10;

이미 int로 결정되었기 때문에

number = "Hello";

처럼 다른 타입을 저장할 수 없다. 반면 Python에서는 자유롭게 타입을 변경할 수 있다.

이러한 제약 때문에 초기 개발 속도는 동적 타이핑 언어가 더 빠른 경우도 있다.  

C#은 정말 항상 정적 타이핑일까?

많은 사람들이

var number = 10;

를 보고

“var는 동적 타입 아닌가요?”

라는 의문을 가진다.

하지만 그렇지 않다. var 역시 컴파일 시점에 타입이 결정되는 정적 타이핑이다. 이에 대해서는 다음 글에서 자세히 알아보겠다.  

마무리

정적 타이핑은 단순히 “변수의 타입을 미리 선언하는 방식”이 아니다. 컴파일 시점에 타입을 확정함으로써 오류를 미리 발견하고, IDE의 강력한 지원을 받을 수 있으며, 런타임 성능까지 향상시키는 중요한 설계 방식이다. 물론 모든 상황에서 런타임 타입 검사가 사라지는 것은 아니며, object, 인터페이스, 다형성 같은 기능을 사용할 때는 여전히 실행 중 타입 확인이 필요하다. 다음 글에서는 많은 개발자가 한 번쯤 헷갈리는 var는 동적 타입일까?를 알아보겠다.  

핵심 정리

  • 타입은 값의 종류와 사용할 수 있는 동작을 정의하는 정보이다.
  • 정적 타이핑은 컴파일 시점에 타입이 결정된다.
  • 동적 타이핑은 실행 중 타입이 결정된다.
  • C#은 정적 타이핑 언어이며 대부분의 타입 오류를 컴파일 단계에서 발견한다.
  • object, 다형성, Reflection 등에서는 런타임 타입 검사가 필요하다.
  • var도 컴파일 시 타입이 결정되는 정적 타이핑이다.