[Java] Java 변수와 자료형 완전 정리: 리터럴, 상수, 형변환까지 한눈에 정리

Java는 정적 타입 언어입니다. 즉, 변수를 선언할 때 어떤 자료형(type)의 데이터를 담을 것인지 미리 명시해야 하며, 해당 타입 외의 값을 저장할 수 없습니다. 이번 글에서는 자바에서 변수를 어떻게 선언하고, 어떤 자료형을 사용하는지, 그리고 각 자료형의 특징과 사용 시 주의할 점까지 알아보겠습니다.


1. 변수란 무엇인가요?

변수란 데이터를 저장할 수 있는 이름 붙은 메모리 공간입니다. 우리가 프로그램에서 다루는 수, 문자, 문자열 등의 값을 임시로 저장하거나 계산하기 위해 변수는 필수입니다.

변수 선언의 기본 구조:

// 자료형 변수명 = 값;

int age = 30;
String name = "주인";

이렇게 작성하면 age는 정수형 데이터 30을, name은 문자열 "주인"을 저장하게 됩니다.

컴파일러에서 제한되는 변수 네이밍 규칙

  • 영어, 숫자, _, $만 사용 가능합니다.
  • 대소문자는 구분됩니다.
  • 숫자로 시작하면 안 됩니다.
  • 예약어는 변수명으로 사용할 수 없습니다. (예: classint)

권장하는 변수 네이밍 규칙

  • 변수의 첫 글자는 항상 소문자로 합니다.
  • 여러 단어로 이루어진 경우 카멜 표기법을 사용합니다. (예: userName)
  • 상수의 이름은 모두 대문자로 지어야 합니다. 이 경우 여러 단어로 이루어지면 _로 구분합니다.(예: MAX_VALUE)
  • 변수명은 의미 있게 지어야 합니다. 변수 이름은 가능한 구체적으로 지어서 변수의 의도를 분명히 드러나게 해야 합니다.

 

2. 자료형(데이터 타입)

기본 자료형 (Primitive Types)

자바에는 총 8개의 기본 자료형(Primitive types)이 있습니다. 이들은 메모리 상에 값 자체를 저장합니다.

