Java를 처음 시작하면 문법보다 먼저 헷갈리는 것이 JDK가 무엇인지, int와 String은 왜 다른지, 값을 변수에 어떻게 담는지 같은 기본 개념이다.
이 글에서는 Java 코드를 실행하기 위한 최소 환경부터 자료형, 변수, 상수, 주석, 형 변환까지 한 번에 정리한다. 이후 조건문, 반복문, 객체지향을 공부하기 위한 가장 앞단의 내용이라고 보면 된다.
Java 개발을 위해서는 JDK(Java Development Kit) 가 필요하다. JDK에는 Java 소스 코드를 바이트코드로 컴파일하는 javac, 프로그램을 실행하는 java 같은 개발 도구가 포함되어 있다.
2026년 기준 최신 Java SE 릴리스는 더 새 버전까지 나와 있지만, 입문 학습에서는 JDK 25 LTS처럼 장기 지원 버전을 선택하면 버전 변화에 덜 흔들리며 공부하기 좋다.
개발 도구는 IntelliJ IDEA, VS Code 등 무엇을 사용해도 괜찮다. 중요한 것은 IDE 자체보다 다음 흐름을 이해하는 것이다.
Hello.java
↓ javac
Hello.class
↓ JVM에서 실행
프로그램 결과
가장 기본적인 Java 프로그램은 다음과 같다.
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
main은 프로그램이 시작되는 진입점이고, System.out.println()은 값을 콘솔에 출력한다.
Java 25에는 더 간결한 소스 파일 형태도 추가되었지만, 클래스와
public static void main(String[] args)구조를 먼저 익혀두면 기존 Java 코드와 프레임워크를 이해하기 쉽다.
프로그램은 숫자, 문자, 참/거짓 등 서로 다른 종류의 데이터를 다룬다. Java는 변수를 만들 때 어떤 종류의 값을 저장할지 자료형을 명확하게 지정하는 정적 타입 언어다.
int retryCount = 3;
double responseTime = 1.25;
boolean success = true;
char grade = 'A';
String endpoint = "/api/users";
Java의 대표적인 기본 자료형은 다음과 같다.
| 자료형 | 용도 | 예시 |
|---|---|---|
int | 일반적인 정수 | 100 |
long | 더 큰 정수 | 3_000_000_000L |
float | 실수 | 3.14F |
double | 더 정밀한 실수 | 3.141592 |
boolean | 참/거짓 | true, false |
char | UTF-16 코드 단위 하나 | 'A' |
int는 32비트, long은 64비트 정수이고, float와 double은 부동소수점 수를 표현한다. 일반적인 실수 계산에는 double을 더 자주 사용한다.
초보 단계에서 자주 보는 설명 중 boolean을 무조건 1바이트라고 외우는 경우가 있는데, Java 언어 명세는 boolean의 저장 크기를 고정된 바이트 수로 정의하지 않는다. true와 false 두 값만 가진다고 이해하는 것이 정확하다.
또한 char는 2바이트이지만 모든 유니코드 문자를 하나의 char로 표현할 수 있는 것은 아니다. 이모지처럼 보조 문자가 필요한 경우에는 두 개의 char가 사용될 수 있다.
String, 배열, 클래스의 객체 등은 참조 자료형이다.
String serviceName = "order-api";
int[] statusCodes = {200, 201, 404};
User user = new User();
초보 설명에서는 참조 변수가 "메모리 주소를 저장한다"고 단순화하기도 한다. 더 정확하게는 객체를 가리키는 참조값을 가진다고 이해하면 된다. 그 참조값이 실제 물리 메모리 주소와 동일하다고 가정할 필요는 없다.
변수는 값을 저장하고 다시 사용하기 위한 이름 있는 공간이다.
int requestCount = 10;
구조를 나누면 다음과 같다.
int requestCount = 10;
자료형 변수명 값
선언과 대입을 나누는 것도 가능하다.
int requestCount;
requestCount = 10;
하지만 값이 준비되어 있다면 선언과 동시에 초기화하는 편이 읽기 쉽다.
String environment = "production";
boolean cacheEnabled = true;
변수명에는 문자, 숫자, _, $ 등을 사용할 수 있지만 숫자로 시작할 수 없고 Java 예약어도 사용할 수 없다.
int userCount = 10; // 좋음
int activeUserCount = 8; // 의미가 구체적
Java에서는 일반적으로 변수와 메소드 이름에 lowerCamelCase를 사용한다.
String apiBaseUrl = "https://example.com";
int maxRetryCount = 3;
아래처럼 의미를 알기 어려운 이름은 피하는 편이 좋다.
int a = 3;
int x1 = 5;
코드는 작성하는 시간보다 다시 읽는 시간이 길다. 변수명만 보고도 값의 역할을 추측할 수 있게 만드는 것이 중요하다.
한 줄 주석은 //, 여러 줄 주석은 /* ... */을 사용한다.
int timeoutSeconds = 30; // 외부 API 요청 제한 시간
/*
개발 환경에서는 테스트 서버를 사용한다.
운영 환경에서는 실제 API 주소를 사용한다.
*/
다만 다음처럼 코드가 이미 설명하는 내용을 주석으로 반복할 필요는 없다.
int userCount = 10; // userCount에 10을 넣는다
좋은 주석은 무엇을 하는지보다 왜 이렇게 했는지 설명한다.
final한 번 값이 정해진 뒤 다시 대입하지 못하게 하려면 final을 사용한다.
final int MAX_RETRY_COUNT = 3;
MAX_RETRY_COUNT = 5; // 컴파일 오류
상수처럼 사용할 때는 UPPER_SNAKE_CASE를 많이 사용한다.
주의할 점은 final 변수가 반드시 선언과 동시에 초기화되어야 하는 것은 아니라는 것이다. 인스턴스의 final 필드는 생성자에서 한 번 초기화할 수도 있다.
class ApiClient {
private final String baseUrl;
ApiClient(String baseUrl) {
this.baseUrl = baseUrl;
}
}
표현 범위가 더 넓은 타입으로 옮길 때는 Java가 자동으로 변환할 수 있다.
int requestCount = 120;
long totalRequestCount = requestCount;
double average = totalRequestCount;
단, int -> float -> double처럼 변환 자체는 가능해도 부동소수점 표현 특성 때문에 매우 큰 정수에서는 정밀도 손실이 생길 수 있다. "큰 자료형이므로 언제나 값이 완벽하게 보존된다"고 생각하면 안 된다.
반대로 더 좁은 타입으로 바꾸려면 직접 캐스팅해야 한다.
double latency = 42.9;
int roundedDownLatency = (int) latency;
System.out.println(roundedDownLatency); // 42
실수에서 정수로 변환하면 소수점 아래가 버려진다.
실무에서 API 파라미터나 입력값을 다루다 보면 문자열과 숫자 사이의 변환이 자주 필요하다.
String pageText = "12";
int page = Integer.parseInt(pageText);
int statusCode = 200;
String statusText = String.valueOf(statusCode);
잘못된 숫자 문자열을 변환하면 예외가 발생한다.
Integer.parseInt("12px"); // NumberFormatException
따라서 사용자 입력이나 외부 데이터는 이후에 배울 예외 처리와 함께 사용하는 경우가 많다.
String은 기본 자료형이 아니라 참조 자료형이다. 문자열 리터럴에는 큰따옴표("), char에는 작은따옴표(')를 사용한다.
String language = "Java";
char firstLetter = 'J';
또한 double을 int로 바꿀 때 반올림되는 것이 아니라 소수 부분이 잘린다.
System.out.println((int) 9.99); // 9
int, long, float, double, boolean, char는 기본 자료형이다.String, 배열, 객체는 참조 자료형이다.lowerCamelCase 이름을 사용하는 것이 좋다.final을 사용한다.Integer.parseInt(), String.valueOf() 등을 활용한다.