본문으로 바로가기

JAVA 테이터형의 종류 / casting

category JAVA 2019. 11. 28. 18:47

기본형(Primitive)과 참조형(Reference)


  • 기본형(Primitive)은 변수에 직접 값을 저장한다.
  • 참조형(Reference)형은 힙(Heap)이라는 메모리 영역에 실제 데이터인 객체를 저장하고, 변수에는 그 객체를 참조할 수 있는 참조값( id값 || key값)만을 저장하는 특성이 있다.
생활에서의 자료형 프로그래밍에서의 자료형 예시
문자 char char firstAlpha='A';
숫자 정수형 byte, short, int, long int age=20;
long earthAge=454000000000000L;
실수형 float, double float height=180.5f;
double weight=80.5;
논리 boolean boolean isPowerOn=true;
어떤것 나머지 모두 Date today=new Date( );
String name='홍길동';

 

기본형의 크기

구분 1byte 2byte 4byte 8byte
논리형 boolean      
문자형   char    
정수형 byte short int long
실수형     float double

 

컴퓨터는 모든 자료를 0과 1로만 구분한다. 이 단위를 1bite라고 한다. 

1bit는 8개의 byte로 구성된다.

 

 

맨 앞의 bit를 부호비트(sign bit)라고 하며, 이 비트는 양수인지, 음수인지 표시한다.

부호비트를 뺀 나머지 7개의 비트에만 값을 기록한다.

 

 

정수형 값의 표현 범위

표현의 범위는 할당될 수 있는 값의 한계를 나타낸다. 범위를 넘어가는 값은 할당할 수 없다.

 

byte 변수명;  // -128 ~ 127 
short 변수명;  // -32768 ~ 32767 
int  변수명; // -2,147,483,648 ~ 2,147,483,647 
long 변수명; // -9223372036854775808 ~ 9,223,372,036,854,775,807

 

실수형 값의 표현 범위

  • float는 소수점이하 9번째 자리에서 반올림해서 8자리까지 표현한다.
  • double은 소수점이하 18번째 자리에서 반올림해서 17자리까지 표현다.

float 변수명; // 1.40129846432481707e-45 ~ 3.40282346638528860e+38 
double 변수명; //4.94065645841246544e-324d ~ 1.79769313486231570e+308d

 

문자형 값의 표현 범위

 


정수형

  • 정수형 타입의 기본형은 int이다. 
  • int보다 작은 타입의 변수에 할당할 경우, 자동으로 해당 타입으로 변경된다.(묵시적 형변환)
  • int보다 큰 타입의 변수에 할당할 경우, 리터럴에 데이터 타입을 알려줘야한다.
long long1=10;
long long2=10_000_000_000; //int 타입으로 간주하여, 오류가 발생한다.
long long3=10_000_000_000L; //long 타입으로 인식하여 오류발생하지 않음

 

실수형

  • 실수형 타입의 기본형 double이다.
    아무 표현 없이 실수 리터럴 작성시 double 타입의 자료를 사용한것이다.
  • float 타입의 변수에 실수를 할당할 경우, 리터럴에 f로 데이터 타입을 알려줘야한다.
float height=180.5f;
double weight=90.5;

 

문자형

  • char는 하나의 문자만을 표현하기 위한 자료형이다.
  • 문자를 표현하기 위해서 아스키코드 또는 아스키코드의 확장판인 유니코드를 사용한다.
  • 문자형을 표현할때는 작은따옴표( ' ' )를 이용해서 하나의 문자를 표현한다.
char a='a';

 

프로그래밍에서 문자는 사실 정수형 숫자이다. 따라서 정수처럼 연산할 수 있다.

다음 예에서 'A'라는 문자에 1을 더하면 어떻게 되는지 살펴보자

int i='A'+1;
System.out.println(i+":"+(char)i);  //66:B

 

논리형

  • true와 false 두 개의 값만을 사용할 수 있다..
//직접작성하기
boolean isRun=true;
if(isRun) {
	System.out.println("달려요!");
}
		
//비교 연산의 결과로 얻어내기
boolean isGreater=10>2;
if(isGreater) {
	System.out.println("10은 2보다 커요");
}
		
//논리연산의 결과로 얻어내기
boolean result=true||false;
System.out.println(result);

 

문자열

  • 문자열은 기본자료형이 아닌 참조형 자료형.
  • 문자열을 표시할때는 큰따옴표( " " )로 묶어준다.
  • 문자(Char)데이터를 배열로 넣어서 다룬다.
  • 어떤 타입의 자료든 문자열과 더하면 기존 문자열과 결합하여 문자열로 변한다.
  • 참조형(Reference)형 힙(Heap)이라는 메모리 영역에 실제 데이터인 객체를 저장하고, 변수에는 그 객체를 참조할 수 있는 참조값( id값 || key값)만을 저장하는 특성이 있다.
//name 안에 들어 있는 참조값을 tmp1 변수에 대입하기(참조값 복사)
String tmp1=name;
String tmp2=msg;
		
