VB.NET이나 VBA만 쓰다가 자바 코드를 볼 일이 생기면 제일 먼저 헷갈리는 게 타입 이름입니다. Integer가 아니라 int, String은 같지만 기본형이 아니라 클래스, Boolean이 아니라 소문자 boolean. 이런 차이를 한 번 정리해 두면 남의 자바 소스를 읽을 때 훨씬 편합니다.
변수는 값 하나를 담아 두는 이름 붙은 공간입니다. 자바에서는 타입을 먼저 쓰고 이름을 뒤에 씁니다. VB의 Dim 이름 As 타입과 순서가 반대예요.
변수타입 변수이름;
char name; // 문자형 변수 name을 선언한다.
int num = 6 ; // 선언후 변수의 값을 6으로 초기화 한다.
이름 지을 때 걸리는 규칙
자바는 대소문자를 구분합니다. num과 Num은 서로 다른 변수이고, 메서드나 클래스 이름도 마찬가지입니다. VB는 대소문자를 가리지 않고 편집기가 알아서 맞춰 주기 때문에, VB에 익숙한 사람이 자바에서 가장 자주 내는 컴파일 오류가 바로 이것입니다.
그 밖에 이름은 숫자로 시작할 수 없고, int, class, new 같은 예약어는 쓸 수 없습니다. 특수문자는 밑줄(_)과 달러 기호($) 두 가지만 허용됩니다. 한글 변수명도 문법상으로는 가능하지만 팀 작업이나 인코딩 문제를 생각하면 쓰지 않는 게 보통입니다.
기본형과 참조형
자바의 타입은 크게 두 갈래입니다. 값 자체를 담는 기본형(primitive type)은 boolean, char, byte, short, int, long, float, double 여덟 개뿐이고, 이를 제외한 나머지(String, 배열, 직접 만든 클래스 등)는 전부 참조형(reference type)입니다. 참조형 변수에는 객체가 있는 위치가 들어갑니다.
종류별로 묶으면 다음과 같습니다.
| 분류 | 1 byte | 2 byte | 4 byte | 8 byte |
|---|---|---|---|---|
| 논리형 | boolean | |||
| 문자형 | char (유니코드) | |||
| 정수형 | byte | short | int (기본 자료형) | long |
| 실수형 | float | double (기본 자료형) |
"기본 자료형"이라고 적은 건 별다른 표시 없이 숫자를 쓰면 정수는 int, 실수는 double로 취급된다는 뜻입니다. 그래서 long 리터럴에는 L, float 리터럴에는 f를 붙여야 합니다. float f = 3.14;라고 쓰면 double을 float에 넣으려 한다는 컴파일 오류가 납니다.
타입별 범위와 기본값
| 데이터 타입 | 범위 | 기본값 | 크기 |
|---|---|---|---|
| boolean | true, false | false | 1 byte |
| byte | -128 ~ 127 | 0 | 1 byte |
| char | \u0000 ~ (0 ~ 65,535) |
'\u0000' | 2 byte |
| short | -32,768 ~ 32,767 | 0 | 2 byte |
| int | -2,147,483,648 ~ 2,147,483,647 | 0 | 4 byte |
| long | -9223372036854775808 ~ 9223372036854775807 | 0L | 8 byte |
| float | 1.4E-45 ~ 3.4028235E38 | 0.0f | 4 byte |
| double | 4.9E-324 ~ 1.7976931348623157E308 | 0.0 또는 0.0d | 8 byte |
몇 가지 덧붙이면, boolean의 실제 메모리 크기는 자바 명세에 못 박혀 있지 않아서 JVM 구현에 따라 다를 수 있습니다. 표의 1 byte는 흔히 쓰는 기준값 정도로 보면 됩니다. 그리고 기본값은 클래스의 필드(멤버 변수)에만 자동으로 들어갑니다. 메서드 안에서 선언한 지역 변수는 초기화하지 않고 쓰면 컴파일 오류가 나요. VB처럼 "선언만 해도 0이 들어가 있겠지" 하고 쓰다가 자주 막히는 지점입니다.
VB.NET에서 넘어올 때 주의할 차이
가장 조심할 건 byte입니다. VB.NET의 Byte는 0~255인데, 자바의 byte는 부호가 있어서 -128~127입니다. 파일이나 소켓에서 읽은 바이트 값을 정수로 쓸 때 128 이상이 음수로 나오는 이유가 이것이고, 이럴 때는 b & 0xFF로 바꿔서 씁니다. 반대로 char는 VB.NET의 Char와 같은 2바이트 유니코드라서 그대로 생각하면 됩니다. int는 VB.NET의 Integer, long은 Long, short는 Short와 크기가 같습니다.
정수 범위를 넘는 계산도 주의해야 합니다. 자바는 int 최댓값을 넘으면 예외 없이 음수로 넘어가 버립니다(VB.NET은 기본 설정에서 OverflowException을 냅니다). 금액 합계나 밀리초 단위 시간처럼 커질 수 있는 값은 처음부터 long으로 잡아 두는 게 안전합니다.