일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 싱글턴
- wrapper
- unboxing
- 제네릭
- dependency
- 박싱
- 내장객체
- Jenkins
- 콜렉션
- 클래스
- boxing
- 스프링
- 루프
- Scanner
- start.spring.io
- maven
- 인텔리제이
- 언박싱
- 제너릭
- bootstrap
- Java
- suvlet
- 무한
- 싱글톤
- 컬렉션
- Short
- https://start.spring.io
- 자동형변환
- 빌드
- 메소드
- Today
- Total
Developer Gonie
[1주차] 6. 자바에서 데이터 타입 관련 틀리기 딱 좋은 문제* 본문
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));
'K-DigitalTraining 강의 > 1. Java' 카테고리의 다른 글
[1주차] 8. 변수의 이름으로 사용하면 안되는 예약어 (0) | 2022.05.18 |
---|---|
[1주차] 7. 자동형변환 & 강제형변환 예시 (0) | 2022.05.18 |
[1주차] 5. int, double, float, boolean, char, String 타입 변수 선언하기 (0) | 2022.05.18 |
[1주차] 4. 기본 자료형(type, 타입) (0) | 2022.05.17 |
[1주차] 3. 컴파일, 실행 순서 (0) | 2022.05.17 |