코드일기장

Java 타입간의 변환과 형변환 연산자 자동 형변환 본문

Java

Java 타입간의 변환과 형변환 연산자 자동 형변환

won_hyeok2 2021. 11. 22. 21:07

Java 타입 간의 변환에 대해 설명해 보겠다.

 

1. 문자와 숫자간의 변환

 

숫자 3을 (char)타입 문자'3'으로 변환하기 위해 어떻게 해야 할까? 코드를 보여주고 설명하겠다.

어떤 값이 출력될까? 아마 '3'이 출력되지 않을까? 출력 값은 다음과 같다.

 

왜 35가 출력 되는지는 뒤에서 더 자세히 설명하겠다. 위 코드에서 inteager형 + char형이 결합되면 전혀 예상하지 못한 숫자가 출력된다는 것만 알면 된다. 

 

 

 

  • 1번째 출력값은 어떻게 될까? 여기서 charAt()은 무시하고 만약 '3'-'0'을 하게 된다면 어떤 타입의 어떤 식으로 출력하게 될까? 형식적으로는 숫자 inteager (int) 타입 3이 출력될 것이다. 다시 돌아와서 "3".charAt(0) charAt()은 String타입을 char로 변환시켜주는 함수이다. 형변환 함수에 대해 조금 있다가 알아보자.  결론적으로 charAt(0)은 "3"을 '3'으로 바꿔준 후 '0'을 빼게 되어서 숫자 3이 출력될 것이다.
  • 2번째 출력 값은 어떻게 될까? '3'-'0'=숫자 3, 3+1은 4 즉, int타입 4 출력될 것이다.
  • 3번째 출력 값을 알아보기 전, 알아야 할 규칙이 있다. String+int 혹은 double float 등 아무 타입이나 String과 + 하게 되면 무조건 String 타입으로 출력이 된다. 규칙대로 출력 값을 예측해보면  "31"이 출력될 것이다. 숫자 31이 아닌 String "31"을 말한다.

 

위 코드의 출력값

 

지금까지 타입 간의 변환에 대해 알아봤다, 다음으로는 형변환에 대해 알아보겠다.


 

2. 형변환  연산자

 

형변환이란,

    변수 또는 상수의 타입을 다른 타읍으로 변환하는 것

(타입) 피연산자

 

 

		double d = 85.4;
		int score =(int)d;
		int score2=(int)85.4;
		System.out.println(score);
		System.out.println(score2);

출력결과

 

위 코드를 보면 d=85.4 실수이다.  score변수는 d로 초기화하는데 앞에 형변환 연산자(int)를 이용해 85.4->85로 바뀌어 초기화된 것이다. score2역시 마찬가지이다. 85.4(f) 값을 85로 정수형으로 바꾸어서 저장된 것이다.

 

 

		char A=(char)65;
		int B=(char)'B';
		
		float f=(float)85;
		int i=(int)85.5;
		
	
		System.out.println(A);
		System.out.println(B);
		System.out.printf("%.2f\n",f);
		System.out.printf("%d\n", i);

출력결과

 

  • char타입 A변수에 (char) 65를 저장했더니 출력 값으로 A가 나온다 왜 그럴까? 그 이유는 int 65를 형변환하면 유니코드 번호의 65번의 값으로 바뀌는 거다 유니코드의 65번은 'A'이므로 A변수에 'A'값이 저장된 것이다.
  • int B 마찬가지로 'B'를 정수 값으로 바꾸면 66이 된다 (유니코드 참조) 그러므로 B에 66이 저장된다.

 


 

3. 자동 형변환

 

		float f= 134;
		
		//byte b= 1000; //error 큰 타입에서 작은 타입으로 형변환하여 값 손실발생 에러
		
		byte b1=(byte)1000;
		
		System.out.println(f);
		//System.out.println(b);
		System.out.println(b1);

출력결과

  • float f=134 정수형 값으로 초기화해준다. 원래 (float) 134로 형변환 연산자를 사용해줘야 하지만 컴파일러가 생략된 형변환을 자동으로 추가해주어서 error 없이 코드가 작동된다.
  • 주석처리된 byte b는 정수형 1000을 저장하면 에러가 발생한다. 값 손실이 일어나 코드가 작동이 안 된다. 
  • 밑에 바로 b1을 보면 (byte)로 수동 형변환 연산자를 사용한다. 하지만 출력 값은 -24가 나온다. 그 이유는 오버플로우(overflow)가 발생했기 때문이다.

 

주석된 byte b 코드를 자세히 설명하면 정확히 따지면 byte는 -128~127만 저장할 수 있다. 그런데 1000을 저장해 오류가 발생한 거다.

  이를 생각해보면 표현 범위 즉, 값을 저장할 수 있는 범위가 좁은 쪽에서 넓은 쪽으로는 자동 형변환이 된다. 손실 값이 없기 때문이다. 하지만 값이 넓은 쪽에서 좁은 쪽은 자동 형변환이 불가능하다 수동 형변환을 하면 할 수는 있다.

 

 

  byte-> short-,char-> int-> long-> float-> double

(왼쪽부터 오른쪽으로 표현할 수 있는 값의 범위가 작은 것부터 큰 것으로 나열한 것이다.)

 

 

 


정리

형변환의 목적은 주로 서로 다른 두 타입을 일치시키기 위해서이다.

형변환 연산자를 안 적어도 컴파일러가 자동으로 형변환한다.(자동 형변환)

위에 값의 범위가 왼쪽에서 오른쪽 즉, 넓은 쪽-> 좁은 쪽에서는 자동 형변환이 가능하지만 

그 반대 방향은 반드시 형변환 연산자를 써야 한다.(ex) short값을->byte 할 시 (short) 500 이런 식)


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


대표 사진

https://www.flaticon.com/kr/free-icon/java_154878

 

<div> 아이콘 제작자 <a href="https://www.freepik.com" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/kr/" title="Flaticon">www.flaticon.com</a></div>

'Java' 카테고리의 다른 글

[Java] try-catch문(예외처리 1-2)  (0) 2021.12.27
Java_예외 처리(예외처리 1-1)  (0) 2021.12.23
Java_BufferedReader /BufferedWrite  (0) 2021.10.06
Java_Arrays class  (0) 2021.10.04
Scanner로 데이터 input_Java  (0) 2021.10.03
Comments