테마
자료형·연산자·표기법
코드 출력 문제는 대부분 "이 식이 어떤 순서로, 어떤 형으로 계산되는가"에서 갈린다. 이 문서는 자료형(data type)의 크기, 연산자 우선순위(operator precedence), 결과가 헷갈리는 증감·나눗셈·비트 연산, 변수 이름 규칙인 헝가리안 표기법(Hungarian notation)을 정리한다. 시험은 짧은 코드의 출력값이나 표기법의 이름을 단답으로 묻는다.
자료형의 크기
자료형은 값이 메모리를 얼마나 차지하고 어떻게 해석되는지를 정한다. 크기를 알아야 넘침과 형 변환(type conversion) 결과를 예측할 수 있다. Java는 언어 명세가 크기를 고정하지만, C는 표준이 최소 범위만 정해서 int·long 크기가 플랫폼마다 다를 수 있다. 시험은 흔한 환경을 전제로 한다. Java char가 2바이트인 것은 UTF-16(Unicode Transformation Format-16, 유니코드를 16비트 단위로 표현하는 방식) 단위로 문자를 담기 때문이다.
| 자료형 | C (흔한 환경) | Java (명세 고정) |
|---|---|---|
| char | 1바이트 | 2바이트 |
| int | 4바이트 | 4바이트 |
| long | 4 또는 8바이트 | 8바이트 |
| float / double | 4 / 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바이트.
참고
일부 수험 자료는 조건 연산자의 결합 방향을 왼쪽에서 오른쪽으로 적는다. C 표준과 Java 명세 기준으로는 오른쪽에서 왼쪽이라
a ? b : c ? d : e는a ? b : (c ? d : e)로 묶인다. ↩︎
