본문 바로가기
JAVA-Spring/Data type, Operator

JAVA 프로그래밍 [형변환, Cast] 개요

by Super Santj 2019. 7. 10.

연산 중간에 형이 변환이 되는 경우가 있다. (+ * / - 등등 더하기 곱하기 나누기 빼기) 이때의 형변환은 객체 형변환과도 밀접한 연관이 있다. 그리고 형변환에서의 형은 자료형이 바뀌는것은 의미한다.

형변환의 종류 _

1. 자동형변환

묵시적인 형변환이라 말하기도 한다. 즉 알고도 모른채 하듯 가만히 놔두면 자동으로 형변환이 되는것을 의미 한다.

변수의 값을 저장시킬때, 그리고 연산할때 적용이 된다.

byte < short < int < long < float < double < char (데이터의 크기 순서)

형변환은 위 테이블에서 데이터 타입이 변경됨을 의미한다.

(하지만 Boolean은 형변환과 전혀 상관이 없다.)

자동 형변환과 명시적 형변환 예제

    1) 자동 형변환은 적은 데이터가 큰 데이터 공간에 저장 -> 자동으로 형변환(큰 데이터 공간에 맞춰서 저장, 즉 메모리 낭비을 하게된다.)

short s=12; 와 byte s=12; 둘다 저장이 가능하나. 바이트가 저장 크기가 더 작기때문에 메모리 낭비가 덜하다.

계산중간에 자료형이 변환이됨

    2) 계산중간에 자료형이 변환되는 것 또한 자동 형변환이다.

char c='A'; 의 경우

n2 = c + 1; 의 자료형은 무엇일까?

char(2byte) + int(4byte) 로 볼수있다. 자동 형변환은 적은 바이트가 큰 바이트로 따라가는 성향이 있기에

소+대 는 대+대로 인식을 하게되고 이로써 자동 형변환이된다.

즉 n2 = c + 1;의 경우 int+int로 변환이 되고 n2는 int의 데이터 타입을 갖게된다.

자동형변환 소수점 변환 예제

그렇다면 큰데이터 값을 작은 값으로 변경하는 방법은 있을까? 오로지 강제형변환을 통해 변경이 가능하다. 그 이외의 방법은 없다. 하지만 이렇게 명시적인 강제적인 형변환을 할경우 데이터 손실이 일어날수도있다.

만약 아래의 경우 데이터타입 위치에 어떤 데이터타입이 와야할까?

byte s2 =12; short s3=45;
데이터타입 re = s2+s3;
System.out.println("re->" + re);

이제 막 입문한 사람이라면 short을 넣어야 된다고 생각할 수도있다. 하지만 자바에서는 연산자를 사용하는 모든 데이터 타입은 반드시 int 를 사용하기에 헷갈려서는 안된다.

2. 강제형변환

명시적인 형변환이라 말하기도 한다. 명확하게 형변환을 표시해줘야 하는 형변환 방식이다.

(변경할 자료형) 변수명, ex) float f=3.5; float은 4바이트, 3.5는 소수인 double형이기에 8바이트이다. 이경우 반드시 오류가 발생하게된다. 여기서 필요한것은 강제형변환이다. 물론 float f=3.5f 로 변경하여도 에러는 발생하지 않지만, 아래와 같이 강제적으로 형변환을 하여도 된다.

float f=(float)3.5;

하지만 강제적인 형변환은 데이터 형을 강제적으로 변경을 하는것이기때문에 단점으로는 데이터 손실이 일어날수가있다.

byte s2 =12; short s3=45;
short re2=(short)(s2+s3);

위 경우 처럼 연산자의 데이터를 강제적으로 형변환을 하려면 반드시 괄호로 묶어줘야 한다.

형변환을 보면, 자바의 특징중에 하나가 인식성이 뛰어난 언어이고 운영체제에 독립적인 언어 라고 알수가 있습니다.

댓글