본문 바로가기
Java

이것이 자바다 (세번째 정리) 2장 확인문제까지

by 자연송어 2021. 3. 7.

2.2 데이터 타입 (2)

short 타입

- 2byte 부호 있는 정수값 저장

- C언어와 타입호환을 위해 사용되며 비교적 자바에서는 잘 사용되지 않는 타입

 

int타입

- 4byte 부호 있는 정수값 저장

 

* 변수에 어떤 진수로 저장을 하더라도 동일한 값이 이진수로 변환되어 저장됨.

 

long타입

- 8byte 부호 있는 정수값 저장

 

값의 표현

- int 범위의 리터럴은 상관없음.

- int 범위를 초과하는 리터럴은 반드시 L(대문자) 또는 i(소문자)를 붙여야 된다.

long var1 = 10;
long var2 = 20L;
//long var3 = 1000000000; //컴파일 에러 4바이트로 표현
long var3 = 1000000000L; //8바이트로 해석할 수 있도록 마지막에 L 사용
package sec02.exam04_long;

public class LongExample {

	public static void main(String[] args) {
		
		long var1 = 10;
		long var2 = 20L;
		
		//long var3 = 10000000000; 컴파일에러 발생
		
		long var4 = 10000000000L;
		
		System.out.println(var1);
		System.out.println(var2);
		System.out.println(var4);
	}
/* 값은 
10
20
10000000000 */

 

실수타입

- 부동 소수점 방식으로 저장 

- 동일한 메모리 크기를 가지는 int와 long 보다 더 큰 수를 저장할 수 있음.

- 실수 리터럴의 기본 타입은 double이다.

- float 타입으로 실수를 표현하고 싶을 때는 뒤에 F를 붙인다.

- 정수 리터럴에 10의 지수를 나타내는 E 또는 e가 포함되면 실수 타입으로 저장해야 한다.

 

	public static void main(String[] args) {
		
		//실수값 저장
		double var1 = 3.14;
		//float var2 = 3.14;
		float var3 = 3.14F;
		
		//정밀도 검사
		double var4 = 0.1234567890123456789;
		float var5 = 0.1234567890123456789F;
		
				System.out.println(var4);
		System.out.println(var5);
		
		/* 값은
		0.12345678901234568
		0.12345679 

		float은 23비트까지 저장
		double은 52비트까지 저장 */
		
		//e사용하기
		int var6 = 3000000;
		double var7 = 3e6; //3백만, 부동소수점 방식인 실수타입
		float var8 = 3e6F; //float타입이라서 뒤에 F 붙임.
		double var9 = 2e-3;
		
		System.out.println(var7);
		System.out.println(var8);
		System.out.println(var9);
	}
}
		boolean stop = false;
		
		if(stop) {
			System.out.println("중지합니다.");
		} else {
			 System.out.println("시작합니다.");
		}
	}

}

타입 변환

- 데이터 타입을 다른 타입으로 변환하는 것

 

종류

- 자동(묵시적) 타입 변환 : Promotion
- 강제(명시적) 타입 변환 : Casting   //코드에 의해서 타입 변환

 

자동 타입 변환

- 프로그램 실행 도중에 작은 타입은 큰 타입으로 자동 타입 변환됨.

 

- long(8)이 float(4) 보다 물리적인 바이트수는 더 크지만 float이 더 표현가능한 수가 많아서

long(작은타입)이 float(큰타입)으로 변환될 수 있다.

 

예외) char타입은 음수값을 저장할 수 없어서 바이트나 숏으로 변환할 수 없음.

-> 하지만 char 타입이 양수인것으로 확신이 되면 강제로 변환할 수 있음.

 

		byte byteValue = 10;
		int intValue = byteValue;
		System.out.println(intValue); //값은 10, 바이트가 인트로 변환
		
		char charValue = '가';
		intValue = charValue;
		System.out.println(intValue); //값은 44032, char의 '가'가 인트로 변환되며 유니코드 44032 결고값 생성
		
		intValue = 500;
		long longValue = intValue;
		System.out.println(intValue); //값은 500, 인트가 롱 타입으로 변환, 손실되지 않고 500 
		
		intValue = 200;
		double doubleValue = intValue;
		System.out.println(doubleValue); //인트가 더블로 변환
		
		longValue = 10000000000L;
		float floatValue = longValue; //롱타입이 8바이트고 플롯이 4바이트지만 롱타입이 플롯으로 변환
		System.out.println(floatValue);
}
}

강제 타입 변환

- 큰 타입을 작은 타입 단위로 쪼개고 끝 한 부분만 작은 타입으로 강제적 변환

 

- 인트가 바이트로 변환될 때 마지막값만 나타내서 원래값이 보존되지 않음.

 

int intValue = 10;
byte byteValue = (byte)intValue; //결과값은 10 동일

long longValue = 300; //long->int 변환
int intvalue = (int)longValue; //intValue는 300이 그대로 저장

int intValue = 'A';
char charValue = (char)intValue;
System.out.println(charValue); 

//int는 4바이트, char는 2바이트, 4바이트를 2바이트로 저장은 말이안됨.
//A는 유니코드로 65번, 65번이 2바이트로 표현가능하기 때문에 그대로 저장가능

