기본 콘텐츠로 건너뛰기

방송대 프로그래밍언어론 9강: 타입 안전성과 단순타입의 데이터·연산 집합

0-썸네일-요약노트-프로그래밍언어론-9강

방송대 프로그래밍언어론 9강: 타입 안전성과 단순타입의 데이터·연산 집합

같은 +라도 정수에서는 덧셈, 문자에서는 코드값을 이용한 처리로 해석될 수 있다. 연산 기호만 보지 말고 값의 집합, 저장 표현, 허용 연산, 결과 타입을 차례로 확인하면 정수·실수·문자·논리·열거형을 하나의 기준으로 비교할 수 있다.

연산 기호보다 먼저 피연산자의 타입을 확인한다

타입 문제를 풀 때 쓸 네 칸짜리 타입 여권을 만들자. 첫 칸에는 가능한 값의 집합, 둘째 칸에는 기억장소 표현, 셋째 칸에는 허용 연산, 넷째 칸에는 연산 결과의 타입을 적는다. 이 틀은 같은 기호가 문맥에 따라 달라지는 이유를 설명해 준다.

여권 항목확인 질문정수형 예
데이터 집합어떤 값이 들어갈 수 있는가?정해진 범위의 정수
표현몇 비트로 어떻게 저장하는가?부호 여부와 비트 수
연산 집합어떤 계산과 비교를 허용하는가?사칙연산, 나머지, 비트, 관계 연산
결과 타입연산 뒤 어떤 종류의 값이 나오는가?정수 연산은 정수, 관계 연산은 논리값

판단 핵심: 타입은 이름표가 아니라 데이터 집합과 그 데이터에 적용할 수 있는 연산 집합의 결합이다.

타입 안전성은 입력과 결과가 약속된 집합에 남는지 묻는다

함수 f가 타입 A의 값을 받아 타입 B를 돌려준다고 하자. f: A → B라는 약속이 안전하려면 모든 aA에 대해 f(a)B에 속해야 한다. 맞지 않는 타입의 입력이나 범위를 벗어난 결과가 허용되면 타입 오류가 생길 수 있다.

강의는 오류 검출 정도를 기준으로 언어를 강타입, 약타입, 무타입 언어로 구분한다. 강타입 언어는 타입 오류를 모두 검출하는 방향이고, 약타입 언어는 오류를 검출하더라도 형변환이나 공용체 등으로 일부 검사를 피할 수 있다. 무타입 언어는 선언 없이 객체의 타입이 실행 중 달라질 수 있는 언어를 가리키는 강의상의 분류다.

용어 주의: 여기의 분류와 예시는 해당 강의의 설명 기준이다. 특히 Java의 캐스팅을 제외한 비교, C의 공용체·캐스팅, Python 같은 스크립트 언어의 사례를 그 기준 안에서 이해한다.

타입 분류의 세 축은 서로 대신할 수 없다

타입은 서로 다른 세 질문으로 분류된다. 데이터의 형태를 묻는 축, 언어가 미리 제공했는지 사용자가 만들었는지를 묻는 축, 한 값이 단일 요소인지 여러 요소의 구조인지를 묻는 축이다. 한 타입에는 세 축의 판정이 동시에 붙을 수 있다.

분류 축한쪽다른 쪽판정 질문
데이터 형태정수·실수·문자 등배열·구조체 등값이 어떤 모양인가?
사용자 관여원시타입사용자정의타입언어가 제공했나, 사용자가 정의했나?
원소 구성단순타입복합타입한 데이터 요소인가, 요소들의 구조인가?

예를 들어 열거형은 사용자가 이름 목록을 정의하므로 사용자정의타입이지만, 한 번에 하나의 열거값을 가지므로 단순타입이다. 배열은 원소형과 크기를 사용자가 정할 수 있고 여러 원소를 묶으므로 사용자정의·복합타입으로 판정할 수 있다.

정수형은 비트 수와 부호 여부로 데이터 집합이 정해진다

n비트 부호 있는 정수의 개념적 범위는 −2n−1부터 2n−1−1까지이고, 부호 없는 정수는 0부터 2n−1까지다. 따라서 8비트라면 부호형은 −128~127, 무부호형은 0~255다.

  1. 비트 수 n을 확인한다.
  2. 부호형이면 한 비트를 부호 구분에 반영해 2n−1을 기준으로 잡는다.
  3. 최댓값은 가능한 값의 개수에서 1을 빼 계산한다.
