고래씌

[JAVA] 2. 자료형 변환, printf 문 본문

JAVA/JAVA 기초

[JAVA] 2. 자료형 변환, printf 문

고래씌 2023. 9. 27. 15:28

1. 형 변환

1) 형 변환 : 값의 자료형을 바꾸는 개념

 2) 컴퓨터상에서 값 처리 규칙
  2-1. 대입연산자(=) 기준으로 왼쪽과 오른쪽은 같은 자료형이어야함. 즉, 같은 자료형에 해당하는 값만 대입이 가능하다.
       만약, 다른 자료형의 값을 대입하고자한다면 "형변환"이라는 과정이 필수다.
      [표현법]
      자료형 변수형 = (바꿀 자료형) 값;
     
  2-2. 같은 자료형끼리만 연산이 가능하다. => 즉, 다른 자료형끼리 연산을 수행하고 싶으면 한 구문은 "형변환"을 해야함
   [표현법]
    값 + (바꿀자료형) 값
     
  <형변환의 종류>
  1) (암시적)자동형변환 => 자동으로 형변환이 진행되는 케이스로 내가 직접 형변환할 필요가 없다.
      작은바이트의 자료형 -> 큰바이트의 자료형으로 변환시 발생


  2) (묵시적)강제형변환 => 자동형변환이 되지 않아 내가 직접 강제로 형변환을 해야하는 케이스.
      큰바이트의 자료형 -> 작은바이트의 자료형 바꿀 때 발생
  (바꿀 자료형) == 형변환 연산자 == cast 연산자라고 불림
   
 ※ boolean은 형변환 불가

 

※ 특이케이스 long(8byte) -> float(4byte)

정수가 실수로 담길때에는 큰 사이즈의 정수여도 작은 사이즈의 실수 변수에 대입 가능.

4byte의 float 자료형이 long 자료형보다 표현할 수 있는 값의 범위가 훨씬 더 크기 때문

 

 

 

※ 특이케이스 char(2byte) <-> int(4byte)   :   양방향 형변환 가능

char ch = 65;     // ASCII 코드 => 'A' 출력됨

System.out.println("ch : " + ch);      =>    출력값     ch : A

 

☞ char의 범위 0~65xxx : 각 문자마다 고유의 10진수값(정수값)이 정해져있다.
따라서 정해진 표를 통해 양방향 변환이 가능하다. (단, 음수값 제시시 오류발생)
 * 참고 : 아스키코드(0~127, 영문자 대소문자, 숫자, 특수문자)
 * 유니코드(0 ~ 65xxx, 영어 숫자특수문자, 한글, 한자 등등)  

 

 

 

※ 특이케이스 byte와 short간의 연산(강제형 변환)

byte b1 = 1;

byte b2 = 2;

 

byte로 연산시 연산결과의 정수값은 무조건 int로 취급한다!!!  따라서, 강제형변환이 필요하다

byte b3 = b1+b2;    => 에러 발생.     byte 간에 연산이지만 연산결과는 int로 나옴.

byte b3 = (byte)(b1+b2)     => O    (강제형 변환)

 

package com.kh.variable;

public class C_Cast {
	
