자바 변수와 자료형 — 8가지 기본형부터 형변환까지 한 번에

프로그램은 결국 값을 어딘가에 담아 두었다가 꺼내 쓰는 일의 반복입니다. 그 그릇이 변수이고, 그릇의 규격이 자료형입니다. 이번 편에서는 자바가 정해 둔 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을 기본으로 쓰고 필요할 때만 다른 것을 고릅니다. 단, longfloat에는 값 뒤에 표시를 붙여야 합니다.

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;   ← 이 줄은 컴파일 오류가 납니다

이름 규칙도 정리해 두겠습니다. 숫자로 시작할 수 없고, classint 같은 예약어는 쓸 수 없으며, 공백과 하이픈도 들어갈 수 없습니다. 관습적으로 변수와 메서드는 readerName처럼 첫 글자를 소문자로 시작해 단어마다 대문자를 섞고, final 상수는 MAX_TITLE_LENGTH처럼 전부 대문자에 밑줄을 씁니다. 이 관습을 지키면 코드만 봐도 그것이 변수인지 상수인지 바로 구분됩니다.

값을 담는 법을 익혔으니 다음은 담긴 값을 계산하고 판단할 차례입니다. 자바 연산자와 제어문 편으로 이어집니다.

핵심 정리

  • 기본형 8가지 — byte, short, int, long, float, double, char, boolean
  • 기본 선택 — 정수는 int, 실수는 double, long에는 L, float에는 f를 붙입니다
  • String은 참조형 — 내용 비교는 ==가 아니라 반드시 equals()
  • 형변환 — 작은 곳에서 큰 곳은 자동, 큰 곳에서 작은 곳은 (자료형)을 붙이고 값 손실을 감수합니다
  • final — 재대입을 막는 상수 선언이며 이름은 대문자와 밑줄로 씁니다