문자열과 열거 타입

"hello"가 어디서 끝나는지 컴퓨터는 어떻게 알까?

문자열 타입

문자를 줄지어 놓은 값

문자열(character string)의 값은 문자들의 나열입니다. 언어를 설계할 때 두 가지를 정해야 합니다. 문자열을 기본 타입으로 둘지 문자의 배열로 볼지, 그리고 길이를 고정할지 바뀌게 둘지입니다.

배열은 1강에서 본, 값 여러 개를 줄지어 담은 것입니다.

문자열의 길이

길이를 정하는 방식 셋

정적 길이는 만들 때 길이가 정해지고 그 뒤로 변하지 않습니다. 제한된 동적 길이는 잡아 둔 칸 안에서만 바뀝니다. 동적 길이는 제한 없이 늘고 줄어듭니다.

영어로는 static length, limited dynamic length, dynamic length입니다. 글자와 칸 수는 예시입니다.

제한된 동적 길이

끝 표시가 나올 때까지

C와 C++는 문자열의 길이를 따로 적어 두지 않습니다. 대신 특수 문자 하나로 끝을 표시합니다. 읽을 때는 그 표시가 나올 때까지 한 칸씩 갑니다.

글자와 칸 수는 예시입니다. 길이를 어떻게 정하느냐가 문자열의 구현 방식과 효율을 좌우합니다.

순서 타입과 열거 타입

값에 이름을 붙여 늘어놓습니다

가능한 값을 양의 정수와 하나씩 짝지을 수 있는 타입이 순서 타입(ordinal type)입니다. 그 값을 이름 붙은 상수로 모두 늘어놓아 프로그래머가 직접 만드는 것이 열거 타입(enumeration type)입니다.

C# 코드입니다. 상수는 바뀌지 않는 값입니다. 자바의 정수, 문자, 불리언도 순서 타입입니다.

열거 타입의 좋은 점

숫자 대신 이름, 틀린 값은 거절

숫자 대신 이름을 쓰니 읽기 쉽습니다. 요일끼리 더하는 것처럼 뜻 없는 연산과, 정해 둔 범위 밖의 값을 넣는 일은 컴파일러가 막아 줍니다. 가독성과 신뢰성이 함께 오릅니다.

예시입니다. 컴파일러는 1강에서 본, 소스를 기계어로 번역하는 프로그램입니다.

언어마다 다른 점

정수로 슬쩍 바뀌면 검사가 뚫립니다

C++에서는 열거 타입의 값이 정수로 자동 변환됩니다. 그러면 요일이 정수 계산에 섞여도 걸러지지 않습니다. C#, F#, Swift, 자바 5.0은 자동 변환을 하지 않아 열거 타입을 더 안전하게 지원합니다.

다음 편

값이 아주 많을 때 쓰는 배열로 넘어갑니다

3편1000번째 칸을 어떻게 바로 찾을까? 5강 목록