언어강의에서 제시한 정수 표현비교 포인트
C·C++short·int 최소 16비트, long 32비트, long long 64비트부호형과 무부호형을 제공
Javabyte 8, short 16, int 32, long 64비트강의 비교에서는 무부호 정수형이 없음

정수 경계에서는 계산값과 표현 가능성을 따로 본다

정수 나눗셈 10 / 3은 정수 부분 3을 남기고, 9 % 5는 나머지 4를 낸다. 관계 연산의 결과는 정수가 아니라 참·거짓의 논리값이다. 비트 연산은 정수의 비트 패턴에 작용한다.

강의 슬라이드의 16비트 부호 정수 경계 모형에서는 32767 + 1이 −32768로, -32768 - 1이 32767로 이어지는 순환을 보여 준다. 이 그림은 유한한 저장 범위를 이해하기 위한 모형이다. 실제 프로그램의 경계 초과 결과는 언어와 정수형의 규칙을 별도로 확인해야 하며, C·C++의 부호 있는 정수 초과를 반드시 순환한다고 일반화해서는 안 된다.

경계 점검 순서: 수학적 결과를 먼저 계산하고 → 그 결과가 표현 범위에 드는지 확인하고 → 범위를 벗어나면 해당 언어와 타입의 규칙을 확인한다.

실수형은 부호·지수부·가수부로 근삿값을 표현한다

실수형은 무한한 실수 전체가 아니라 기억장소로 표현 가능한 유한한 부분집합을 근사해 저장한다. 부동소수점 표현은 부호, 지수부, 가수부로 나뉘며 정규화한 값은 대략 ±1.가수 × 2지수로 읽는다. 저장 지수는 실제 지수에 바이어스를 더한 값이다.

5.0을 지수 3비트, 가수부 4비트인 학습용 형식으로 바꿔 보자.

  1. 십진수 5.0은 이진수 101.0이다.
  2. 정규화하면 1.01 × 2²이므로 실제 지수는 2다.
  3. 지수 3비트의 바이어스는 22−1=3, 저장 지수는 2+3=5, 즉 101이다.
  4. 양수라서 부호는 0, 선행 1 뒤의 가수는 0100으로 채운다.
5.0 = 101.0₂ = 1.01₂ × 2²
부호 | 저장 지수 | 가수부
  0  |    101    | 0100

실제 대표 형식에서 단정도는 32비트(부호 1, 지수 8, 가수 23, 바이어스 127), 배정도는 64비트(부호 1, 지수 11, 가수 52, 바이어스 1023)로 설명된다. 실수의 범위 초과는 강의 모형에서 양·음의 무한대로 이어진다.

문자형은 문자 코드와 연산 가능 범위를 함께 본다

문자형의 데이터 집합은 문자 코드가 정한 문자들이다. ASCII는 128개 문자를 표현하며, 강의 비교에서 C·C++의 char는 8비트 정수형처럼 다룰 수 있어 산술·비트 연산이 가능하다. Java의 char는 16비트 유니코드 문자형으로 제시된다.

ASCII를 전제로 문자 'C'에 2를 더하는 과정을 추적하면 코드 67+2=69가 되고, 코드 69에 해당하는 'E'로 해석할 수 있다. 마찬가지로 대문자와 소문자의 코드 차이 32를 이용한 예가 가능하지만, 이는 문자 인코딩과 언어의 연산 규칙을 전제로 한다.

오개념 방지: 문자가 화면에서 한 글자로 보인다는 사실과 내부에서 정수 연산이 허용된다는 사실은 다르다. C·C++의 강의 사례를 모든 언어의 문자형에 그대로 적용하지 않는다.

논리형은 조건의 결과를 다시 논리 연산에 연결한다

논리형은 참과 거짓을 나타내는 단순타입이다. 강의에서는 C의 _Bool이 1과 0, C++의 bool, Java의 boolean을 비교한다. AND·OR·NOT 연산과 관계 연산의 결과는 논리형이므로 조건문에 연결할 수 있다.

예를 들어 (age >= 20) AND member는 먼저 관계 연산으로 논리값을 만들고, 그 결과와 member를 AND로 결합한다. 타입 여권으로 보면 입력 둘과 결과가 모두 논리형인지 확인하는 문제다.

열거형은 이름과 정수 대응으로 순서를 만든다

