Programming Language/Java

[Java]자바의 데이터 타입 - Primitive Type & Type Casting

영벨롭 2023. 7. 21. 13:13

★ 자바의 Data Type 

 자바의 데이터 타입은 크게 기본형인 Primitive Type 참조형인 Reference Type 으로 구분합니다. 

 

- Primitive Type

  data type size description
정수형 byte 1 byte -128 ~ 127 범위의 정수
short 2 byte  -32,768 ~ 32,767 범위의 정수
int 4 byte -2^31 ~ 2^31-1 범위의 정수
long 8 byte -2^63 ~ 2^63-1 범위의 정수
실수형 float 4 byte 소수점 7자리까지 정밀도
double 8 byte 소수점 15자리까지 정밀도
문자형 char 2 byte 문자 한 개 
논리형 boolean 1 byte true 또는 false

- Reference Type

 참조형 데이터 타입에는 String, Array, Class, Interface, Enum 과 같은 자료형이 있습니다. 

 

 

★ 정수형 

 정수형 데이터 타입에는 byte, short, int, long 타입이 있습니다. 

public class IntegerType {
    public static void main(String[] args) {
        byte num_byte = 1;
        short num_short = 100;
        int num_int = 1000;
        long num_long = 10000;

        System.out.println(num_byte);
        System.out.println(num_short);
        System.out.println(num_int);
        System.out.println(num_long);
    }
}

 

★ 실수형 

 실수형 데이터 타입에는 float, double 형이 있습니다. 

 float 자료형은 4 byte 로 소수점 7자리까지의 정밀도를 갖습니다. 반면 double 은 8 byte 로 소수점 15자리까지의 정밀도를 갖습니다. 때문에 float 형에 소수점 8자리 이상의 실수값을 대입하여도 소수점 7자리까지 그 값을 반올림하여 저장하게 됩니다. 

 또한 float 자료형을 갖는 변수에 값을 할당 시, 반드시 값 뒤에 f 를 명시해 주어야 float 형이라고 인식하게 됩니다.

 f 를 붙이지 않으면 double 형이라고 인식하기 때문에 타입 에러가 발생하게 됩니다. 이러한 이유로 일반적으로 double 형을 사용하게 됩니다. 

public class RealNumber {
    public static void main(String[] args) {
        float num_float = 3.1415926535f;
        double num_double = 3.1415926535;

        System.out.println(num_float); // 3.1415927
        System.out.println(num_double); // 3.1415926535
    }
}

 

★ 문자형 

 문자형 char 은 문자 한 개를 다룰 수 있는 데이터 타입입니다. 

 'a' 와 같이 작은 따옴표로 감싸 표현하며, 큰 따옴표로 감싸게 되면 에러가 발생하게 됩니다.

 아스키 코드와 유니 코드 표현이 가능합니다. 

public class CharType {
    public static void main(String[] args) {
        char ch1 = 'a';
        char ch2 = 97; // 아스키 코드
        char ch3 = 0x61; // 유니 코드

        System.out.println(ch1); // a
        System.out.println(ch2); // a
        System.out.println(ch3); // a
    }
}

 

★ 논리형 

 논리형 boolean 은 true 또는 false 값을 갖는 데이터 타입으로, 변수에 값을 할당할 때 ture, false 또는 조건식을 이용하여 값을 할당할 수 있습니다. 

 C 언어는 기본적으로 0은 false, 1은 true 로 인식하는 반면 Java 는 1 과 0 을 true/false 로 인식할 수 없기 때문에 이점을 유의하셔야 합니다. 

public class BooleanType {
    public static void main(String[] args) {
        boolean bool1 = true;
        boolean bool2 = false;
        boolean bool3 = (100 > 1);
        // boolean bool4 = 1; // --> 에러!

        System.out.println(bool1); // true
        System.out.println(bool2); // false
        System.out.println(bool3); // true
    }
}

 

 

★ 형변환 Type Casting

- 형변환

 형변환은 변수나 리터럴간 타입을 일치시키기 위해 데이터 타입을 다른 타입으로 변환시키는 것을 말합니다. 

 형변환은 데이터 타입의 크기와 연관이 있기 때문에 주의해서 사용해야 합니다. 

 

 다음 예시 코드를 보면 int 형은 4 byte, short 형은 2 byte 이기 때문에 2 byte 보다 큰 int 형을 short 형에 대입시키는 것은 에러를 발생하게 됩니다. 

int a = 10;
short b = a; // 호환되지 않는 타입 에러

 short 형은 int 형보다 값의 범위가 작기 때문에 다음과 같이 작성해도 에러가 발생하지 않습니다. 

short a = 10;
int b = a;

 이와 같이 boolean 을 제외한 나머지 기본형 데이터 타입은 서로 형변환이 가능하며, 컴파일러가 자동으로 형변환을 해주는 규칙은 다음과 같습니다. 이와 반대로 형변환을 해주어야 한다면 형변환 연산자를 이용하여 강제 형변환을 수행해주어야 합니다. 

byte(1byte) -> short(2byte), char(2byte) -> int(4byte) -> long(8byte) -> float(4byte) -> double(8byte)

 

- 강제 형변환

 강제 형변환은 형변환하고자 하는 데이터 앞에 타입을 괄호로 감싸 명시해줌으로써 수행됩니다. 

 다음 예시를 보면 128 을 갖는 int 형 a 의 값을 short 형, byte 형에 각각 형변환하여 할당하고 있습니다.

 short 형의 범위는 -2^15 ~ 2^15-1 이기 때문에 128 을 그대로 저장할 수 있지만, byte 형의 범위는 -2^7 ~ 2^7-1 이기 때문에 최댓값인 127을 넘는 값을 저장할 수 없습니다. 

 때문에 가장 작은 값은 -128 부터 값을 할당하여 강제 형변환이 이루어지게 됩니다. 

int a = 128;
short b = (short)a; // 128
byte c = (byte)a; // -128

 

- 자동 형변환

 byte > short, char > int > long > float > double 방향으로 형변환을 수행할 때 형변환 연산자를 명시하지 않고도 컴파일러가 자동으로 형변환을 수행해줍니다. 또한 연산과정에서 자동적으로 발생하는 형변환을 "산술 변환"이라고 합니다. 

int m = 80;
double n = m; // int -> double 자동 형변환
double s = 1.0 + m; // 산술 변환
System.out.println(m); // 80
System.out.println(n); // 80.0
System.out.println(s); // 81.0
반응형