//num 안에 들어있는 value를 tmp3 변수에 대입하기(value 복사)
int num=10;
int tmp3=num; //value 값을 복사해줌

 

형변환(casting)


형변환 연산자

  • 형변환이란 값의 형을 다른 값으로 변환하는 것을 말한다.
  • 기본형은 기본형끼리 참조형은 참조형끼리 변환 가능하다.
  • 자료형이 표현할 수 있는 값의 범위에 따라 형변환 연산자의 사용여부가 결정된다.

자료형이 표현할 수 있는 값의 범위에 따라 형변환 연산자의 사용여부가 결정된다.

long l1=100;
float f1=l1; //묵시적 형변환 가능
long l2=(long)f1; //명시적 형변환 필요

long은 64bit이고 float는 32bit이다. 

하지만 float에서 표현할 수 있는 값의 범위는 long 보다 훨씬 크다.


형변환의 종류

묵시적 형변환과 명시적 형변환이 있다.

  • 값의 타입에 따라 명시적 형변환을 해주어야한다.
  • 값의 손실이 있는 경우 명시적 형변환을 해줘야한다.
    (값의 손실을 프로그래머가 책임짐)
  • 값의 손실이 없는 경우 묵시적 형변환이 이루어진다.

값의 손실이 없어 묵시적으로 형변환이 이루어지는 경우

byte b=10;
int i1=(int)b; //형변환 연산자를 써도 되지만
int i2=b; //생략해도 상관없다.

 

값의 손실이 있어 명시적으로 형변환을 해줘야하는 경우

int i1=266;
byte b1=i1; //type mismatch
byte b2=(byte) i1;

10진수 266을 2진수로 표시하면 1 0000 1010으로 총 9자리이다.

byte가 부호비트를 포함해서 총 8자리이므로 맨처음의 1을 표현할 수 없어 값의 손실이 일어난다.

이런경우는 반드시 명시적으로 형변환 연산자를 사용해줘야한다.

값의 손실을 프로그래머가 책임지는 것이다.

 

값의 타입에 따라 명시적 형변환을 해주어야한다

int i1=10;
byte b1=i1; // type mismatch

i1의 값이 byte에서 표현할 수 있는 작은 값이지만, b1는 byte형 변수 이므로 명시적으로 형변환을 해주어야한다.

 


기본형 사이의 형변환 현상

정수형 간의 형변환 

  • 자릿수에 다른 값의 손실만 조심하면 된다.
  • 묵시적 형변환이 일어나는 경우, 자연스럽게 값이 할당된다.
  • 명시적 형변환이 일어나는 경우, 자릿수가 줄어들어 값의 손실이 발생하지 않는지 주의 해야한다.

 

정수형과 실수형 간의 형변환

  • 정수형과 실수형간의 가장 큰 차이는 소수점의 유무이다.
  • 묵시적 형변환이 일어나는 경우는 정수에서 실수로의 형변환이 될때이고 이때는 소수점이 추가된다.
    하지만, 소수점 자리수는 정확히 표현되지 않는다.
  • 명시적 형반환이 일어나는 경우는 실수에서 정수로 형변환이 될때이고, 이때는 실수부가 삭제되고 정수부는 자리수에 맞게 줄어들 수 있다.

    예시) 숫자형 데이터 타입의 연산

    국어와 영어 점수는 각각 95점, 100점이고, 모두 정수이기 때문에 정수형 데이터 타입 중 하나인 int 데이터 타입으로 명시해주었다.
//국어점수
int kor=95;
//영어점수
int eng=100;

평균을 구하려면 두 수의 합을 구해야하는데, 두 수의 합 또한 정수로 출력 되기 때문에 동일하게 int 데이터 타입으로 명시한다.

//두 점수의 합
int sum=kor+eng;

 

문제는 평균을 구할때이다.

float avg=sum/2;  //97.0

위와같이 연산을 하면 소수점 자리는 나오지 않는다.

 

그 이유는 위에 나와 있듯이 sum/2로 정수끼리 연산을 했기 때문이다. 

소수점 자리까지 정확하게 나오기 위해서는 숫자 2위에 float type의 data라고 명시해주어야한다.

float ave=sum/2f; //97.5

 

 

 

실수형 간의 변환

  • double에서 float로 명시적 형변환이 이루어질때는 유효 자릿수에 대한 문제로 값 손실이 발생할 수 있다.
  • 묵시적 형변환은 아무런 변화가 없다.

 

문자와 숫자의 형변환

  • 타입의 크기와 상관없이 숫자는 문자로 묵시적 형변환이 이뤄지지 않는다.
    (반드시 명시적 형변환 필요)
    숫자가 문자로 형변환되면 실수부는 없어지고 정수부를 자릿수에 맞게 줄인 후, 유니코드에 매칭되는 문자로 표기.
  • 문자를 숫자로 변환하면 문자가 매칭된 정수가 앞서 설명한 규칙에 따라 형변환 된다.

 

논리형의 형변환

  • 논리형은 다른 어떤 기본형과도 형변환이 될 수 없다.