[JAVA] 기본형(Primitive Type)

용용학생·2024년 3월 30일

자바

목록 보기
3/32
post-thumbnail

Java 언어에서 자료형은 크게 기본형참조형, 두 개로 나누어진다.
그 중 변수에 실제 값(data)를 저장하는 기본형에 대해서 알아보자.

기본형의 종류

기본형에는 총 8개 타입이 존재한다.

  • 논리형 - boolean
  • 문자형 - char
  • 정수형 - byte, short, int, long
  • 실수형 - float, double

이렇게 총 8개로 이제부터 하나씩 알아보자.

논리형 - boolean

  • 논리형에는 boolean 한가지 밖에 없다.
  • boolean형 변수에는 truefalse 중 하나를 저장할 수 있다.
  • default 값은 false 이다.
    • 초기화를 하지 않으면 false 로 값이 할당된다.

타입 크기

두 가지 값만을 표현하면 되므로 1bit이면 충분하지만 자바에서는 데이터를 다루는 최소 단위가 byte이므로 boolean 형의 크기는 1byte이다.

정수형의 short

선언과 초기화

	boolean power = true;
    boolean checked = False; // X, 대소문자가 구분된다. true 또는 false 만 가능하다.
  • 대소문자가 구별되기 때문에 TRUE 와 true 는 다른 것으로 간주되는 것에 유의하자.

문자형 - char

  • 문자형 역시 char 한가지밖에 없다.
  • 문자를 저장하기 위한 자료형이며, 하나의 문자만을 저장할 수 있다.
  • char형 변수에는 문자가 아닌 문자의 유니코드가 저장된다.
	char ch = 'A'; // 문자 'A'를 char타입의 변수 ch에 저장

ch 변수 안에는 'A'가 저장되어있는게 아니라 'A'의 10진수 유니코드 값인 65가 저장되어 있다.

	char ch = 'A';
    char ch = 65;
    
    // 이 두 개의 문장은 동일한 결과를 얻는다.
    
    // 어떤 문자의 유니코드를 알고싶다면 정수형으로 변환해보면 된다.
    int unicodeOfA = (int)ch;

유니코드?? 아스키코드??

아스키코드(ASCII)는 미국 ANSI에서 표준화한 정보교환용 7비트 부호체계이다.
128개의 문자집합을 제공하는 아스키코드로는 전 세계의 모든 글자가 표현되지 않는 한계에 부딪혔다.
이 때 하나로 통일된 문자집합의 결과가 유니코드이다.
유니코드는 16비트를 사용해서 65536개(0~65535)를 표현할 수 있다.

자바는 유니코드를 예상하고 설계했기 때문에 char 타입의 크기가 2byte이다.

타입 크기

char형은 2byte(16bit)의 저장공간을 가진다.
( 216 = 65536 )개의 문자를 표현할 수 있다.

정수형의 short 타입과 2byte로 크기가 같다.
그러나 둘은 표현할 수 있는 값의 개수(216)만 같고 표현의 범위가 다르다.
short형은 ( -215 ~ 215-1 ) 이고 char형은 ( 0 ~ 216-1 ) 이다.

정수형

정수형에는 byte, short, int, long. 이 4가지의 타입이 있다.

  • byte
    • 이름 그대로 1byte의 크기
    • 표현 범위 : -128 ~ 127 ( -27 ~ 27-1 )
  • short
    • int형보다 짧다는 의미 -> 2byte의 크기
    • 표현 범위 : -32768 ~ 32767 ( -215 ~ 215-1 )
  • int
    • 4byte의 크기
    • 표현 범위 : -2147483648 ~ 2147483647 ( -231 ~ 231-1 )
  • long
    • int형보다 길다는 의미 -> 8byte의 크기
    • 표현 범위 : -263 ~ 263-1

정수형의 오버플로우

오버플로우 : 타입이 표현할 수 있는 값의 범위를 넘어서는 것

	short n1 = 32767 
    short n2 = (short)(n1 + 1);
    
    System.out.println(n2); 

위의 코드에서 n2가 32768이 나오기를 예상했지만 실제로는 -32768이 나온다.
32767이 short형에서 표현할 수 있는 최대의 값이어서
여기다가 1을 더하면 오버플로우가 발생하기 때문이다.

	short n1 = -32768;
    short n2 = (short)(n1 - 1);
    
    System.out.println(n2);

위 코드 역시 오버플로우가 발생하여
예상한 값 -32769가 아니라 32767이 출력된다.

최소값보다 작아져도 언더플로우가 아닌 오버플로우라고 부른다.

C언어 개정 이후 Integer 연산에서 언더플로우 용어는 사라졌다.

실수형

실수형에는 float, double. 이 2가지의 타입이 있다.

  • float
    • 4byte의 크기
    • 저장 가능한 값의 범위(양수) : ( 1.4 * 10-45 ~ 3.4 * 1038 )
  • double
    • float형의 두 배의 크기 -> 8byte의 크기
    • 저장 가능한 값의 범위(양수) : ( 4.9 * 10-324 ~ 1.8 * 10308 )

실수형의 오버플로우

실수형도 정수형처럼 오버플로우가 발생한다.

	// 1. 오버플로우
	float f = Float.MAX_VALUE;
    f = f * 2;
    
   	System.out.println(f);
    
    // 2. 언더플로우
    float g = Float.MIN_VALUE;
    g = g / 2;
    
    System.out.pritln(g);
  1. 오버플로우
    최댓값보다 큰 값이 계산되면 저 결과는 Infinity(무한대) 가 나온다.
  2. 언더플로우
    최솟값보다 작은 값이 계산되면 저 결과는 0 이 나온다.

이건 왜 오버플로우 안 나요?

실수형의 오버플로우를 확인해보기 위해서 이 코드를 실행했었다.

	float f = Float.MAX_VALUE;
    
    System.out.println((f + 1.0));

Infinity 값을 예상했지만 MAX.VALUE의 값이 그대로 나왔다...?
그 이유는 1은 정밀도에 오류를 내기에는 너무 작은 값이기 때문이다.

그럼 Float.MIN_VALUE - 1도 그대로일까?

	float f = Float.MIN_VALUE;
    
	System.out.println("MIN_VALUE : " + f);
    System.out.println("MIN_VALUE minus 1 : " + (f-1.0));

이 결과는 -1.0 이 나온다. 그 이유는 실제 MIN_VALUE에서 1을 뺀 결과가 -1에 매우 가까운 수이기 때문이다. 반올림 후 -1.0으로 값을 출력한다.

참고) Float.MIN_VALUE 는 가장 작은 양수값이다.
표현할 수 있는 가장 작은 값은 -Float.MAX_VALUE 이다.

profile
자바 스프링 공부하는 정리 블로그!

0개의 댓글