[Java] 데이터 타입

2024. 3. 7. 01:34BE/Java

모든 변수에는 타입을 지정할 수 있는데 변수 타입에 따라 저장할 수 있는 리터럴 종류가 달라진다.

변수를 선언 시 결정된 타입은 사용 도중 변경할 수 없다.

 

원시타입 (primitive)

정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 의미한다.

원시 타입은 바이트 단위로 메모리를 사용할 수 있는 크기를 갖는다.

 

정수 타입

정수 타입에는 메모리 사용 크기 오름차순으로 byte, char, short, int, long 총 5개의 타입이 있다.

 

byte : 1 바이트 ( -128 ~ 127 )

char : 1 바이트 ( 0 ~ 65535 )  → 유니코드

short : 2 바이트 ( -32768 ~ 32767 )

int : 4 바이트 (-2147483648 ~ 2147483647 )

long : 8 바이트 (-2^(63) ~ 2^(63) - 1 )

 

자바는 기본적으로 정수 연산을 int 타입으로 수행하기 때문에 정수 연산을 하는 경우 int 타입 변수에 저장하는 것이 좋다.

byte와 short 는 메모리 사용 크기가 작아서 연산 범위를 벗어나는 경우 잘못된 결과를 초래한다.

 

byte 타입

byte 타입은 주로 색상 정보, 파일, 이미지 등 바이너리 데이터를 처리할 때 사용된다.

 

* 최상위 비트 (Most Significant Bit) : 정수값의 부호를 결정하는 비트이다.

MSB가 1인 경우 나머지 비트에 1의 보수를 취한 뒤 1을 더한 값에 마이너스를 붙이면 십진수로 표현된 값이다.

 

변수 선언 시 메모리 크기를 초과하는 리터럴로 초기화하려는 경우 컴파일 에러가 발생한다. 

public class Example {
    public static void main (String[] args) {
        byte var1 = -128;
        byte var2 = 127;
        byte var3 = var2 + 1; // 컴파일 에러
    }
}

 

런타임 시 변수 메모리 크기를 초과하는 리터럴을 대입하는 경우 의도치 않은 결과가 나타난다.

public class Example {
    public static void main (String[] args) {
        byte var = 127;

        for ( int i = 0; i < 5; i++) {
            var++;
            System.out.println("var : " + var);
        }
    }
}

 

127에서 1을 더하는 경우 -128로 저장되는 것을 알 수 있다.

 

char 타입

자바는 모든 문자를 유니코드로 처리한다.

char 타입은 하나의 유니코드를 저장하는 용도로 사용된다.

유니코드 : 세계 각국의 문자들을 코드값으로 매핑한 국제 표준 규약이다. 0 ~ 2^(16)-1 범위의 값을 갖는다.

 

char 타입에는 문자 리터럴뿐만 아니라 10진수, 16진수 정수 리터럴도 저장할 수 있다.

16진수 리터럴인 경우에 유니코드 의미에서 `\u16진수' 형태로 값을 저장하면 된다.

char c = 65;
char c = '\u0041';

 

소스 코드에서 char 변수에 저장된 유니코드를 알고 싶다면 char 타입 변수를 int 타입에 저장해보면 알 수 있다.

 

공백을 초기화를 위해  ''로 대입하는 경우 컴파일 에러가 발생하므로  ` `로 대입해야 한다.

 

문자열을 저장하려면 String 클래스를 사용하면 된다.

 

String 클래스

public class Example {
    public static void main (String[] args) {
        String str = "Hello World";
        System.out.println(str);
    }
}

String 변수에서 ""로 초기화해도 컴파일 에러가 발생하지 않는다.

 

short 타입

c언어 호환을 용도로 사용되는 데이터 타입이다.

 

int 타입

정수값을 저장할 수 있는 데이터 타입으로 정수 연산 시 디폴트로 int 타입으로 간주한다.

public class Example {
    public static void main (String[] args) {
        int var1 = 10; // 10진수
        int var2 = 012; // 8진수
        int var3 = 0xA; // 16진수
    }
}

 

long 타입

수치가 큰 정수 데이터를 다룰 때 사용되는 데이터 타입이다.

long 타입의 변수를 초기화할 때 정수 리터럴 뒤에 소문자l 또는 대문자L을 붙여 컴파일러에게 8바이트 정수 데이터라고 알려주어야 한다. 그렇지 않으면 컴파일 에러 발생한다.

public class Example {
    public static void main (String[] args) {
        long var1 = 100000000000; // 컴파일 에러 (int 범위 벗어남)
        long var2 = 100000000000L;
    }
}

 

실수 타입

소수점 있는 실수 데이터를 부동 소수점으로 표현하여 저장할 수 있는 타입이다.

정수 타입보다 더 큰 범위의 값을 다룰 수 있지만 오차가 발생하는 단점이 있다.

 

float : 4바이트

double : 8바이트

 

자바에서 실수 리터럴은 디폴트로 double로 간주한다.

float 타입 변수에 저장할 때 실수 리터럴 뒤에 소문자f 또는 대문자F를 붙여야 한다.

float

부호 1비트, 지수 8비트, 가수 23비트

 

double

부호 1비트, 지수 11비트, 가수 52비

public class Example {
    public static void main (String[] args) {
        double var1 = 3.14;
        float var2 = 3.14; // 컴파일 에러
    }
}

 

정수 리터럴에 10의 지수를 나타내는 E 또는 e를 포함하고 있으면 정수 타입 변수에 저장할 수 없고 실수 타입 변수에 저장해야 한다. 이 때, e를 포함하고 있는 리터럴은 double 타입이다.

public class Example {
    public static void main (String[] args) {
        int var1 = 1e1; // 컴파일 에러
        float var2 = 1e1; // 컴파일 에러
        double var3 = 1e1;
    }
}

 

논리 타입

1바이트로 표현되는 논리값을 저장하는 데이터 타입이다.

 

boolean

public class Example {
    public static void main (String[] args) {
        boolean stop = true;
        if (stop) {
            System.out.println("stop : " + stop);
        }
    }
}

 

 

728x90

'BE > Java' 카테고리의 다른 글

[Java] 연산에 대해  (0) 2024.03.07
[Java] 타입 변환  (0) 2024.03.07
[Java] 변수  (0) 2024.03.06
[Java] 자바 개발 환경 구축하기  (0) 2024.03.01
[Java] 자바에 대해 알아보자  (0) 2024.02.29