diuble doubleValue = 3.14; //double(8바이트) -> int(4바이트) 변환
int intValue = (int)doubleValue; //intValue는 실수를 정수 부분인 3만 저장

- 강제 타입이 되더라도 값은 보존이 되도록 하는 것이 중요.

 

if문을 통해 타입변환 전에 맞는지 확인 검사함. 자바에서는 기본 상수를 제공하고 있음 ↑

 

		//int intValue = 44032; //int는 4바이트, char는 2바이트
		//char charValue = intValue;
		
		int intValue = 44032; //int는 4바이트, char는 2바이트
		char charValue = (char) intValue; //강제변환
		System.out.println(charValue); //결과값은 '가'
		
		long longValue = 500; //long은 8바이트, int는 4바이트
		intValue = (int) longValue;
		System.out.println(intValue);
		
		double doubleValue = 3.14; //double은 실수타입, int는 정수타입
		intValue = (int) doubleValue;
		System.out.println(intValue); //결과값은 정수인 3
	}

}

 

2.3 타입변환(2)

/*		
		int i = 125; //i가 125면 125값 출력, 128이면 false
		
		if(i<-128 || i>127) {
			System.out.println("byte 타입으로 변환할 수 없습니다.");
			System.out.println("값을 다시 확인해 주세요.");
		} else {
		
		byte b = (byte) i; 
		System.out.println(b);
	}
	}

}*/
		
//검사코드 정석
		int i = 125; 
		
		if(i<Byte.MIN_VALUE || i>Byte.MAX_VALUE) { //검사코드. Byte는 클래스 타입이므로 첫자는 대문자로 입력
			System.out.println("byte 타입으로 변환할 수 없습니다.");
			System.out.println("값을 다시 확인해 주세요.");
		} else {
		
		byte b = (byte) i; 
		System.out.println(b);
	}
	}

}

32바이트를 float (23바이트)로 저장하면 가수 부분에 손실이 발생하여 정밀도 손실로 인해 다른 결과값이 나올 수 있음.

-> 32바이트를 double(52바이트)로 변환하여 저장하면 손실 발생이 안생김.

★정수를 실수로 변환할 때 float 말고 double을 통해 변환해야 해서 정밀도 손실을 발생하지 않도록 해야함.

				int num1 = 123456780;
		int num2 = 123456780;
		
		float num3= num2;
		num2 = (int) num3;
		
		int result = num1 - num2;
		System.out.println(result);
        // 결과값은 -4, float으로 변환했기 떄문 
        
        
        int num1 = 123456780;
		int num2 = 123456780;
		
		double num3= num2;
		num2 = (int) num3;
		
		int result = num1 - num2;
		System.out.println(result);
		// 결과값은 0, double로 변환했기 때문

 

★연산할 때는 무조건 int타입으로 변환 후 연산함. 

 

연산할 때 long 값이 있으면 무조건 long 타입으로 변환 후 연산함.

 

- 실수나 double 변수가 있을 때 상대 타입이 double로 변환되어 계산

- float은 모두 float 일경우에만? (다른 타입이 나올때는 어떻게 되는지 확인 필요!!!)

- float연산 시 정수는 float으로 연산

 

		byte byteValue1 = 10;
		byte byteValue2 = 20;
		
		//byte byteValue3 = byteValue1 + byteValue2;  바이트 연산은 인트로 저장되서 오류
		int intValue1 = byteValue1 + byteValue2;
		System.out.println(intValue1); // 결과값은 30
		
		char charValue1 = 'A';
		char charValue2 = 1;
		
		//char charValue3 = charValue1 + charValue2; 인트로 자동 변환됬기 때문에 오류
		int intValue2 = charValue1 + charValue2;
		System.out.println("유니코드=" + intValue2); 
		//결과값은 66, A가 유니코드로 65이기 떄문
		
		System.out.println("출력문자" + (char)intValue2); //결과값은 B
		
		int intValue3 = 10;
		int intValue4 = intValue3 / 4; 
		//2.5가 나와야 하지만 정수나누기 정수는 무조건 정수라서 소수점을 제외한2가 출력됨.
		System.out.println(intValue4); //결과값은 2
		
		int intValue5 = 10;
		//int intValue6 = 10 / 4.0; <- 실수리터럴(4.0)과 연산하면 모든 값을 double로 변환하여 계산
		double doubleValue1 = intValue5 / 4.0;
		System.out.println(doubleValue1); //값은 2.5

★기본중의 기본 외우자↑

 

- char타입은 2바이트, short타입도 2바이트로 크기는 같지만

char타입은 0부터 시작해서 65000대로 끝나는 양수인 반면, 

short타입은 음수부터 양수까지 포함하기 떄문에 양수가 65000보다 낮은 값까지 저장함.

그래서 변환 불가

 

문자열 변수는 char타입으로 변환할 수 없음.  참조타입이 기본타입으로 변환 불가능.

 

 

- char 타입은 따옴표 붙이기 불가능. 문자열타입은 따옴표 붙이기 가능.

- 실수타입은 float에 저장 불가능. 뒤에 f를 넣어야함.