프로그램은 결국 데이터를 저장하고 바꾸고 읽는 일을 반복한다. 로그인한 사용자 수, 상품 가격, 결제 여부, API 응답 메시지처럼 프로그램이 다루는 값은 계속 변한다.
Java에서는 이런 값을 변수(variable) 에 저장한다.
상품 재고 수량을 여러 곳에서 직접 숫자로 작성했다고 생각해보자.
System.out.println(35);
System.out.println(35);
System.out.println(35);
재고가 바뀌면 모든 숫자를 찾아 수정해야 한다.
변수를 사용하면 한 곳에서 값을 관리할 수 있다.
int stock = 35;
System.out.println(stock);
System.out.println(stock);
System.out.println(stock);
이제 재고가 바뀌면 stock 값만 수정하면 된다.
int stock;
stock = 35;
첫 번째 줄은 변수 선언이다.
int stock;
int 타입의 값을 저장할 수 있는 stock이라는 이름의 변수를 만든다.
두 번째 줄은 대입이다.
stock = 35;
프로그래밍의 =는 수학의 등호와 다르다.
오른쪽 값을 계산해서 왼쪽 변수에 저장한다.
변수에 처음 값을 넣는 것을 초기화(initialization) 라고 한다.
int stock = 35;
선언과 초기화를 한 줄에 작성하는 방식이 가장 흔하다.
지역 변수는 값을 읽기 전에 반드시 초기화해야 한다.
int price;
System.out.println(price);
이 코드는 컴파일되지 않는다.
Java 컴파일러가 초기화되지 않은 지역 변수 사용을 막기 때문이다.
변수의 값은 다시 대입할 수 있다.
int stock = 35;
System.out.println(stock);
stock = 18;
System.out.println(stock);
출력:
35
18
새 값을 대입하면 이전 값 대신 새로운 값이 저장된다.
int일반적인 정수를 저장한다.
int cartCount = 3;
longint 범위를 넘어가는 큰 정수를 다룰 때 사용한다.
long totalUsers = 10_000_000_000L;
큰 정수 리터럴에는 L을 붙이는 습관이 좋다.
double실수를 저장한다.
double conversionRate = 2.75;
일반적인 실수 계산에서는 double을 주로 사용한다.
단, 금액처럼 정확한 소수 계산이 중요한 경우 double만으로 처리하면 오차가 생길 수 있다. 실무의 금액 계산에는 정수 단위 또는 BigDecimal을 고려한다.
boolean참과 거짓을 표현한다.
boolean isLoggedIn = true;
boolean isSoldOut = false;
char하나의 UTF-16 코드 단위를 저장한다.
char grade = 'A';
char는 Java에서 16비트(2바이트) 다. 모든 유니코드 문자를 하나의 char로 표현할 수 있는 것은 아니다.
String문자열을 저장한다.
String username = "seungjun";
String은 int, boolean 같은 기본형이 아니라 참조형이다. 하지만 Java 개발에서 매우 자주 사용되기 때문에 기본 문법 단계부터 익혀두는 것이 좋다.
| 종류 | 대표 타입 | 예시 |
|---|---|---|
| 정수 | int, long | 100, 10_000L |
| 실수 | double | 3.14 |
| 논리 | boolean | true, false |
| 문자 | char | 'A' |
| 문자열 | String | "hello" |
Java에는 byte, short, float도 존재한다. 입문 단계에서는 우선 int, long, double, boolean, String을 중심으로 익히는 것이 효율적이다.
코드에 직접 적은 고정된 값을 리터럴(literal) 이라고 한다.
int count = 5;
double rate = 1.5;
boolean active = true;
String message = "success";
여기서 다음 값들이 리터럴이다.
5
1.5
true
"success"
정수 리터럴은 기본적으로 int, 실수 리터럴은 기본적으로 double로 해석된다.
_ 사용하기큰 숫자는 언더스코어를 넣어 읽기 쉽게 만들 수 있다.
long monthlyTraffic = 12_500_000L;
실제 값은 12500000과 같다.
변수 이름은 코드를 읽는 사람에게 의미를 전달해야 한다.
좋지 않은 예:
int a = 5;
int b = 30000;
더 나은 예:
int itemCount = 5;
int unitPrice = 30000;
Java에서는 일반적으로 lowerCamelCase를 사용한다.
userName
orderCount
maxRetryCount
클래스 이름은 보통 대문자로 시작한다.
OrderService
UserController
상수는 대문자와 _를 사용한다.
MAX_RETRY_COUNT
DEFAULT_TIMEOUT
다음은 사용할 수 없다.
int 1user; // 숫자로 시작
int class; // 예약어
int user count; // 공백 포함
_, $ 등 일부 문자를 식별자에 사용할 수 있지만, 일반 애플리케이션 코드에서 $를 변수 이름에 적극적으로 사용하는 것은 권장하지 않는다.
String은 기본형일까?아니다. String은 클래스이며 참조형이다.
char는 1바이트일까?아니다. Java의 char는 16비트다.
아니다. 지역 변수는 값을 읽기 전에 개발자가 직접 초기화해야 한다.
필드나 배열 요소는 Java가 기본값으로 초기화하지만 지역 변수와는 규칙이 다르다.
int orderCount;
orderCount = 3;
선언과 첫 대입을 나누어 작성할 수도 있고,
int orderCount = 3;
한 번에 작성할 수도 있다.
여러 변수를 한 줄에 선언하는 문법도 가능하다.
int minPrice = 1000, maxPrice = 50000;
하지만 변수가 많아지면 한 줄에 몰아넣기보다 역할별로 나누는 편이 읽기 쉽다.
Java의 정수 기본형은 크기가 명확하게 정해져 있다.
| 타입 | 크기 | 범위 |
|---|---|---|
byte | 8비트 | -128 ~ 127 |
short | 16비트 | -32,768 ~ 32,767 |
int | 32비트 | -2,147,483,648 ~ 2,147,483,647 |
long | 64비트 | 약 ±9.22×10¹⁸ |
char | 16비트 | 0 ~ 65,535의 UTF-16 코드 단위 |
실수형은 float가 32비트, double이 64비트 IEEE 754 부동소수점 형식을 사용한다.
메모리를 아끼겠다는 이유만으로 byte나 short를 일반 계산에 남발할 필요는 없다. Java의 일반적인 정수 계산에서는 int가 가장 자연스럽고, 그 범위를 넘으면 long을 고려한다.
100
이 정수 리터럴은 기본적으로 int다.
int 범위를 넘어가는 정수를 코드에 직접 작성하려면 L을 붙인다.
long dailyEvents = 5_000_000_000L;
소문자 l도 문법적으로 가능하지만 숫자 1과 헷갈릴 수 있어 대문자 L이 좋다.
실수 리터럴은 기본적으로 double이다.
double ratio = 0.75;
float 리터럴이 필요하면 F 또는 f를 붙인다.
float ratio = 0.75F;
int price = "30000";
문자열을 정수 변수에 바로 저장할 수 없으므로 컴파일 오류가 난다.
String price = "30000";
이 값은 숫자처럼 생겼지만 여전히 문자열이다. 계산하려면 변환 과정이 필요하다.
int numericPrice = Integer.parseInt(price);
타입은 단순한 표기가 아니라 이 변수에 어떤 종류의 값이 들어올 수 있는지 제한하는 장치다.
int retryCount = 1;
retryCount = 2;
두 번째 대입이 끝난 뒤 retryCount가 보관하는 값은 2다. 변수 입장에서는 이전 값 1을 더 이상 가지고 있지 않다.
이 단순한 원리가 나중에 메서드의 값 전달, 참조형, 객체 상태 변경을 이해하는 기반이 된다.
Java 프로젝트가 커지면 클래스들을 패키지로 묶어 관리한다.
package shop.order;
일반적으로 패키지는 모두 소문자로 작성한다.
이름 규칙을 한 번에 정리하면 다음과 같다.
변수 / 메서드: lowerCamelCase
클래스 / 인터페이스: UpperCamelCase
상수: UPPER_SNAKE_CASE
패키지: lowercase
문법적으로 허용되는 이름과 좋은 이름은 다르다. a, b, x가 문법적으로 가능해도 실제 역할을 표현할 수 있다면 orderCount, retryLimit, isActive처럼 의미를 드러내는 이름이 훨씬 좋다.
=는 오른쪽 값을 왼쪽 변수에 대입한다.int, 큰 정수는 long, 실수는 double을 주로 사용한다.String은 기본형이 아니라 참조형이다.char는 16비트이며 하나의 UTF-16 코드 단위를 표현한다.