Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 배열 할당의 핵심 원리와 흥미로운 사실들

Java에서 배열에 값을 할당하는 방식에는 몇 가지 중요한 규칙과 특징이 있습니다. 이 글에서는 실제 동작하는 예제 코드와 함께 배열 할당과 관련된 핵심 사실들을 살펴보겠습니다.

1. 객체 타입 배열에는 하위 클래스 객체도 저장할 수 있다

객체 타입의 배열을 생성할 때, 배열 내부에 들어갈 요소는 배열이 선언된 타입 그대로일 수도 있고, 해당 타입의 하위 클래스(자식 클래스) 객체일 수도 있습니다. 이는 다형성(polymorphism) 덕분에 가능한 것으로, 상위 클래스 타입의 참조 변수가 하위 클래스 객체를 가리킬 수 있는 Java의 기본 원리가 배열에도 그대로 적용되기 때문입니다.

아래 예제에서는 Number 타입의 배열에 IntegerDouble 객체를 함께 저장합니다. 두 클래스 모두 Number의 하위 클래스이기 때문에 아무 문제 없이 할당됩니다.

예제 코드

public class Demo{
    public static void main(String[] args){
        Number[] my_val = new Number[3];
        my_val[0] = new Integer(91);
        my_val[1] = new Double(65.963);
        my_val[2] = new Double(45.7965);
        System.out.println(my_val[0]);
        System.out.println(my_val[1]);
        System.out.println(my_val[2]);
    }
}

실행 결과

91
65.963
45.7965

Demo 클래스의 main 메서드 안에서 Number 타입의 배열 인스턴스를 생성한 뒤, 서로 다른 하위 클래스 객체(Integer, Double)를 요소로 추가합니다. 이후 각 요소가 콘솔에 하나씩 출력됩니다.

2. 기본형(primitive) 배열은 암시적 형 변환이 가능한 타입만 허용된다

기본형 타입의 배열을 다룰 때는 조금 다른 규칙이 적용됩니다. 배열 요소는 배열이 선언된 타입으로 암시적으로 형 변환(widening conversion)될 수 있는 값이어야 합니다. 예를 들어 int 배열에는 char, byte, short 같은 더 작은 범위의 타입 값을 자동으로 저장할 수 있습니다.

반면, 암시적 형 변환이 불가능한 서로 다른 데이터 타입을 사용하면 컴파일 시점 오류(compile time error)가 발생합니다.

예제 코드

public class Demo{
    public static void main(String[] args){
        int[] my_arr = new int[4];
        my_arr[0] = 65;
        my_arr[1] = 'S';
        byte my_byte = 11;
        my_arr[2] = my_byte;
        my_arr[3] = 34;
        System.out.println("배열에 저장된 값 :");
        System.out.println(my_arr[0] + my_arr[1] + my_arr[2] + my_arr[3]);
    }
}

실행 결과

배열에 저장된 값 :
193

Demo 클래스의 main 메서드 안에서 int 타입 배열 인스턴스를 생성하고, int, char(문자 'S'는 유니코드 값 83), byte 등 서로 다른 타입의 값들을 요소로 추가합니다. 모든 값은 저장되는 순간 int 타입으로 자동 변환되며, 최종적으로 네 요소의 합인 193(65 + 83 + 11 + 34)이 콘솔에 출력됩니다.

정리

  • 객체 타입 배열: 선언된 타입 또는 그 하위 클래스의 객체를 저장할 수 있습니다.
  • 기본형 배열: 선언된 타입으로 암시적 확장 변환이 가능한 값만 저장할 수 있으며, 호환되지 않는 타입은 컴파일 오류를 일으킵니다.

이 두 가지 규칙만 기억하면 Java에서 배열 할당 시 발생할 수 있는 대부분의 혼란을 피하고, 더 안전하고 명확한 코드를 작성할 수 있습니다.