자료형 크기 설명
byte 1B -128 ~ 127
short 2B -32,768 ~ 32,767
int 4B 정수 기본형 (-2,147,483,648 ~ 2,147,483,647)
long 8B 매우 큰 정수 (-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
float 4B 소수점, 단정도 실수
double 8B 소수점, 배정도 실수, float 보다 큰 소수점을 다룸 (일반적으로 double을 사용)
char 2B 유니코드 문자 1개
boolean 1B 참/거짓 (true/false)
💁🏻 1byte = 8bit 입니다. 정수형의 경우 가질 수 있는 값의 범위는 -2^(n-1) ~ 2^(n-1) - 1 (n은 bit 수)입니다.
int 형의 경우 4byte(32bit)이기 때문에 -2^31 ~ 2^31 - 1 범위를 갖습니다. 때문에 값을 연산하다가 범위를 넘어서게 되면 잘못된 값을 얻을 수 있습니다. 이럴 땐 long 타입으로 변수를 선언하는 것이 좋습니다.

 

참조 자료형(Reference Types)

기본 자료형 외에 자바에는 참조형(Reference Type)이라는 것도 있습니다. 이는 객체(Object)를 가리키는 자료형입니다. 참조형 변수는 실제 데이터를 메모리의 어떤 위치(주소)에 저장하고 있는지를 저장합니다. 대표적인 참조형 타입은 클래스, Array, String, 사용자 정의 클래스 등이 있습니다.

User user = new User();            // 객체는 참조형 타입
int[] numbers = {1, 2, 3}            // 배열은 참조형 타입
String greeting = "Hello Java!";  // String은 클래스 기반 참조형 타입

여기서 greeting은 문자열 "Hello Java!"라는 객체를 참조하고 있는 변수입니다.

💡 String은 기본 자료형처럼 보이지만 실제로는 객체입니다.

 

3. 리터럴과 상수

int age = 25;
boolean isAdult = true;
final double PI = 3.141592;

여기서 25, true, 3.141592 같은 값은 리터럴(literal)이라고 부르고,

PI처럼 값이 변하지 않도록 앞에 final 키워드로 선언된 변수는 상수(constant)라고 합니다.

 

리터럴(Literal)이란?

리터럴이란 코드 내에서 직접 사용하는 값 그 자체를 말합니다. 즉 변수에 저장되기 전의 순수한 데이터 표현이라고 볼 수 있습니다.

타입 예시 설명
정수 리터럴 10, -42, 0, 100L 접미사 생략시 기본적으로 int로 처리됨,
접미사 L, l을 붙이면 long 타입 리터럴로 처리됩니다.
실수 리터럴 3.14, -0.001, 3.14f 접미사 생략시 기본적으로 double로 처리됨,
접미사 f를 붙이면 float 형 리터럴로 처리됩니다.
접미사 d를 붙이면 double 형 리터럴로 처리됩니다.
문자 리터럴 'A', '1', '가' 단일 문자, char로 처리됨
문자열 리터럴 "Hello", "Java" 여러 문자, String 객체로 처리됨
불리언 리터럴 true, false 참/거짓
null 리터럴 null 객체가 아무 것도 참조하지 않음을 의미
❌ float f = 3.14; → 오류!
❌ double d = 3.14f; → 오류!
✔ float f = 3.14f; 또는 float f = (float) 3.14;
✔ double d = 3.14f;

❌ char c = "A"; → 오류! (문자열 아님)
✔ char c = 'A';

❌ String name = 'John'; → 오류! (문자 아님)
✔ String name = "John";
💡 String은 참조형이지만, 리터럴 "Hello"는 JVM 상의 String 상수 풀에 저장됩니다.
💡 리터럴 타입은 데이터 타입과 일치시켜도 되지만, 저장 범위가 넓은 데이터 타입에 좁은 리터럴 타입을 저장하는 것은 Java에서 허용됩니다.

 

 

상수형(Constant)이란?

상수는 한 번 값이 정해지면 변경할 수 없는 변수입니다. 자바에서는 상수를 만들기 위해 final 키워드를 사용합니다.

// final 자료형 변수명 = 값;

final int MAX_USERS = 1000;
final double PI = 3.141592;

 이렇게 선언하면 MAX_USERS나 PI 값을 다시 대입하거나 변경할 수 없습니다. 변경을 시도하면 컴파일 오류가 발생합니다.

💡 상수는 보통 모두 대문자 + 언더스코어로 표기하는 것이 자바 개발자들의 관례입니다.

 

4. 형변환(Type Casting)이란?

형변환이란 값의 자료형을 다른 자료형으로 바꾸는 과정을 말합니다. 자바에서는 두 가지 방식의 형변환이 존재합니다.

  • 자동 형변환: 작은 타입 → 큰 타입으로 변환
  • 강제 형변환: 큰 타입 → 작은 타입으로 변환 (데이터 손실 위험)

 

자동 형변환 (Widening Conversion)

자바는 더 작은 범위의 타입에서 더 큰 범위의 타입으로 변환할 때, 자동으로 형변환을 수행합니다.

byte → short → int → long → float → double
int num = 100;
long bigNum = num;       // OK: int → long
float ratio = bigNum;    // OK: long → float
⚠️ char는 int보다 작지만 부호가 없는 타입이기 때문에 byte → char는 자동 변환이 불가능합니다.

 

강제 형변환 (Narrowing Conversion)

더 큰 타입에서 더 작은 타입으로 변환할 때는 명시적으로 캐스팅(casting)을 해야 합니다. 이 과정에서 데이터가 잘리거나(overflow)정밀도가 손실될 수 있으므로 주의가 필요합니다. 강제 형변환은 언제나 위험 요소가 있기 때문에, 변환 전후의 값 범위를 확인해야 합니다.

double pi = 3.14;
int intPi = (int) pi;   // 결과: 3 (소수점 이하 삭제)

long big = 10000000000L;
int small = (int) big;  // 잘린 값 (overflow 가능)

 

문자와 숫자 간 형변환

char c = 'A';
int ascii = c;           // char → int (자동 변환)
System.out.println(ascii);  // 65

int code = 66;
char ch = (char) code;   // int → char (강제 변환)
System.out.println(ch);     // B

 

숫자와 문자열 간 형변환

자바에서는 숫자 ↔ 문자열 간 변환은 자동으로 되지 않으며, 명시적인 메서드 호출이 필요합니다.

// 숫자 → 문자열
int age = 25;
String text = String.valueOf(age);  // "25"
String text = age + "";                  // 암묵적 변환 (권장 X)

// 문자열 → 숫자
String input = "30";
int num = Integer.parseInt(input);          // "30" → 30
double d = Double.parseDouble("3.14"); // "3.14" → 3.14