[JAVA] 데이터 타입 및 형변환

자바는 기본 데이터 타입과 레퍼런스 타입으로 나뉜다.

기본 데이터 타입에는

byte, short, int, float, double, char, boolean

나머지는 레퍼런스 데이터 타입 → 주로 class, interface, 배열 등

boolean

논리형. true / false

  • int형 → boolean형으로 형변환 안됨

    예를 들어 0을 false, 1을 true로 쓰던 것 불가!

    컴파일 에러 발생!

char

문자형. 16비트 유니코드

수치로는 0 ~ 65535 띠옴표로 사용하며, 문자 하나만.

큰따옴표는 String 타입으로 인식한다.

char c= '한'
char c= 'a'
char c= "a"      // Error
char c= '\\ucafe' //유니코드

byte

정수형. 8비트

-128 ~ 127 범위안에 해당이 된다면 묵시적 형변환으로 대입이 가능하다.

byte b1 = -129; //error
byte b2 = -128;
byte b3 = -1;
byte b4 = 0;
byte b5 = 1;
byte b6 = 127;
byte b7 = 128; // error

short

정수형. 16비트

-32,768 ~ 32,767

int

정수형. 32비트

-2,147,483,648 ~ 2,147,483,647

  • int형 범위 에러

      int i = 12345678901;
    

    The literal 12345678901 of type int is out of range

long

정수형. 64비트

  • L을 끝에 붙이면 long으로 형변환

    소문자, 대문자 상관없음

      long l = 12345678901L;
    

    안붙이면 int형으로 범위 초과 에러 발생!

float

실수형. 32비트

  • F을 끝에 붙이면 float로 형변환

    실수형의 default는 64비트 double형

      float = 3.14   //error
      float = 3.14F 
    

double

실수형. 64비트

실수형의 default

  • 자주하는 실수

      float = 3.14   //error
      float = 3.14F 
    


묵시적 형변환 (Implicit Type Casting)

작은 크기의 타입은 큰 크기의 타입으로 자동 형 변환된다. 정수형은 실수형으로 자동 형 변환이 된다.

byte → short → int → long → float → double

​ char →

char형과 short와 byte는 형변환이 불가능하다. 에러 발생!

→ char는 unsigned, short와 byte는 signed 타입이기 때문!

f = 123L ?

  • 묵시적 형변환

    64비트, 32비트와 같은 크기로 형변환을 결정하는 것이 아니고, 데이터 타입이 표현할 수 있는 범위를 가지고 형변환을 결정한다.

    실수에 정수가 포함되어 형변환이 가능하다고 보고 묵시적 형변환이 일어나는 것.

      long lvar = 100;
      float fvar = lvar;
      int ivar = 'a';
    


명시적 형변환 (Explicit Type Casting)

큰 크기의 타입이 작은 크기의 타입으로 변형할 경우

실수형이 정수형으로 타입을 변경할 경우

int pi = (int) 3.14F ?

  • 명시적 형변환

    실수형을 강제로 형변환을 시켜줄 수 있도록 명시적 형변환

    실수형에서 정수형으로 명시적 형변환이 일어날 경우, 소수점 아래를 버린다.

    따라서 pi에는 3이 저장됨.

      float fvar = 100; //묵시적 형변환
      long lvar = (long)fvar;
    


byte, short, char은 연산이 이루어지면 int형이 된다.

  • 코드 예시

      byte by1 = 1;
      byte by2 = 2;
      byte by3 = by1+by2;	         //error 컴파일 에러
      byte by4 = (int)by1+by2;	   //error
      byte by5 = by1+(int)by2;	   //error
      byte by6 = (byte)(by1+by2);
      int in = by1+by2;
    

    연산 결과를 명시적 형변환을 시켜주거나, int에 저장해야한다.

연산을 할 때에는 기본적으로 큰 타입으로 연산이 된다.


1-0.9 = 0.09999999998 ?

  • floating point

    floating point는 2진 소수로 표현되는데, 대부분 십진수은 반올림해서 표현한다.

    이진법에서 1/10은 무한히 반복되는 소수다. 따라서, floating point로 0.1를 정확히 표현할 수 없기 때문에 발생하는 오류이다.

    자바에서는 이런걸 해결하기 위해 BigInteger/BigDecimal을 사용한다.

댓글남기기