자바 변수 시작
패키지(package) : 패키지는 관련된 클래스와 인터페이스를 그룹화하는 기능을 합니다. 쉽게 말해, 폴더(디렉토리)처럼 클래스들을 체계적으로 관리하는 방법입니다.
variable이라는 패키지를 만들었다면, 해당 패키지에 들어가는 자바 파일 첫줄에 package variable;와 같이 소속된 패키지를 선언해주어야 합니다.
자바 파일이 위치하는 패키지와 package variable 선언 위치가 같아야 합니다.
1 . 패키지의 역할
(1) 클래스 간의 충돌 방지 : 동일한 이름의 클래스를 서로 다른 패키지에 만들 수 있습니다.
예) com.example.User와 org.company.User는 서로 다른 패키지에서 존재 가능합니다.
(2) 코드의 가독성과 유지보수성 향상 : 관련된 기능을 가진 클래스들을 한 패키지에 묶어 관리할 수 있습니다.
예) java.util 패키지는 유틸리티 관련 클래스들을 모아둡니다.
(3) 접근 제어(Access Control) : public, protected, default, private 등의 접근 제한자를 통해 클래스의 접근 범위를 관리할 수 있습니다.
(4) 클래스 및 인터페이스 효율적인 관리 : 대규모 프로젝트에서 코드 관리가 용이합니다. javax.servlet, java.sql처럼 표준 패키지를 제공합니다.
| 패키지명 | 설명 | 주요 클래스 예시 |
|---|---|---|
java.lang | 기본 클래스 (자동 임포트) | String, Math, System, Object, Thread |
java.util | 유틸리티 및 컬렉션 프레임워크 | ArrayList, HashMap, Collections, Date, Random |
java.io | 입출력 스트림 | File, BufferedReader, BufferedWriter, InputStream, OutputStream |
java.nio | 새로운 입출력 (NIO) | ByteBuffer, FileChannel, Path, Files |
java.net | 네트워크 프로그래밍 | Socket, ServerSocket, URL, HttpURLConnection |
java.sql | 데이터베이스 연동 (JDBC) | Connection, Statement, PreparedStatement, ResultSet |
javax.servlet | 웹 애플리케이션 개발 | HttpServlet, ServletRequest, ServletResponse, RequestDispatcher |
javax.swing | GUI (그래픽 사용자 인터페이스) | JFrame, JButton, JLabel, JPanel |
java.time | 날짜 및 시간 API (Java 8 이후) | LocalDate, LocalTime, LocalDateTime, DateTimeFormatter |
java.security | 보안 및 암호화 | MessageDigest, SecureRandom, KeyPair, Signature |
package variable; //패키지 선언
public class Var1 {
public static void main(String[] args) {
System.out.println(10);
System.out.println(10);
System.out.println(10);
}
}
실행 결과
10
10
10
단순히 숫자 10을 3번 출력하는 코드이다. 그런데 여기서 숫자 10을 3번 출력하는 대신에 숫자 20을 3번 출력하도록 코드를 변경해보면?
package variable;
public class Var1 {
public static void main(String[] args) {
System.out.println(20); //변경 10 -> 20
System.out.println(20); //변경 10 -> 20
System.out.println(20); //변경 10 -> 20
}
}
숫자가 10이라고 적혀 있는 곳을 모두 찾아서 숫자 20으로 변경해야 한다. 만약 여기서 숫자 10을 출력하는 부분이 100개라면 100개의 코드를 모두 변경해야 한다!!
그래서 모든 프로그래밍 언어는 이런 문제를 해결하기 위해 변수(variable)라는 기능을 제공한다. 변수는 이름 그대로 변할 수 있다는 뜻이다.
변수(variable)란? 데이터를 저장하는 메모리 공간을 의미합니다.
자바에서는 변수를 선언할 때 자료형(Data Type)을 명시해야 하며, 변수는 특정한 값(데이터)을 저장하고 관리하는 역할을 합니다.
package variable;
public class Var2 {
public static void main(String[] args) {
int a; // 변수 선언
a = 10; //변수 초기화
System.out.println(a);
System.out.println(a);
System.out.println(a);
}
}

a = 10 실행 결과
10
10
10


