자바(JAVA)

자바 - 형 변환(Type Conversion)

BlueNoa 2023. 8. 30. 21:33
728x90
반응형

<목차>

 

 

반응형

• 형 변환(Type Conversion)

형 변환은 하나의 데이터의 유형을 다른 데이터 유형으로 변환하는 것을 말한다. 형 변환은 데이터의 유형이 서로 호환 가능할 때만 사용이 가능하다. 형 변환은 크게 두 가지 유형으로 나뉜다. 암시적 형 변환(implicit type conversion)명시적 형 변환(explicit type conversion)이다.

 

1. 암시적 형 변환(자동 형 변환, Implicit Type Conversion)

데이터 타입을 자동으로 변환하는 것을 뜻한다. 다시 말해서 컴파일러나 인터프리터가 프로그램 실행 중에 자동으로 타입 변환을 수행하는 것을 말한다. 하지만 때로는 의도치 않은 결과를 초래할 수 있다.

 

<요약>

- 더 작은 데이터 유형에서 더 큰 데이터 유형으로 변환되는 것을 의미한다.

- 데이터 손실이 없거나 최소화된다. 대표적인 예로 정수를 부동 소수점 수로 변환할 때 소수점 이하 자리가 추가될 수 있다.

- 크기에 따른 자료형 계층 구조에 따라 발생한다.

 

2. 명시적 형 변환(강제 형 변환, Explicit Type Conversion, Casting)

프로그래머가 직접 데이터 타입을 변환하는 것을 의미한다. 프로그래밍 언어에서 제공하는 형 변환 연산자나 함수를 사용하여 데이터를 다른 데이터 타입으로 변환하는 것을 말한다.

프로그래머가 직접 변환을 하기 때문에 데이터 손실이나 예기치 않은 오류에 대한 주의가 필요하다. 잘못된 형 변환은 에러를 유발한다.

 

<요약>

- 더 큰 데이터 유형에서 더 작은 데이터 유형으로 변환하거나, 데이터 유형을 명시적으로 지정하여 변환

- 데이터 손실이 발생할 수 있다. 예를 들어 실수를 정수로 변환할 때 소수점 이하 값이 버려지는 것

- 형 변환 연산자를 사용하여 수행한다.

 

<예시>

public class sample {

    public static void main (String[] args) {
        System.out.println("암시적 형 변환(자동 형 변환)");
        // int -> double
        int a = 10;
        double doubleValue = a;

        // 작은 데이터 -> 큰 데이터 유형
        byte b = 5;
        int intValue1 = b;

        // 문자<char>에서 정수(int)
        char c = 'A';
        int intValue2 = c; // 유니코드 값으로 반환
        System.out.println(doubleValue + ", " + intValue1 + ", " + intValue2);

        System.out.println("명시적 형 변환(강제 형 변환)");
        // 큰 데이터 -> 작은 데이터 유형
        double d = 3.14;
        int intValue3 = (int) d;

        // 정수 -> 바이트(byte)
        int e = 200;
        byte bytValue = (byte) e; // 범위를 벗어나면 데이터 손실

        // 문자열(String)에서 정수(int)
        String f = "123";
        int intValue4 = Integer.parseInt(f);

        // 정수 -> 문자(char)
        int g = 63;
        char charValue = (char) g; // 유니코드 값으로 '?' 출력

        // 정수에서 부동 소수점 수로
        int h = 13;
        float floatValue = (float) h;

        // 정수(int)를 문자열(String)로
        int j = 123;
        String strValue1 = "" + j; // 정수 앞에 빈 문자열을 더해주면 문자열이 된다.
        String strValue2 = String.valueOf(j);
        String strValue3 = Integer.toString(j);


        System.out.println(intValue3 + " " + bytValue + " " + intValue4 + " " + charValue + " " + floatValue);
        System.out.println("문자열 변환 : " + strValue1 + " " + strValue2 + " " + strValue3);

    }
}

<결과>

암시적 형 변환(자동 형 변환)
10.0, 5, 65
명시적 형 변환(강제 형 변환)
3 -56 123 ? 13.0
문자열 변환 : 123 123 123
728x90

• 추가 내용(final과 다양한 형 변환)

1. Final

'final'은 변수, 메서드, 클래스에 적용되는 키워드로, 해당 요소가 변경되지 않도록 한다. 한 번 적용된 요소는 변경할 수 없으며, 값이나 동작이 고정된다.

 

<예시>

public class sample {
    public static void main (String[] args) {
        // final 변수
        final int num = 3; // num은 상수로 값 변경 불가

        // final 메서드
        // 해당 메서드는 하위 클래스에서 오버라이드(재정의) 불가
        class fm {
            final void printMessage() {
                System.out.println("final method");
            }
        }

        // final 클래스
        // 해당 클래스는 상속을 금지한다. 즉, 다른 클래스에서 사용할 수 없다.
        final class finalClass {
            // 내용 생략...
        }

        // list의 경우에도 final로 재할당 못하게 막을 수 있다.
        // 다만 add, remove 가능하기 때문에 "final List<?> a = List.of("a", "b");"라고 하면 할당, 변경이 금지된다.

    }
}

 

 

2. 형 변환과 관련된 키워드

(1) 캐스팅 연산자

'(타입)' 형태로 사용하는 명시적 형 변환(강제, 캐스팅)을 위해 사용되는 연산자이다. 데이터를 원하는 타입으로 변환한다.

형 변환의 예시에서 다룬 적 있다.

 

(2) instanceof 연산자

객체의 타입을 확인하기 위한 연산자, 특정 타입에 해당하는지 여부를 판단할 수 있다.

if (obj instanceof MyClass) {
	MyClass myObj = (MyClass) obj; // 객체를 MyClass로 형 변환했다.
}

 

(3) auto unboxing 및 auto boxing

워닛 타입과 래퍼 클래스 간의 자동 변환 기능을 제공한다.

[참고] - https://bluenoa.tistory.com/78#text4

 

자바 - 문자

문자열 문자열 포매팅 포맷 코드 원시 자료형 • 문자열 자바에서 문자열(String)은 텍스트 데이터를 나타내는 데 사용되는 자료형이다. 문자열은 여러 개의 문자들로 구성되거나 단일 문자일 수

bluenoa.tistory.com

Integer integerObj = 10; // auto boxing
int intValue = integerObj; // auto unboxing

 

(4) 타입 캐스팅 메서드

래퍼 클래스들은 데이터를 원시 타입으로 변환하는 메서드를 제공한다.

Integer integerObj = 20;
int intVlaue = integerObj.intValue(); // Integer -> int 변환

 

(5) Arrays 클래스의 변환 메서드

import java.util.Arrays;

public class sample {
    public static void main (String[] args) {
        int[] intArray = {10, 22, 48};
        
        // 방법1
        double[] doubleArray = Arrays.stream(intArray).asDoubleStream().toArray();
        System.out.println(Arrays.toString(doubleArray));
		
        // 방법2
        double[] doubleArray2 = new double[3];
        for (int i=0; i < intArray.length; i++) {
            doubleArray2[i] = intArray[i];
        }
        System.out.println(Arrays.toString(doubleArray2));


    }
}

 

 

 

 
728x90
반응형