Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[1주차] 6. 자바에서 데이터 타입 관련 틀리기 딱 좋은 문제* 본문

K-DigitalTraining 강의/1. Java

[1주차] 6. 자바에서 데이터 타입 관련 틀리기 딱 좋은 문제*

이대곤 2022. 5. 18. 09:36

Q. 첫번째 문제, 아래에서 뭐가 문제인지 찾고 올바른 수정 방향을 제시하시오

public static void main(String args[]) {
	int x = 1000000;
	int y = 2000000;
		
	long z = x * y; 
    
	/*
	쉽게 생각해서 long 정도면 두 값의 곱을 받을 수 있겠다 생각하겠지만,
	x * y 연산은 int 끼리의 연산이기 때문에 결과도 int로 일단 나옴.
	그러나 int의 표현범위인 +-20억을 훌쩍 넘어가서 int의 표현범위를 넘어서는 오버플로우 발생.
	*/
    
	System.out.print(z);
}

실행결과

- 컴파일 오류는 안났지만, 상식적인 결과가 아닌 상태

-1454759936

첫번째 문제에 대한 올바른 해답

문제해결 첫번째 방법

x, y 데이터 타입을 long 타입으로 선언해주어 x*y 연산 결과가 long 으로 나오게끔 하면 문제가 해결됨.

long x = 1000000;
long y = 2000000;
long z = x * y;

 

문제해결 두번째 방법

long z = (long)x * y;  -> 강제형변환으로 long과 int를 연산하도록하면 그 결과는 long으로 나오게 되어 문제가 해결됨. 

long z = (long)x * y;

Q. 두번째 문제, 아래에서 뭐가 문제인지 찾고 올바른 수정 방향을 제시하시오

import java.util.Scanner;

public class Ex05_입력문 {
	public static void main(String args[]) {
		
		int kor, eng, math;
		
		kor = 70;
		eng = 63;
		math = 82;
		
		int total = kor + eng + math;
        
		double avg = total / 3; 
		/*
		뭔가 나누기를 했으니 소수점으로 결과가 나올거라고 예상하기 쉽지만,
		total / 3 연산도 엄연히 int 끼리의 연산이기 때문에 결과도 int로 일단 나옴.
		그러면 소수점은 날라가고 반올림된 값이 나온다는 것을 예상할 수 있어야 한다.
		*/ 
		
		System.out.println("국어\t영어\t수학");
		System.out.println(kor+"\t"+eng+"\t"+math);
		System.out.println("총합:" + total);
		System.out.printf("평균: %.2f", avg);
	}
}

실행결과

- 평균은 원래 정상적이라면 71.66666으로 나와야 하는 상황

국어	영어	수학
70	63	82
총합:215
평균: 71.00

두번째 문제에 대한 올바른 해답

문제해결 첫번째 방법

total의 데이터형을 int가 아닌 double 형으로 선언해준다면 문제가 있는 부분이 더이상 int 끼리의 연산이 아니어 문제 해결.

double total = kor + eng + math;

 

문제해결 두번째 방법

total을 강제 형변환 해줌으로써 더이상 int 끼리의 연산이 아니어 이제야 상식적인 결과를 얻을 수 있음. 

double avg = (double)total / 3; // 정수끼리의 연산은 결과도 정수라서 결과가 double로 나올 수 있도록

Q. 세번째 문제, 아래에서 뭐가 문제인지 찾고 올바른 수정 방향을 제시하시오

public class Ex03_실수형 {
	public static void main(String args[]) {
		float f1;
		f1 = 0.0123;
	}
}

실행결과

- 컴파일 에러

세번째 문제에 대한 올바른 해답

문제해결 방법

float는 4바이트인데, 실수만 입력하면 자동으로 타입이 double(8바이트)로 잡혀서 타입 미스매치 남.

큰 것을 작은것에 담을 수 없으므로 실수 뒤에 f 를 넣어줘야 오류가 안남. 

f1 = 0.0123f;

Q. 네번째 문제, 아래에서 뭐가 문제인지 찾고 올바른 수정 방향을 제시하시오

public class Ex03_실수형 {
	public static void main(String args[]) {
		int i1, i2;
		i1 = 7.8; // int는 4바이트인데, 실수는 자동으로 double(8byte)로 잡혀서 타입 미스매치 오류가 남, 큰거를 작은 타입에 넣으려고 하는거니까
		i2 = 7.8f;
	}
}

실행결과

- 컴파일 에러

네번째 문제에 대한 올바른 해답

문제해결 방법

실수만 입력하면 자동으로 타입이 double(8바이트)로 잡혀서 더 작은 4byte의 int 타입 변수에 담으려고 하면 오류남.

double형이나, float형을 int형으로 강제로 형 변환 해줘야 문제가 안생김. 큰 것을 작은것에 담을 수 없으므로.

int형은 float와 같이 4byte이지만, int < float

i1 = (int)7.8;
i2 = (int)7.8f;

 


Q. 다섯째 문제, 아래에서 뭐가 문제인지 찾고 올바른 수정 방향을 제시하시오

public class Ex02_01_산술 {
	public static void main(String[] args) {
		int num1 = 11;
		int num2 = 23;
		
		System.out.printf("%d/%d=%.2f", num1, num2, num1/num2);
		
	}
}

실행결과

- 컴파일 에러

다섯째 문제에 대한 올바른 해답

문제해결 방법

int 끼리의 연산은 결과도 int 이므로 원하는 결과가 아닌 다른게 가능해짐.

따라서 한 쪽을 실수형(double형)으로 변환해주면 연산의 결과도 double로 나오므로 문제가 해결됨.

System.out.printf("%d/%d=%.2f", num1, num2, (double)num1/num2);

Q. 여섯번째 문제, 아래에서 뭐가 문제인지 찾고 올바른 수정 방향을 제시하시오

import java.security.DomainCombiner;

public class Ex05_03_메서드 {
	public static void main(String[] args) { // main 메서드 정의

		add(3, 4);
	}

	static void add(int x, int y) {
		System.out.println("두 수의 합:" + x + y);  
	}
}

실행결과

두 수의 합:34

여섯번째 문제에 대한 올바른 해답

문제해결 방법

문제는 '+'도 나름 두 피연산자를 연산하는 것이기 때문에 문자열 + 문자열의 결과는 문자열이라서 결과가 이러한 것임. 따라서 숫자는 숫자끼리 먼저 연산하도록 괄호로 감싸줘야 상식적인 결과를 얻을 수 있다.

System.out.println("두 수의 합:" + (x + y));
Comments