본문 바로가기
JAVA

원시 타입 변수란? [코딩백과 with Java]

by GangDev 2024. 12. 20.

원시 타입 변수란

자바에서 프로그램을 작성할 때는 다양한 종류의 데이터를 다루게 됩니다. 이러한 데이터를 저장하고 사용하기 위해 변수를 선언해야 합니다. 자바에서는 두 가지 주요한 변수 유형이 있습니다: 원시 타입(primitive type)과 참조 타입(reference type). 이 섹션에서는 원시 타입 변수를 생성하는 방법에 대해 자세히 설명합니다.

기본 자료형(원시 타입)

  1. byte

    • 정수형 타입으로 -128부터 127까지의 값을 저장할 수 있습니다.
    • 메모리 사용량: 1바이트 (8 비트)
    • 주로 대용량 배열에서 메모리를 절약할 때 사용되거나, 변수의 범위를 명확히 하기 위해 사용됩니다.
    • 예시: byte myByte = 100;
  2. short

    • 정수형 타입으로 -32,768부터 32,767까지의 값을 저장할 수 있습니다.
    • 메모리 사용량: 2 바이트 (16 비트)
    • 대용량 배열에서의 메모리 절약이나 변수의 범위 제한을 위해 사용됩니다.
    • 예시: short myShort = 32000;
  3. int

    • 정수형 타입으로 -2,147,483,648부터 2,147,483,647까지의 값을 저장할 수 있습니다.
    • 메모리 사용량: 4 바이트(32비트)
    • Java SE 8 이상에서는 unsigned 32비트 정수로도 사용 가능합니다(0부터 4,294,967,295까지).
    • 예시: int myInt = 2147483647;
    • Unsigned int 사용 예: Integer.compareUnsigned(int1, int2);
  4. long

    • 정수형 타입으로 -9,223,372,036,854,775,808부터 9,223,372,036,854,775,807까지의 값을 저장할 수 있습니다.
    • 메모리 사용량: 8 바이트(64비트)
    • Java SE 8 이상에서는 unsigned 64비트 정수로도 사용 가능합니다 (0부터 18,446,744,073,709,551,615까지).
    • 예시: long myLong = 9223372036854775807L;
    • Unsigned long 사용 예: Long.compareUnsigned(long1, long2);
  5. float

    • 부동소수점 숫자를 표현합니다.
    • 메모리 사용량: 4 바이트 (32 비트)
    • 정확한 계산이 필요한 경우에는 적합하지 않습니다 (예: 통화 계산).
    • 대용량 배열에서의 메모리 절약을 위해 double 대신 사용할 수 있습니다.
    • 예시: float myFloat = 3.14159f;
  6. double

    • 더 큰 범위의 부동소수점 숫자를 표현합니다.
    • 메모리 사용량: 8 바이트 (64비트)
    • 소수점 연산의 기본 선택입니다.
    • 정확한 계산이 필요한 경우에는 적합하지 않습니다(예: 통화 계산).
    • 예시: double myDouble = 3.14159265358979323846;
  7. boolean

    • true 또는 false 두 가지 값만을 가질 수 있는 논리형 타입입니다.
    • 메모리 사용량: 일반적으로 1 바이트(8비트)로 구현되지만, 정확한 크기는 명확히 정의되어 있지 않습니다.
    • 단순한 true/false 조건을 추적하는 플래그에 사용됩니다.
    • 예시: boolean isTrue = true;
  8. char

    • 단일 문자를 저장할 수 있는 문자형 타입입니다.
    • 유니코드 문자를 저장하며, 0부터 65,535까지의 값을 가질 수 있습니다.
    • 메모리 사용량: 2 바이트(16비트)
    • 예시: char myChar = 'A';