열거형은 사용자가 열거한 이름을 값으로 갖는 단순타입이다. 각 이름에는 0 이상의 정수가 대응하며, 값을 지정하지 않으면 앞 값에서 하나씩 증가한다. 직접 값을 지정하면 다음 이름은 그 값의 다음 정수부터 이어진다.

enum Level { Low = 2, Mid, High = 7, Peak };

왼쪽부터 추적하면 Low=2, Mid=3, High=7, Peak=8이다. 강의의 월 열거 예처럼 서로 다른 이름에 같은 정숫값을 지정할 수도 있으므로, 이름의 개수와 서로 다른 대응 숫자의 개수가 늘 같지는 않다. C의 강의 사례에서는 대응 정수를 바탕으로 산술 연산도 설명한다.

다섯 단순타입은 같은 비교틀로 구분할 수 있다

타입값·표현의 핵심대표 연산자주 놓치는 조건
정수형비트 수와 부호에 따른 유한 범위산술·나머지·비트·관계범위 경계와 언어 규칙
실수형부호·지수·가수의 근사 표현산술·관계정밀도와 범위
문자형문자와 코드의 대응관계, 일부 언어의 산술·비트인코딩과 언어 차이
논리형참·거짓AND·OR·NOT관계 연산 결과와의 연결
열거형이름과 0 이상 정수의 대응관계, 언어에 따른 산술명시값 이후 증가와 중복값

타입 문제는 여권의 빈칸을 채우듯 해결한다

  1. 대상 식별: 피연산자와 변수의 타입을 찾는다.
  2. 집합 확인: 주어진 값이 그 타입의 데이터 집합에 속하는지 본다.
  3. 표현 확인: 비트 수, 부호, 문자 코드, 지수·가수처럼 저장 조건을 적는다.
  4. 연산 확인: 그 타입과 언어가 해당 연산을 허용하는지 판정한다.
  5. 결과 검증: 결과 타입과 표현 범위를 확인하고 경계 규칙을 적용한다.

관계 중심 복습: 타입은 데이터 집합과 연산 집합을 함께 정한다. 정수는 비트 수·부호, 실수는 부호·지수·가수, 문자는 인코딩, 논리는 참·거짓, 열거는 이름·정수 대응이 표현의 핵심이다. 관계 연산은 서로 다른 단순타입에서도 결과를 논리형으로 연결한다.

마지막 한 줄: 타입을 묻는 문제에서는 값만 계산하지 말고 “어떤 집합의 값을 어떤 표현으로 저장하며, 어떤 연산을 거쳐 어떤 타입으로 돌아오는가”를 끝까지 추적한다.

예상문제

1. 강의에서 설명한 타입의 구성으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 어떤 값이 가능한지와 그 값에 어떤 연산을 허용하는지가 타입의 두 핵심 요소다.
  • ② 오답: 이름과 주소의 연결은 바인딩 문제이며 타입의 전체 정의가 아니다.
  • ③ 오답: 번역 단계의 명령 대응은 타입이 규정하는 데이터·연산 집합과 다른 관계다.
  • ④ 오답: 입출력 장치 구성은 프로그램 실행 환경이지 값의 타입 정의가 아니다.

2. 사용자 관여 축과 원소 구성 축을 함께 적용한 판정으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 열거 이름은 사용자가 정의하고 한 값은 단일 요소이므로 두 축을 반대로 적용했다.
  • ② 오답: 배열은 여러 원소를 묶는 구조라 복합타입이며 원소형과 크기를 정할 수 있다.
  • ③ 정답: 사용자가 이름 목록을 정의하지만 변수 하나가 갖는 값은 열거된 단일 값이다.
  • ④ 오답: 정수형은 대표적인 원시타입이며 정수마다 사용자가 이름을 선언하지 않는다.

3. f: A → B인 연산의 타입 안전성을 확인하는 설명으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 일부 입력만 만족하면 나머지 입력에서 타입 약속이 깨질 수 있다.
  • ② 오답: 수치의 대소는 집합 소속과 같은 판단 기준이 아니다.
  • ③ 오답: 비트 수가 같아도 값의 의미와 허용 연산이 다른 타입일 수 있다.
  • ④ 정답: 정의역의 모든 허용 입력이 약속한 공역의 결과로 이어지는지를 점검한다.

