Java 변수와 자료형 이해하기: 선언, 초기화, 타입, 리터럴

Alchemist·2026년 10월 7일

KT AIVLE

목록 보기
60/130

프로그램은 결국 데이터를 저장하고 바꾸고 읽는 일을 반복한다. 로그인한 사용자 수, 상품 가격, 결제 여부, 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

새 값을 대입하면 이전 값 대신 새로운 값이 저장된다.

Java에서 자주 사용하는 타입

int

일반적인 정수를 저장한다.

int cartCount = 3;

long

int 범위를 넘어가는 큰 정수를 다룰 때 사용한다.

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, long100, 10_000L
실수double3.14
논리booleantrue, 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의 정수 기본형은 크기가 명확하게 정해져 있다.

타입크기범위
byte8비트-128 ~ 127
short16비트-32,768 ~ 32,767
int32비트-2,147,483,648 ~ 2,147,483,647
long64비트약 ±9.22×10¹⁸
char16비트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은 기본형이 아니라 참조형이다.
  • Java의 char는 16비트이며 하나의 UTF-16 코드 단위를 표현한다.
  • 변수 이름은 lowerCamelCase로 의미 있게 작성하는 것이 좋다.
profile
html_programming_language

0개의 댓글