주요 특징

  1. 모든 변수는 사용 전에 선언되어야 합니다.
  2. 각 원시 타입은 고정된 메모리 크기를 가지고 있습니다.
  3. null 값이 될 수 없습니다.
  4. 자동으로 박싱(autoboxing)과 언박싱(unboxing)을 지원합니다.
  5. String 클래스는 원시 타입은 아니지만 특별한 언어 지원을 받습니다.

사용 시 주의사항

  1. 정수형 타입에서 오버플로우에 주의해야 합니다.
  2. 부동소수점 타입(float, double)은 정확한 계산이 필요한 경우에는 적합하지 않을 수 있습니다.
  3. boolean은 true 또는 false만 가질 수 있으므로 다른 값으로 초기화할 수 없습니다.
  4. unsigned int와 long을 사용할 때는 Integer와 Long 클래스의 특별한 메서드를 사용해야 합니다.
  5. 정확한 통화 계산에는 BigDecimal 클래스를 사용하는 것이 좋습니다.

변수 초기화와 기본값

자바에서 변수를 선언할 때 항상 값을 할당해야 하는 것은 아닙니다. 필드(field)는 선언 시 초기화를 생략할 수 있으며, 컴파일러가 적절한 기본값을 자동으로 설정합니다. 하지만 이러한 방식은 일반적으로 나쁜 프로그래밍 스타일로 간주됩니다.

필드의 기본값

다음 표는 각 데이터 타입의 기본값을 요약합니다:

데이터 타입 필드의 기본값
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char \u0000
String(또는 모든 객체) null
boolean false

로컬 변수의 특징

로컬 변수(local variable)는 필드와 다르게 동작합니다:

  1. 컴파일러가 자동으로 기본값을 할당하지 않습니다.
  2. 선언 시 초기화를 생략할 수 있지만, 사용하기 전에 반드시 값을 할당해야 합니다.
  3. 미초기화된 로컬 변수에 접근하려고 하면 컴파일 오류가 발생합니다.

예시:

public class LocalVariableExample {
    public static void main(String[] args) {
        // 메서드 호출
        printValues();
    }

    public static void printValues() {
        // 로컬 변수 선언
        int localInt;
        boolean localBool;
        String localStr;

        // 미초기화된 로컬 변수 사용 시 컴파일 오류
        // System.out.println("localInt: " + localInt); // 컴파일 오류
        // System.out.println("localBool: " + localBool); // 컴파일 오류
        // System.out.println("localStr: " + localStr); // 컴파일 오류

        // 로컬 변수 초기화 후 사용
        localInt = 42;
        localBool = true;
        localStr = "Hello, World!";

        System.out.println("localInt: " + localInt);
        System.out.println("localBool: " + localBool);
        System.out.println("localStr: " + localStr);

        // 메서드 내에서 선언된 로컬 변수는 메서드 종료 시 소멸
        // System.out.println("localInt outside method"); // 컴파일 오류
    }

    public static void printFieldValues() {
        // 필드 값 출력 (필드는 자동 초기화됨)
        System.out.println("fieldInt: " + fieldInt);
        System.out.println("fieldBool: " + fieldBool);
        System.out.println("fieldStr: " + fieldStr);
    }

    // 클래스 필드 (자동 초기화됨)
    private static int fieldInt;
    private static boolean fieldBool;
    private static String fieldStr;
}

주의사항 및 팁

  1. 명시적 초기화: 가능한 경우 항상 변수를 선언할 때 초기화하는 것이 좋습니다.
  2. 기본값 의존 피하기: 코드의 가독성과 유지보수성을 위해 기본값에 의존하지 않는 것이 좋습니다.
  3. null 안전성: 객체 참조 변수는 null로 초기화되므로, 사용 전에는 항상 null 체크를 수행하세요.
  4. 상수 사용: 변경되지 않는 값이라면 final 키워드를 사용하여 상수로 정의하는 것이 좋습니다.

편히 모아진 글 보시려면 아래 위키독스 링크 >>
https://wikidocs.net/book/17111