본문 바로가기

Java/Java SE, EE

변수와 타입, 래퍼 클래스, 자동 타입 변환(Promotion)과 강제 타입 변환(Casting)

이 문서의 내용

    변수(Variable)란?

    자바에서 변수는 값(Value)을 저장 할 수 있는 메모리 공간을 의미합니다. 

    변수를 선언하면 변수에 값을 담고, 변수에 담겨있는 값을 읽거나 다른 값을 다시 담을 수 있습니다.

    int vi = 100;
    float vf = 100.0f;
    String vs = "string literal";
    boolean vb = true;
    더보기

    변수와 반대되는 개념으로는 리터럴(Literal)이 있습니다.

    리터럴은 상수(Constant)를 의미하며 정수 리터럴 실수 리터럴 문자(문자열) 리터럴 그리고 논리 리터럴로 구성됩니다.

    예시에서 대입 연산자(=) 우측에 위치하는 상수를 리터럴이라고 부릅니다.

    데이터 타입

    모든 변수에는 타입(Type)이 있습니다. 변수의 각 타입에 따라서 입력 할 수 있는 값과 사용 할 수 있는 범위가 달라집니다.

    변수 타입은 기본(Primitive-원시) 타입참조(Reference) 타입이 있습니다.

    이중에서 Primitive 타입은 리터럴을 직접 저장하기 위한 데이터 타입을 의미합니다.

    구분 타입 메모리 범위
    논리 타입 boolean 1 Byte true or false
    정수 타입 byte 1 Byte -128 ~ 127
    정수 타입 short 2 Byte -32,768 ~ 32,767
    정수 타입 int 4 Byte -2,147,483,648 ~ 2,147,483,647
    정수 타입 long 8 Byte -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
    실수 타입 float 4 Byte (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값
    실수 타입 double 8 Byte (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값
    문자 타입 char 2 Byte 0 ~ 65,535(유니코드, \u0000 ~ \uFFFF)

    타입 변환

    타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 과정입니다.

    모든 데이터가 상호 간에 타입 변환을 수행 할 수 있는 것은 아닙니다. 타입 변환은 크게 자동 타입 변환(Promotion)강제 타입 변환(Casting)으로 구분 합니다.

    자동 타입 변환

    자동 타입 변환(Promotion)은 동일한 성격을 갖는 타입 간에 변환입니다.

    기본적으로 더 큰 데이터 범위를 갖는 타입으로의 이동에서 발생합니다.

    byte a = 100;
    int b = a;
    코드 비고
    Line 2 int b = a 1바이트 정수를 저장하는 byte에서 4바이트 정수를 저장하는 int로 형 변환합니다.
    더보기

    프로모션은 저장 범위가 더 큰 컨테이너로 이동하므로 데이터 손실이 발생하지 않습니다.

    따라서 컴파일 오류가 발생하지 않으며 묵시적 형 변환이라고도 부릅니다.

     Reference 타입에서는 슈퍼 클래스(Super class)로의 형 변환 역시 묵시적 형 변환에 속합니다.

    Class A { }
    Class B extends A { }
    
    B a = new B();
    A b = a;

    강제 타입 변환

    강제 타입 변환(Casting)은 값이 손실될 수 있는 타입 변환입니다.

    데이터 범위가 더 작은 타입으로 값을 이동하는 경우가 이에 속합니다.

    int a = 100;
    byte b = (int) a;
    코드 비고
    Line 2 byte b = (int) a 4바이트 정수를 저장하는 int에서 1바이트 정수를 저장하는 byte로 형 변환합니다.
    더보기

    캐스팅은 저장 범위가 더 작은 컨테이너로 이동하므로 데이터 손실이 발생 할 수 있습니다.

    따라서 컴파일러는 컴파일 오류를 발생시켜 값이 손실 될 수 있음에 경고합니다.

    데이터 손실 가능성을 명시적으로 동의하므로 서로 다른 데이터 타입 간에도 형 변환이 가능합니다. 

    float a = 10.4f;
    int b = (int) a;

    Wrapper 클래스

    Primitive 타입에 상응하는 클래스(Reference 타입)를 제공하며 이를 래퍼(Wrapper) 클래스라고 부릅니다.

    더보기

    래퍼 클래스는 Reference 타입이기 때문에 Null을 처리 할 수 있고 여러가지 멤버 함수를 제공합니다.

    자바에서는 각 Primitive 타입은 상응하는 래퍼 클래스를 제공합니다.

    구분 Primitive 타입 Wrapper 타입
    논리 타입 boolean Boolean
    정수 타입 byte Byte
    정수 타입 short Short
    정수 타입 int Integer
    정수 타입 long Long
    실수 타입 float Float
    실수 타입 double Double
    문자 타입 char Character
    문자열 타입 없음 String

    래퍼 클래스는 언박싱하지 않으면 산술 연산이 불가능합니다.

    더보기

    Primitive 타입을 Wrapper 클래스로 변환 하는 것을 박싱(Boxing)이라고 부르며 그 반대를 언박싱(Unboxing)이라고 부릅니다.

    다음 예시에서 int와 Integer 간의 산술 연산과 int와 float 간의 산술 연산에서는 형 변환이 필요 없습니다.

    하지만 Integer와 float 간의 산수 연산에선는 캐스팅이 반드시 필요합니다.

    int a = 100;
    Integer b = 200;
    float c = 100;
    
    a += b;
    a += c;
    b += (int) c;

    정리 및 복습

    • 자바에서 변수는 값(Value)을 저장 할 수 있는 메모리 공간을 의미합니다.
    • 변수와 반대되는 개념으로는 리터럴(Literal)입니다. 예시에서 대입 연산자(=) 우측에 위치하는 상수를 리터럴이라고 부릅니다.
    String vs = "string literal";
    • 변수 타입은 기본(Primitive-원시) 타입 참조(Reference) 타입이 있습니다.
    • Primitive 타입은 리터럴을 직접 저장하기 위한 데이터 타입을 의미합니다.
    • 타입 변환은 크게 자동 타입 변환(Promotion) 강제 타입 변환(Casting)으로 구분 합니다.
    • 자동 타입 변환(Promotion)은 동일한 성격을 갖는 타입 간에 변환입니다. 기본적으로 더 큰 데이터 범위를 갖는 타입으로의 이동에서 발생합니다.
    • 강제 타입 변환(Casting)은 값이 손실될 수 있는 타입 변환입니다. 데이터 범위가 더 작은 타입으로 값을 이동하는 경우가 이에 속합니다.
    • Primitive 타입에 상응하는 클래스(Reference 타입)를 제공하며 이를 래퍼(Wrapper) 클래스라고 부릅니다.