육식하는야채의 개발일지
article thumbnail
Published 2023. 4. 2. 04:01
JAVA) 타입 변환 Java/혼공자

자동 타입 변환은 말 그대로 자동으로 타입 변환이 일어나는 것을 말한다.

자동 타입 변환은 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생한다.

byte < short < char < int < long < float < double

 

정수 타입이 실수 타입으로 저장될 경우에는 무조건 자동 타입 변환이 일어난다. 

 

char 타입보다 허용 범위가 작은 byte 타입은 char 타입으로 자동 타입 변환될 수 없다.

char 타입의 허용 범위는 음수를 포함하지 않는데 byte 타입은 음수를 포함하기 때문이다.

package chapter2_3;

public class PromotionExample {
    public static void main(String[] args) {

        //자동 타입 변환
        byte byteValue = 10;
        int intValue = byteValue; // byte에서 int로
        System.out.println("intValue : " + intValue);


        char charValue = '가';
        intValue = charValue; // char 에서 int로
        System.out.println("가의 유니코드 : " + intValue);

        intValue = 50;
        long longValue = intValue; // int 에서 long로
        System.out.println("LongValue: " + longValue);

        longValue = 100;
        float floatValue = longValue; // long 에서 float로
        System.out.println("floatValue: " + floatValue);

        floatValue = 100.5f;
        double doubleValue = floatValue; // float 에서 double로
        System.out.println("doubleValue: " + doubleValue);
    }
}
/*
실행결과
intValue: 10;
가의 유니코드: 44032
longValue: 50
flatValue: 100.0
doubleValue: 100.5
*/

 

강제 타입 변환

 

큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 타입 변환될 수 없다. 

하지만 강제로 타입을 변환 시켜서 작은 허용 범위 타입으로 나누어 저장할 수 있다.

 

왜 강제로 타입을 변환하는가?

int에서 char로 타입 변환을 하면 문자를 출력할 수 있다.

 

double/float에서 int로 변환하면 소수점 이하 부분은 버리고 정수 부분만 저장할 수 있다.

package chapter2_3;

public class CastingExample {
    //강제 타입 변환
    public static void main(String[] args) {
        int intValue = 44032;
        char charValue = (char) intValue; int에서 char로
        System.out.println(charValue);

        long longValue = 500;
        intValue = (int) longValue; // long에서 int로
        System.out.println(intValue);

        double doubleValue = 3.14;
        intValue = (int) doubleValue; // double에서 int로
        System.out.println(intValue);
    }
}
/* 
실행결과
가
500
3
*/

 

정수 연산에서의 자동 타입 변환

package chapter2_3;

public class ByteOpreationExample {
    // 정수 타입의 연산
    public static void main(String[] args) {
        byte result1 = 10 + 20;
        System.out.println(result1);

        byte x = 10;
        byte y = 20;
        int result2 = x + y; // 저장되는 타입이 int이기 때문에 x,y는 byte에서 int로 변환된다.
        System.out.println(result2); 
    }
}
/*
실행 결과
30
30
*/
package chapter2_3;

public class LongOperationExample {
    public static void main(String[] args) {
        byte value1 = 10;
        int value2 = 100;
        long value3 = 1000L;
        long result = value1 + value2 + value3; 
        System.out.println(result);
    }
}
/* 
실행결과
1110
*/

 

실수 연산에서의 자동 타입 변환 

 

소문자 f 또는 대문자 F가 없는 실수 리터럴을 double타입으로 해석하기 때문에 double 타입 변수에 저장해야 한다.

 

1에서 2를 나누면 0.5가 된다.

하지만 아래의 코드는 그렇지 않을수도 있다는 결과를 보여준다.

package chapter2_3;

public class divide1 {
    public static void main(String[] args) {
        int x = 1;
        int y = 2;
//        double result = x / y;
//        System.out.println(result);
        // 위의 코드에서는 0.5가 아닌 0.0이 나온다.
        double result = (double) x / (double) y;
        System.out.println(result);
        // 0.5가 나온다.
    }
}

 

package chapter2_3;

public class OperationsPromotionExample {
    // 연산식에서 자동 타입 변환
    public static void main(String[] args) {
        byte byteValue1 = 10;
        byte byteValue2 = 20;
        // byte byteValue3 = byteValue1 + byteValue2; 컴파일 에러가 뜬다.
        int intValue1 = byteValue1 + byteValue2;
        System.out.println(intValue1);

        char charValue1 = 'A';
        char charValue2 = 1;
//        char charValue3 = charValue1 + charValue2; 컴파일 에러가 뜬다.
        int intValue2 = charValue1 + charValue2;
        System.out.println("유니코드=" + intValue2);
        System.out.println("출력문자=" + (char) intValue2);

        int intValue3 = 10;
        int intValue4 = intValue3/4;
        System.out.println(intValue4);

        int intValue5 = 10;
//        int intValue6 = 10 / 4.0; 컴파일 에러가 뜬다.
        double doubleValue = intValue5 / 4.0;
        System.out.println(doubleValue);

        int x = 1;
        int y = 2;
        double result = (double) x / y;
        System.out.println(result);
    }
}
/* 실행결과
30
유니코드=66
출력문자=B
2
2.5
0.5
*/

 

+ 연산에서의 문자열 자동 타입 변환

 

자바에서 + 연산잦는두 가지 기능을 가지고 있다.

피연산자가 모두 숫자일 경우에는 덧셈 연산을

피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 수행한다.

package chapter2_3;

