[김영한의 자바] 자바 기본편 (2)

송범·2025년 3월 18일

자바 변수 시작

패키지(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처럼 표준 패키지를 제공합니다.

  1. 자바의 대표적인 표준 패키지
패키지명설명주요 클래스 예시
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.swingGUI (그래픽 사용자 인터페이스)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 변수 타입

  1. 기본 데이터 타입 (Primitive Type)
    자바에서 기본 데이터 타입(Primitive Type)은 메모리에 직접 값을 저장하는 타입입니다.
자료형크기기본값설명
byte1바이트0정수형 (-128 ~ 127)
short2바이트0정수형 (-32,768 ~ 32,767)
int4바이트0정수형 (-2³¹ ~ 2³¹-1)
long8바이트0L정수형 (-2⁶³ ~ 2⁶³-1)
float4바이트0.0f실수형 (소수점 이하 표현 가능)
double8바이트0.0d실수형 (더 정밀한 소수 표현 가능)
char2바이트'\u0000'문자형 (유니코드 기반)
boolean1바이트false논리형 (참/거짓)

기본 타입 사용 예시

int number = 10; //정수
double pi = 3.14; //실수
boolean isJavaFun = true; //불리언(boolean) true, false 입력 가능
char grade = 'A'; //문자 하나
  1. 참조 데이터 타입 (Reference Type)

자바에서 참조 타입(Reference Type)은 변수에 직접 값을 저장하는 것이 아니라, 객체의 메모리 주소(참조값)를 저장하는 타입입니다.


  1. 참조 타입의 종류
참조 타입설명
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, booleanString, Array, Class, Interface, Object
  • 기본 타입은 직접 값을 저장하고 스택(Stack) 메모리에서 관리되므로 속도가 빠름.
  • 참조 타입은 객체의 메모리 주소를 저장하며, 힙(Heap)에서 관리되므로 가비지 컬렉션(GC)이 필요.
  • 기본 타입은 == 비교가 가능하지만, 참조 타입은 .equals()를 사용하여 값을 비교해야 함.
  • 참조 타입의 기본값은 null이며, null 체크가 필수.
profile
BackEnd&Data Scientist가 되고 싶은 개발 기록 노트

0개의 댓글