4. 8비트 부호 없는 정수형의 개념적 범위는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 이는 8비트 부호 있는 정수에 적용하는 범위다.
  • ② 정답: 무부호 8비트는 2⁸=256개 패턴을 0부터 2⁸−1까지 사용한다.
  • ③ 오답: 최댓값 계산에 7비트만 반영해 표현 가능한 절반을 누락했다.
  • ④ 오답: 무부호형에는 음수가 없고 8비트로 이 범위 전체를 나타낼 수도 없다.

5. 정수 범위 경계에 관한 해석으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 강의 그림은 유한 범위 모형이며 C·C++ 부호 정수 등에는 별도 규칙이 있다.
  • ② 오답: 계산값을 저장할 수 있는지 확인해야 경계 초과를 발견할 수 있다.
  • ③ 오답: 범위 초과가 곧 실수형 변환을 의미하지 않으며 그런 변환 규칙도 제시되지 않았다.
  • ④ 정답: 계산, 표현 가능성, 언어별 처리를 분리해야 과도한 일반화를 피할 수 있다.

6. 본문의 학습용 부동소수점 형식에서 5.0을 표현하는 순서로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 101.0₂를 1.01₂×2²로 만든 뒤 지수 2에 바이어스 3을 더해 각 필드를 채운다.
  • ② 오답: 인코딩할 때는 저장 지수에 바이어스를 더하며 가수 정보를 삭제하지 않는다.
  • ③ 오답: 양수의 부호를 반전하지 않고 지수와 문자 코드도 관련이 없다.
  • ④ 오답: 나열된 단계는 정수 연산들이며 부동소수점 필드 구성 과정이 아니다.

7. 강의의 C·C++ 문자형과 ASCII를 전제로 'C' + 2를 문자로 해석한 결과는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 'A'는 'C'의 코드에서 2를 뺀 결과에 해당한다.
  • ② 정답: 'C'의 ASCII 코드 67에 2를 더하면 69이고 그 문자는 'E'다.
  • ③ 오답: 대문자에서 소문자로 바꾸려면 강의 예의 코드 차이 32를 고려해야 한다.
  • ④ 오답: 2를 더하는 연산만으로 소문자 영역까지 이동하지 않는다.

8. enum Level { Low = 2, Mid, High = 7, Peak };에서 MidPeak의 대응값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 명시한 값은 각각 앞의 LowHigh에 대응한다.
  • ② 오답: PeakHigh의 명시값 7 다음인 8로 증가한다.
  • ③ 정답: 미지정 이름은 바로 앞 대응값에서 하나씩 증가하므로 3과 8이다.
  • ④ 오답: 두 이름 모두 직전 값에 2를 더해 증가 폭을 잘못 적용했다.

9. 정수형과 실수형의 표현 차이를 옳게 비교한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 문자 코드표는 문자형의 핵심 표현이며 두 수치형의 공통 저장 방식이 아니다.
  • ② 오답: 부호·지수·가수는 실수형이고 열거 이름 대응은 열거형의 특징이다.
  • ③ 정답: 두 타입의 여권에서 표현 항목을 정확히 대비한 설명이다.
  • ④ 오답: 기억장소가 유한하므로 두 타입 모두 표현 가능한 집합에 한계가 있다.

10. 처음 보는 타입 연산 문제를 해결하는 절차로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 같은 기호도 타입에 따라 의미가 달라지고 경계 초과도 놓칠 수 있다.
  • ② 오답: 크기는 표현 조건 하나일 뿐 값의 의미와 연산 허용 여부를 결정하지 못한다.
  • ③ 오답: 입력 타입과 허용 연산을 먼저 확인해야 결과를 정당하게 도출할 수 있다.
  • ④ 정답: 타입 여권의 네 항목과 최종 범위 검증을 순서대로 모두 반영한다.

참고 자료와 작성 기준

이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 타입 여권, 정수 범위와 부동소수점 계산, 문자 코드와 열거형 추적 예제는 학습자의 이해를 돕도록 구성하고 검토했습니다.

  • 작성·편집: 올에이클래스 학습연구팀
  • 주요 근거: 한국방송통신대학교 컴퓨터과학과 프로그래밍언어론 제9강 「타입」 강의자료(2025)
  • 보충 자료: 별도의 외부 자료를 사용하지 않음
  • 편집 원칙: 올에이클래스 편집 정책
  • 최종 내용 검토: 2026-08-29

댓글