public class StringConcatExample {
    public static void main(String[] args) {
        //숫자연산
        int value = 10 + 2 + 8;
        System.out.println("value: " + value);

        //문자열 결합 연산
        String str1 = 10 + 2 + "8";
        System.out.println("str1: " + str1);

        String str2 = 10 + "2" + 8;
        System.out.println("str2: " + str2);

        String str3 = "10" + 2 + 8;
        System.out.println("str3: " + str3);

        String str4 = "10" + (2+8);
        System.out.println("str4: " + str4);
    }
}
/* 실행결과
value: 20
str1: 128
str2: 1028
str3: 1028
str4: 1010
*/

 

문자열을 기본 타입으로 강제 타입 변환

package chapter2_3;

public class PrmitiveAndStringConverstionExample {
    public static void main(String[] args) {
        int value1 = Integer.parseInt("10"); // 문자열 10을 int로
        double value2 = Double.parseDouble("3.14"); // 3.14문자열을 double로
        boolean value3 = Boolean.parseBoolean("true"); // boolean value3 = true라고 적으면 된다.

        System.out.println("value1: " + value1);
        System.out.println("value2: " + value2);
        System.out.println("value3: " + value3);

        String str1 = String.valueOf(10);
        String str2 = String.valueOf(3.14);
        String str3 = String.valueOf(true);

        System.out.println("str1: " + str1);
        System.out.println("str2: " + str2);
        System.out.println("str3: " + str3);
    }
}
/* 실행결과
value1: 10
value2: 3.14
value3: true
str1: 10
str2: 3.14
str3: true
*/

 

확인문제

 

1. 자동 타입 변환에 대한 내용이다. 컴파일 에러가 발생하는 것은 무엇인가?

byte byteValue = 10;
char charValue = 'A';

1. int intValue = byteValue;

2.int intValue = charValue;

3.short shortValue = charValue; 

4.double doubleValue = byteValue;

 

char 타입의 양의 허용범위가 short 타입보다 더 크다.

 

2. 강제 타입 변환에 대한 내용이다. 컴파일 에러가 발생하는 것은 무엇인가?

int intValue = 10;
char charValue = 'A';
double doubleValue = 5.7;
String strValue = "A";

1. double var = (double) intValue;

2. byte var = (byte) intValue;

3. int var = (int) doubleValue;

4. char var = (char) strValue;

문자열을 char타입으로 변환할 수 없다.

 

3. 연산식에서의 타입 변환에 대한 내용이다. 컴파일 에러가 발생하는 것은 무엇인가?

byte byteValue = 10;
float floatValue = 2.5F;
double doubleValue = 2.5;

1. byte result = byteValue + byteValue;

2. int result = 5 + byteValue;

3. float result = 5 + floatValue;

4. double result = 5 + doubleValue;

1번의 연산 결과는 int 타입이다.

 

4. 다음 코드에서 컴파일 에러가 발생하는 위치와 이유를 설명하시오.

short s1 = 1;
short s2 = 2;
int i1 = 3;
int i2 = 4;
short result = s1 + s2; // 저장된 수가 int 타입으로 변환된다.
int result = i1 + i2;
s1 + s2 의 연산 결과는 int이다.

 

5. 알파벳 a의 유니코드는 97이고 b의 유니코드는 98이다. 따라서 a의 유니코드에 1을 더하면 b의 유니코드가 된다.

다음 코드에서 컴파일 에러가 발생할 때 어떻게 수정해야 하는가?

char c1 = 'a';
char c2 = c1 + 1;
System.out.println(c2);
문자열 + 정수 타입이기 때문에 컴파일 에러가 발생한다. 연산의 결과를 char 타입으로 강제 타입 변환해야 한다.
char c2 = (char)(c1 + 1);

 

6. 다음 코드의 실행 결과는?

int x = 5;
int y = 2;
int result = x / y;
System.out.println(result);
2

 

7. 위의 코드에서 2.5가 나오게 하려면 어떻게 수정하는가?

int x = 5;
int y = 2;
double result = (double)x / (double)y; // int를 double로 변경하고 인수를 double로 강제 타입 변환한다.
System.out.println(result);

 

8. 두 실수를 덧셈 연산하고 소수점 이하 자리르 버리고 싶을 떄 코드를 작성하시오

double var1 = 3.5;
double var2 = 2.7;
int result = (int)(var1 + var2);

9. result 변수에 9 가 저장되도록 코드를 작성하시오

public class test {
    public static void main(String[] args) {
        long var1 = 2L;
        float var2 = 1.8f;
        double var3 = 2.5;
        String var4 = "3.9";
        int result = (int) var1 + (int)(var2 + var3 )+ (int)Double.parseDouble(var4);
        System.out.println(result);
    }
}

10. 다음 코드를 출력했을 때 실행 결과는?

public class test {
    public static void main(String[] args) {
        String str1 = 2 + 3 + "";
        String str2 = 2 + "" + 3;
        String str3 = "" + 2 + 3;
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }
}
5
23
23

11. 문자열을 기본 타입으로 변환하려 할 때 알맞은 코드를 작성하시오

byte value = 1번 ("10");
int value = 2번 ("1000");
float value = 3번 ("20.5");
double value = 4번 ("3.14159");

 

public class test {
    public static void main(String[] args) {
       byte value = Byte.parseByte("10");
       int value1 = Integer.parseInt("1000");
       float value2 = Float.parseFloat("20.5");
       double value3 = Double.parseDouble("3.14159");
    }
}

 

'Java > 혼공자' 카테고리의 다른 글

JAVA) 변수와 시스템 입출력  (0) 2023.04.02
JAVA) 기본 타입  (0) 2023.04.01
JAVA) 변수  (0) 2023.04.01
profile

육식하는야채의 개발일지

@육식하는야채

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!