Skip to content
난이도 출제 빈출문제은행 6

자료형·연산자·표기법 ​

코드 출력 문제는 대부분 "이 식이 어떤 순서로, 어떤 형으로 계산되는가"에서 갈린다. 이 문서는 자료형(data type)의 크기, 연산자 우선순위(operator precedence), 결과가 헷갈리는 증감·나눗셈·비트 연산, 변수 이름 규칙인 헝가리안 표기법(Hungarian notation)을 정리한다. 시험은 짧은 코드의 출력값이나 표기법의 이름을 단답으로 묻는다.

자료형의 크기 ​

자료형은 값이 메모리를 얼마나 차지하고 어떻게 해석되는지를 정한다. 크기를 알아야 넘침과 형 변환(type conversion) 결과를 예측할 수 있다. Java는 언어 명세가 크기를 고정하지만, C는 표준이 최소 범위만 정해서 int·long 크기가 플랫폼마다 다를 수 있다. 시험은 흔한 환경을 전제로 한다. Java char가 2바이트인 것은 UTF-16(Unicode Transformation Format-16, 유니코드를 16비트 단위로 표현하는 방식) 단위로 문자를 담기 때문이다.

자료형C (흔한 환경)Java (명세 고정)
char1바이트2바이트
int4바이트4바이트
long4 또는 8바이트8바이트
float / double4 / 8바이트4 / 8바이트

연산자 우선순위 ​

한 식에 연산자가 여러 개면 우선순위가 높은 것부터 계산하고, 같은 단계에서는 결합 방향(associativity)을 따른다. 아래는 높은 순서다. 단항 연산자, 조건 연산자, 대입 연산자만 오른쪽에서 왼쪽으로 결합한다.

순위연산자
1단항 ! ~ ++ -- sizeof 형 변환
2산술 * / % → + -
3시프트(shift) << >>
4관계 < <= > >= → == !=
5비트 & → ^ → `
6논리 && → `
7조건 ? :
8대입 = += 등 → 쉼표 ,

"산술이 시프트보다, 관계가 비트보다, 비트가 논리보다 먼저"라고 묶어 외우면 된다.1

결과가 헷갈리는 연산 ​

증감 연산자는 위치에 따라 식에 쓰이는 값이 다르다. 전위 ++a는 먼저 올린 뒤 그 값을 쓰고, 후위 a++는 원래 값을 쓴 뒤 올린다. 정수 나눗셈은 소수점 아래를 버리므로 7 / 2는 3이다. 한쪽을 (double)로 바꾸면 실수 나눗셈이 된다.

c
int a = 5;
int b = a++ + 2;      // 5 + 2 = 7, 그 뒤 a는 6
int c = ++a * 2;      // a가 7이 된 뒤 7 * 2 = 14
printf("%d %d %d\n", a, b, c);                    // 7 7 14
printf("%d %.1f\n", 7 / 2, (double)7 / 2);        // 3 3.5

비트 연산은 값을 2진수로 놓고 자리마다 계산한다. a << n은 왼쪽으로 n칸 밀어 a × 2ⁿ, a >> n은 양수에서 a ÷ 2ⁿ의 몫이 된다.

헝가리안 표기법 ​

헝가리안 표기법은 변수 이름 앞에 자료형이나 용도를 뜻하는 접두어를 붙이는 명명 규칙이다. 예를 들어 정수는 i, 실수는 d, 문자열은 sz를 붙여 iCount, dRate처럼 쓴다. 이름만 보고 형을 알 수 있어서, 형 확인을 도와주는 도구가 약하던 시절에 실수를 줄이려고 쓰였다. 제록스 파크와 마이크로소프트에서 일한 찰스 시모니(Charles Simonyi)가 만들었다.

시험 포인트 ​

  • "변수명 앞에 자료형을 뜻하는 접두어를 붙인다" → 헝가리안 표기법.
  • a++는 쓰고 올림, ++a는 올리고 씀. 정수끼리 나누면 몫만 남는다.
  • 우선순위: 단항 > 산술 > 시프트 > 관계 > 비트(& ^ |) > 논리(&& ||) > 조건 > 대입 > 쉼표.
  • Java 크기: byte 1·short 2·char 2·int 4·long 8·float 4·double 8바이트.

참고

  1. 일부 수험 자료는 조건 연산자의 결합 방향을 왼쪽에서 오른쪽으로 적는다. C 표준과 Java 명세 기준으로는 오른쪽에서 왼쪽이라 a ? b : c ? d : e는 a ? b : (c ? d : e)로 묶인다. ↩︎

관련 문서