이번에는 a = 20 으로 변경해서 실행해보자
package variable;
public class Var2 {
public static void main(String[] args) {
int a; // 변수 선언
a = 20; //10 -> 20으로 변경
System.out.println(a);
System.out.println(a);
System.out.println(a);
}
}
a = 20 실행 결과
20
20
20
이처럼 변수(variable) a의 값을 변경하면 출력결과가 모두 함께 변경되는 것을 확인할 수 있다.
변수를 선언하고, 선언한 변수에 처음으로 값을 저장하는 것을 변수 초기화라 합니다.
package variable;
public class Var5 {
public static void main(String[] args) {
// 1. 변수 선언, 초기화 각각 따로
int a;
a = 1;
System.out.println("a = " + a);
int b = 2; // 2. 변수 선언과 초기화를 한번에
System.out.println("b = " + b);
int c = 3 , d = 4; // 3. 여러 변수 선언과 초기화를 한번에
System.out.println("c = " + c);
System.out.println("d = " + d);
}
}
변수는 초기화 해야 합니다.
package variable;
public class Var6 {
public static void main(String[] args) {
int a;
System.out.println(a); //주석을 풀면 컴파일 에러 발생
}
}
다음과 같은 컴파일 에러가 발생합니다.
java: variable a might not have been initialized
변수가 초기화되지 않았다는 오류가 발생합니다.
왜 이런 오류가 발생할까? 컴퓨터에서 메모리는 여러 시스템이 함께 사용하는 공간이다. 그래서 어떠한 값들이 계속 저장됩니다. 변수를 선언하면 메모리상의 어떤 공간을 차지하고 사용합니다. 그런데 그 공간에 기존에 어떤 값이 있었는지는 아무도 모른다. 따라서 초기화 하지 않으면 이상한 값이 출력될 수 있습니다. 이런 문제를 예방하기 위해 자바는 변수를 초기화 하도록 강제합니다.
지역 변수(Local variable)
메서드 내부에서 선언되며, 해당 블록에서만 사용 가능합니다.
반드시 초기화 후 사용해야 합니다.
public class Main {
public static void main(String[] args) {
int number = 10; // 지역 변수
System.out.println("지역 변수: " + number);
}
}
Java 변수 타입
| 자료형 | 크기 | 기본값 | 설명 |
|---|---|---|---|
byte | 1바이트 | 0 | 정수형 (-128 ~ 127) |
short | 2바이트 | 0 | 정수형 (-32,768 ~ 32,767) |
int | 4바이트 | 0 | 정수형 (-2³¹ ~ 2³¹-1) |
long | 8바이트 | 0L | 정수형 (-2⁶³ ~ 2⁶³-1) |
float | 4바이트 | 0.0f | 실수형 (소수점 이하 표현 가능) |
double | 8바이트 | 0.0d | 실수형 (더 정밀한 소수 표현 가능) |
char | 2바이트 | '\u0000' | 문자형 (유니코드 기반) |
boolean | 1바이트 | false | 논리형 (참/거짓) |

기본 타입 사용 예시
int number = 10; //정수
double pi = 3.14; //실수
boolean isJavaFun = true; //불리언(boolean) true, false 입력 가능
char grade = 'A'; //문자 하나
자바에서 참조 타입(Reference Type)은 변수에 직접 값을 저장하는 것이 아니라, 객체의 메모리 주소(참조값)를 저장하는 타입입니다.
| 참조 타입 | 설명 |
|---|---|
String | 문자열을 저장하는 객체 |
Array | 같은 타입의 여러 값을 저장하는 배열 |
Class | 사용자 정의 클래스를 저장하는 타입 |
Interface | 인터페이스를 구현하는 객체를 저장 |
Object | 모든 클래스의 최상위 타입 |
참조 타입 사용 예시
String name = "Alice"; // 문자열 리터럴
String greeting = new String("Hello"); // 명시적 객체 생성
리터럴
코드에서 개발자가 직접 적은 100,10.5,true,'A',"Hello Java"와 같은 고정된 값을 프로그래밍 용어로 리터럴(literal)이라 합니다.
int a = 100; //정수 리터럴
double b = 10.5; //실수 리터럴
boolean c = true; //불리언 리터럴
char d = 'A'; //문자 하나 리터럴
String e = "Hello Java"; //문자열 리터럴
변수의 값은 변할 수 있지만 리터럴은 개발자가 직접 입력한 고정된 값이다. 따라서 리터럴 자체는 변하지 않습니다.
자바(Java)에서는 변수는 크게 기본 타입(Primitive Type)과 참조 타입(Reference Type)으로 나뉩니다.
| 비교 항목 | 기본 타입 (Primitive Type) | 참조 타입 (Reference Type) |
|---|---|---|
| 저장 방식 | 변수에 직접 값 저장 | 객체의 메모리 주소 저장 |
| 기본값 | 0, false, '\u0000' 등 | null |
| 메모리 영역 | 스택(Stack)에 저장 | 힙(Heap)에 저장 (주소만 스택에 저장) |
| 속도 | 상대적으로 빠름 | 상대적으로 느림 (객체 생성 필요) |
| 사용 예제 | int num = 10; | String str = "Hello"; |
| 비교 연산 | == 연산자로 값 비교 | == 연산자는 주소 비교, .equals()로 값 비교 |
| 메모리 관리 | JVM이 자동 관리 | 가비지 컬렉터(GC)가 객체 삭제 |
| 유형 | byte, short, int, long, float, double, char, boolean | String, Array, Class, Interface, Object |