	// 자동형변환 : 작은바이트의 자료형이 큰바이트의 자료형으로 형변환되는 케이스
	public void autoCasting() {
		
		//1. int(4byte)-> double(8byte)
		int il = 10;
		double dl = il; //자동형변환
				
		System.out.println("dl :" + dl); // 10.0
		
		int l2 = 12;
		double d2 = 3.3;
		
		double result = /* (double) */ l2 + d2; // 12.0 + 3.3 => 15.3
		
		System.out.println("result : " + result);
		
		//2. int(4byte) -> long(8byte)
		int i3 = 1000;
		long l3 = /* (long) */ i3;
		
		System.out.println("l3 : " + l3);
		
		long l4 = 2000L; // L을 붙이지 않아도 되는 이유 ? 자동형변환이 가능하기 때문
		
		//3. 특이케이스 long(8byte) -> Float(4byte)
		/*
		 * 정수가 실수로 담길때에는 큰사이즈의 정수여도 작은사이즈의 실수변수에 대입 가능
		 * 4byte의 float자료형이 long 자료형보다 표현할 수 있는 값의 범위가 훨씬 더 크기 때문
		 */
		
		long l5 = 10000000000L;
		float f5 = /* (float) */ l5;
		
		System.out.println("f5 : " + f5);
		
		//4. 특이케이스 char(2byte) <-> int(4byte) : 양방향 형변환 가능
		char ch = 65;  // ASCII 코드 => 'A' 출력됨
		System.out.println("ch : " + ch);
		
		int num = 'A';
		System.out.println("num : " + num);   // ASCII 코드 => 65 출력됨
		
		/*
		 * char의 범위 0~65xxx : 각 문자마다 고유의 10진수값(정수값)이 정해져있다.
		 *                     따라서 정해진 표를 통해 양방향 변환이 가능하다. (단, 음수값 제시시 오류발생)
		 * 참고 : 아스키코드(0~127, 영문자 대소문자, 숫자, 특수문자)
		 *       유니코드(0 ~ 65xxx, 영어 숫자특수문자, 한글, 한자 등등)    
		 */
		
		System.out.println((int)'경');
		
		char sum = 'A' + 10; // 65 + 10
		
		//5. 특이케이스 : byte와 short간의 연산(강제형 변환)
		byte b1 = 1;
		byte b2 = 10;
		
		// byte로 연산시 연산결과의 정수값은 무조건 int로 취급한다!!!!! 따라서, 강제형변환 시켜줘야함!!!!!
		// byte b3 = b1+b2; =>에러 발생함. byte간에 연산이지만 연산결과는 int로 나온다!
		byte b3 = (byte)(b1+b2);
		
	}

 

<강제(명시적)형변환 : 큰 크기의 자료형을 작은 크기의 자료형으로 형변환 할 경우>

	public void forceCasting() {
		
		//1. double(8byte) -> float(4byte)
		float f1 = 4.0f; // 반드시 f 붙여줘야함
		
		double d2 = 8.0;
		float f2 = (float) d2;
		
		//2. double(8byte) -> int(4byte)
		double d3 = 10.89;
		int i3 = (int) d3; // 10.89 -> 10 (소수점 제거)
		System.out.println("i3 : " + i3);
		
		
		int iNum = 10;
		double dNum = 5.89;
		
		
		//1. 연산결과를 int형으로 맞춰서 강제형변환시키기
		// double iSum = iNum + dNum; // => int 형이 나옴. 10.0 + 5.89 이지만, 결과는 int형으로 나와서 15 출력
		System.out.println("iSum : " + iSum);
		
		int iSum1 = (int)(iNum + dNum); 
		
		System.out.println("iSum1 : " + iSum1);
		
		int iSum2 = iNum + (int) dNum; // 10 + 5 => 15
		// 실수값을 정수형으로 강제형변환 할때는 데이터손실이 무조건 발생한다!!!
		
		/* 데이터 손실 테스트 */
		int iNum2 = 290;
		byte bNum2 = (byte)iNum2;
		
		System.out.println("bNum2 : " + bNum2); 
		
		
	}

 

2. prinf 문

- System.out.println("출력하고자 하는 값") => 값을 출력 + 줄바꿈 처리

- System.out.print("출력하고자 하는 값") => 값을 출력

- System.out.printf("출력하고자 하는 형식", 출력하고자 하는 값, 출력하고자 하는값,...);

=> f 는 format(형식)을 의미

=> 형식에 맞춰서 값들이 출력된다.

=> 문자열 안에 출력하고자 하는 값들을 다음과 같은 미리 위치를 잡아줘야 한다.

 

  • %d : 정수
  • %f : 실수
  • %c : 문자
  • %s : 문자열 
package com.kh.variable;

public class D_Printf {
	
