728x90
반응형
1. 강한 형식 검사(Strong Typing)이란
- 변수나 함수의 타입이 엄격하게 적용되는 방식을 말한다
- 컴파일러나 런타임에서 타입 불일치가 발생하면 에러가 난다
- 의도치 않은 형 변환이 자동으로 일어나지 않아, 코드의 안정성과 유지보수성이 높아진다
C# 예시
int number = 10;
// number는 int 타입이므로 문자열 대입이 불가능
number = "Hello"; // 컴파일 에러
이처럼 강한 형식 언어에서는 타입이 다른 값을 넣으면 에러가 발생한다.
C++ 예시
int number = 10;
// number는 int 타입이므로 문자열 대입이 불가능
number = "Hello"; // 컴파일 에러
C++도 마찬가지로 강한 형식 검사를 한다.
2. 약한 형식 검사(Weak Typing)이란
- 변수에 어떤 타입이 들어가도 비교적 자유롭게 동작하는 방식을 말한다
- 내부적으로 암묵적인 형 변환이 자주 일어나거나, 타입 불일치가 무시될 수도 있다
- 코드가 간결해질 수 있지만, 예기치 못한 동작이나 에러가 런타임에만 드러나 디버깅이 어려울 수 있다
일반적으로 JavaScript, Python 같은 동적 타입 언어가 약한 형식 검사의 예로 자주 거론된다.
3. C#에서의 특별 케이스: dynamic
C#은 기본적으로 강한 형식 검사 언어지만, dynamic 키워드를 쓰면 일부 약한 형식처럼 동작한다.
- 컴파일 시점에 타입 체크가 거의 없고, 런타임 시점에 타입을 확인한다
- 잘못된 연산을 하거나 잘못된 멤버 호출을 하면 런타임 예외를 던진다
dynamic data = 10;
Console.WriteLine(data); // 10
data = "Hello";
Console.WriteLine(data); // Hello
data = data + 10; // 문자열에 숫자를 더하려다 오류 발생 가능 (런타임 예외)
단, dynamic을 자주 사용하면 타입 안정성이 무너질 수 있으므로 주의가 필요하다.
4. var, auto 키워드와 타입 추론
C#의 var
var number = 10; // number는 int로 추론
var text = "Hello"; // text는 string으로 추론
// 나중에 number = "Text"; 같은 대입은 컴파일 에러
- var는 컴파일 시점에 우변의 타입을 추론해 “해당 타입”으로 고정한다
- 런타임에 타입이 바뀌는 약한 형식 검사가 아니다. 여전히 강한 형식을 유지한다
C++의 auto
auto number = 10; // number는 int로 추론
auto text = "Hello"; // text는 const char* 로 추론
// 이후 number = "World"; 같은 대입은 컴파일 에러
- C++의 auto 역시 컴파일 시점에 타입을 결정해, 강한 형식을 유지한다
즉, var나 auto는 “타입을 생략해서 코드 가독성을 높이는” 키워드일 뿐, 약한 형식 검사가 아니다.
5. 정리
- 강한 형식 검사: 컴파일 시점에 타입을 엄격히 체크해서 안전성과 유지보수성을 높여준다. C#, C++ 등이 대표적이다.
- 약한 형식 검사: 타입 변환이 자유롭고 유연하지만, 예상치 못한 런타임 오류가 발생할 수 있다. JavaScript, Python 등이 이에 해당한다.
- C#은 기본적으로 강한 형식 검사 언어지만, dynamic을 쓰면 일부 약한 형식처럼 동작할 수 있다.
- var(C#)와 auto(C++)는 타입 추론 키워드로, 컴파일 시점에 타입이 정해지므로 여전히 강한 형식 검사 영역이다.
프로젝트 규모나 목적에 따라 강한 형식을 선택할지, 약한 형식을 선택할지 결정하면 된다. 규모가 클수록 강한 형식 검사가 유리하고, 단기간 프로토타이핑이 필요하면 약한 형식이 빠를 때도 있다.
반응형