프로그램은 결국 값을 어딘가에 담아 두었다가 꺼내 쓰는 일의 반복입니다. 그 그릇이 변수이고, 그릇의 규격이 자료형입니다. 이번 편에서는 자바가 정해 둔 8가지 기본 자료형을 표로 훑고, String이 왜 조금 다른 취급을 받는지, 그리고 형변환에서 값이 조용히 망가지는 상황까지 확인합니다.
변수 선언은 그릇의 크기를 미리 정하는 일입니다
자바에서 변수를 만들 때는 항상 자료형 이름 = 값; 순서로 씁니다. 앞의 자료형이 이 그릇에 무엇을 담을지, 그리고 메모리를 얼마나 차지할지를 결정합니다.
int postCount = 12; // 정수를 담는 그릇
double readRate = 63.5; // 소수점이 있는 수
char grade = 'A'; // 문자 한 글자 (작은따옴표)
boolean isPublished = true; // 참 또는 거짓
한 번 int로 선언한 postCount에는 그 뒤로 정수만 들어갈 수 있습니다. 나중에 문자열을 넣으려 하면 실행되기 전 컴파일 단계에서 거부당합니다. 이것이 자바 입문 첫걸음 편에서 말한 정적 타입 언어의 성격입니다.
기본 자료형 8가지 한눈에 보기
자바가 언어 차원에서 준비해 둔 자료형은 정확히 8개이며, 이들을 기본형(primitive type)이라 부릅니다. 값 자체를 그대로 저장하는 유형입니다.
| 분류 | 자료형 | 크기 | 담는 값 |
|---|---|---|---|
| 정수 | byte | 1바이트 | -128 ~ 127 |
| short | 2바이트 | 약 -3만 ~ 3만 | |
| int | 4바이트 | 약 -21억 ~ 21억 (정수의 기본) | |
| long | 8바이트 | 21억을 넘는 큰 정수 | |
| 실수 | float | 4바이트 | 소수점 약 7자리 |
| double | 8바이트 | 소수점 약 15자리 (실수의 기본) | |
| 문자 | char | 2바이트 | 문자 한 개 |
| 논리 | boolean | 1비트 | true 또는 false |
실무에서는 정수는 int, 실수는 double을 기본으로 쓰고 필요할 때만 다른 것을 고릅니다. 단, long과 float에는 값 뒤에 표시를 붙여야 합니다.
long totalView = 3400000000L; // L을 빼면 int 범위를 넘어 오류
float ratio = 0.75f; // f를 빼면 double로 취급되어 오류
String은 기본형이 아닙니다
문자열을 담는 String은 8가지 목록에 없습니다. String은 참조형, 즉 값이 저장된 위치를 가리키는 유형입니다. 그래서 비교 방식이 달라집니다.
String a = new String("카드뉴스");
String b = new String("카드뉴스");
System.out.println(a == b); // false — 저장된 위치가 다름
System.out.println(a.equals(b)); // true — 글자 내용이 같음
입문자가 가장 많이 걸려 넘어지는 지점입니다. ==는 “같은 자리에 있는가”를 묻고, equals()는 “내용이 같은가”를 묻습니다. 문자열 비교는 예외 없이 equals()로 하십시오. 짧은 문자열을 그냥 큰따옴표로 대입하면 ==가 우연히 true를 내는 경우가 있어 더 헷갈리는데, 그건 자바가 같은 문자열을 재활용해서 생긴 우연일 뿐 규칙이 아닙니다. String이 제공하는 기능이 궁금하다면 String 메서드 정리를 참고하십시오.
형변환 — 자동으로 되는 경우와 손으로 밀어 넣는 경우
작은 그릇의 값을 큰 그릇에 옮기는 것은 안전하므로 자바가 알아서 해 줍니다. 이를 자동 형변환이라 합니다. 반대로 큰 그릇의 값을 작은 그릇에 넣을 때는 값이 잘려 나갈 수 있으므로 개발자가 책임진다는 표시를 직접 붙여야 합니다. 이것이 명시적 형변환입니다.
int count = 7;
double average = count; // 자동 — 7.0 이 됩니다
double score = 89.9;
int rounded = (int) score; // 명시적 — 89, 소수점이 버려집니다
System.out.println(rounded); // 89
(int)는 반올림이 아니라 소수점 아래를 그냥 잘라 버립니다. 89.9가 90이 될 것이라 기대했다면 결과를 보고 당황하게 됩니다. 반올림이 필요하면 Math 클래스의 반올림 기능을 쓰는 편이 맞습니다.
변하지 않는 값과 이름 짓기 규칙
한 번 정한 뒤 바뀌면 안 되는 값에는 final을 붙입니다. 이후 다시 대입하려 하면 컴파일러가 막아 줍니다.
final int MAX_TITLE_LENGTH = 40;
// MAX_TITLE_LENGTH = 50; ← 이 줄은 컴파일 오류가 납니다
이름 규칙도 정리해 두겠습니다. 숫자로 시작할 수 없고, class나 int 같은 예약어는 쓸 수 없으며, 공백과 하이픈도 들어갈 수 없습니다. 관습적으로 변수와 메서드는 readerName처럼 첫 글자를 소문자로 시작해 단어마다 대문자를 섞고, final 상수는 MAX_TITLE_LENGTH처럼 전부 대문자에 밑줄을 씁니다. 이 관습을 지키면 코드만 봐도 그것이 변수인지 상수인지 바로 구분됩니다.
값을 담는 법을 익혔으니 다음은 담긴 값을 계산하고 판단할 차례입니다. 자바 연산자와 제어문 편으로 이어집니다.
핵심 정리
- 기본형 8가지 — byte, short, int, long, float, double, char, boolean
- 기본 선택 — 정수는 int, 실수는 double, long에는 L, float에는 f를 붙입니다
- String은 참조형 — 내용 비교는
==가 아니라 반드시equals() - 형변환 — 작은 곳에서 큰 곳은 자동, 큰 곳에서 작은 곳은
(자료형)을 붙이고 값 손실을 감수합니다 - final — 재대입을 막는 상수 선언이며 이름은 대문자와 밑줄로 씁니다