	public void printFtest() {
		
		// 정수테스트
		int iNum1 = 10;
		int iNum2 = 20;
		
		// iNum1 : xx, iNum2 : xx를 출력
		//1. println문 사용
		System.out.println("iNum1 : " + iNum1 + ", iNum2 : " + iNum2);
		
		//2. printf문 사용 => 정수값의 형식인 %d를 사용해서 완성. 줄바꿈 기능이 없기 때문에 직접 개행문자 추가할 것
		System.out.printf("iNum1 : %d, iNum2 : %d\n", iNum1, iNum2);
		
		
		// 10 + 20 =30을 출력해보기 
		
		//1. println문 사용해서 출력
		System.out.println(iNum1 + " + " + iNum2+"=" +(iNum1+iNum2));
		
		//2. printf문 사용해서 출력
		System.out.printf("%d + %d = %d\n", iNum1, iNum2, iNum1+iNum2);
	
		System.out.printf("%5d\n", iNum1); // %5d : 5칸의 공간중 오른쪽 정렬
		System.out.printf("%-5d\n", iNum1); //%-5d : 5칸의 공간중 왼쪽 정렬
		
	
		// 실수 테스트
		double dNum = 4.27546789;
		System.out.printf("dNum : %f\n", dNum);
		// %f : 소수점 아래 7번째 줄에서 반올림되어 소수점아래 6번째값까지만 출력됨(기본값)
		
		System.out.printf("dNum : %.1f\n", dNum);
		// %.1f : 소수점 아래 2번째에서 반올림하여 소수점 아래 1번째까지만 출력해라는 의미
		
		
		
		// 문자와 문자열 테스트
		char ch = 'a';
		String str = "Hello";
		
		System.out.printf("%c %s \n", ch, str); 
		System.out.printf("%C %S \n", ch, str); // ctrl + shift + x/y => 대문자/소문자 변환 시킴
		// ↑ 무조건 대문자 출력됨

3. printf문 특징

- printf : 포맷한번으로 가독성좋게 출력이 가능. 단, 지정한 포맷의 갯수와 종류, 뒤에 오는 변수의 갯수와 종류가 정확하게 일치해야함

 

4-1. 실습1

Q. 실수형으로 국어, 영어 수학 세 과목의 점수를 입력 받아 총점과 평균을 출력하세요. 이때 총점과 평균은 정수형으로 처리하세요.

package com.kh.practice2.func;

import java.util.Scanner;

public class CastingPractice {
	
	public void test1() {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("국어 : ");
		double korean = sc.nextDouble();
				
		System.out.print("영어 : ");
		double english = sc.nextDouble();
		
		System.out.print("수학 : ");
		double math = sc.nextDouble();
		
		int allSum = (int)(korean + english + math);
		
		
		System.out.println("총점 : " + allSum);
		System.out.println("평균 : " + allSum / 3);
		
	}

}

 

4-2. 실습2

package com.kh.practice2.func;

public class CastingPractice2 {
	public void test2() {
		int iNum1 = 10;
		int iNum2 = 4;
		
		float fNum = 3.0f;
		double dNum = 2.5;
		
		char ch = 'A';
		
		
		System.out.println(iNum1/iNum2 ); // 2
		System.out.println((int)dNum); // 2

		System.out.println(iNum2 * dNum ); // 4*2.5 => 4.0* 2.5로 자동형변환되어 계산됨. 10.0
		System.out.println((double)iNum1); // 10.0
		
		System.out.println((double)iNum1 / iNum2); // 둘중 하나 형변환(실수로)하면 하나는 강제형변환(실수로)이 이루어짐. 2.5
		System.out.println(dNum); // 2.5

		System.out.println((int)fNum); // 3
		System.out.println((int)(iNum1 / fNum)); // 3
		
		System.out.println(iNum1 / fNum); // 3.3333333
		System.out.println((double) iNum1 / fNum); // 3.3333333333333335
		  
		System.out.println(ch); // 'A'
		System.out.println((int)ch); // 65
		System.out.println(ch + iNum1 ); // 75
		System.out.println((char)(ch + iNum1)); // 'K'
			
		
	}

}