인프런 커뮤니티 질문&답변

hw h님의 프로필 이미지
hw h

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

프로젝션(SELECT)

스칼라타입 형변환 질문드립니다

작성

·

363

·

수정됨

0

기본적인 개념같아서 구글링도 해봤는데 object 와 object[] 배열간의 형변환에 대한 내용이 안보여서 질문드립니다.

 

다름이 아니라

Object o = resultList.get();

Object[] result = (Object[])0;

에서

 

  1. 왜 Object 타입에서 Object[] 타입으로 형변환을 해야하는지, 그냥 o[0], o[1] ... 로 쓰면 왜 컴파일 오류가 나는지 궁금합니다.

  2. Object 타입에서 어떻게 Object[] 타입으로 형변환이 가능한지 궁금합니다. Obect[] 배열은 Object가 여러개 포함된 배열 아닌가요?.. 아니면 Object 타입이 Object[] 타입까지도 포함한 포괄적인 개념이라 위처럼 형변환이 가능한 건가요?

     

기본적인 내용같은데 개념이 잘 이해가 안가서 질문드립니다 ㅠㅠ

답변 1

4

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. hw h님

ObjectObject[]는 서로 다른 타입입니다. Object는 단일 객체를 나타내며, Object[]는 객체 배열을 나타냅니다. 이 두 타입 간의 형변환을 이해하려면 Java의 상속 구조와 형변환 규칙에 대해 이해해야 합니다.

Java에서 모든 클래스는 기본적으로 Object 클래스를 상속하고 있습니다. 이 말은 Object 클래스가 모든 클래스의 최상위 클래스라는 뜻입니다. 그렇기 때문에 어떤 객체든 Object 타입으로 참조할 수 있습니다. 그러나 배열 타입은 조금 다르게 작동합니다.

배열 타입은 자바에서 특별한 경우로 취급되며, 모든 배열은 기본적으로 Object를 상속합니다. 예를 들어, Object[], String[], int[] 등 모든 배열 타입은 Object를 상속합니다. 따라서 배열 객체를 Object 타입으로 참조할 수 있습니다.

그러나 Object 타입으로 배열을 참조할 때 배열의 원소에 접근하려면 명시적으로 형변환을 해야 합니다. 이유는 자바가 배열 타입을 모르기 때문에 인덱싱 연산자를 사용할 수 없기 때문입니다. 그래서 Object에서 Object[]로 형변환을 해서 인덱싱 연산자를 사용할 수 있게 해야 합니다.

예를 들어:

Object o = new Object[]{"Hello", "World"}; // Object[]를 Object로 참조
Object[] result = (Object[]) o; // 형변환을 통해 Object[]로 참조
System.out.println(result[0]); // 이제 인덱싱이 가능

하지만 이런 형변환은 항상 안전한 것은 아닙니다. Object 타입의 변수가 실제로 Object[] 타입의 객체를 참조하고 있지 않은 경우, 형변환을 시도하면 ClassCastException이 발생합니다. 이를 피하기 위해서는 instanceof 연산자를 사용하여 형변환 전에 객체가 원하는 배열 타입인지 확인해야 합니다.

요약하자면, Object는 모든 클래스의 최상위 클래스이기 때문에 어떤 객체든 Object 타입으로 참조할 수 있습니다. 그러나 배열 타입의 객체를 Object로 참조할 때 배열의 원소에 접근하려면 명시적으로 형변환을 해야 합니다. 이는 자바가 배열 타입을 모르기 때문에 인덱싱 연산자를 사용할 수 없기 때문입니다.

감사합니다.

hw h님의 프로필 이미지
hw h
질문자

자세한 답변 감사합니다! 검색을 해봐도 원하는 답변이 안보여서 답답했는데 시원하게 이해됐습니다!

hw h님의 프로필 이미지
hw h

작성한 질문수

질문하기