작성
·
77
·
수정됨
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에 질문 내용을 남겨주세요.
isEmpty() 메서드 관련해서 제네릭은 실행 시점에 타입이 정해지는데 단순 null 인지만 확인하는것이 아닌 기본형,참조형 각각의 타입별로 비어있는지를 구현해야 하지 않나 싶습니다.
아래와 같이 test를 해보면 잘못된 값이 나옵니다.
public class ContainerTest {
public static void main(String[] args) {
Container<Integer> integerContainer = new Container<>();
System.out.println("빈값 확인1: " + integerContainer.isEmpty());
}
}
답변 2
0
안녕하세요. 큐펀치님
Container<Integer>의 경우, item 멤버 변수의 타입은 제네릭 타입 T가 Integer로 결정되어 Integer 타입이 됩니다. Integer는 기본형 int를 감싸는 래퍼 클래스(Wrapper class)이며, 이는 기본형이 아닌 참조형에 해당합니다. 참조형 변수는 null 값을 가질 수 있으며, 데이터를 '없음'이라는 상태로 표현할 필요가 있을 때 유용합니다.
따라서, new Container<Integer>() 코드가 실행될 때, Container 클래스의 item 멤버 변수는 참조형인 Integer 타입이며, 명시적으로 값이 설정되지 않았으므로 기본값인 null로 자동 초기화됩니다.
그 결과, integerContainer.isEmpty()를 호출하면 item == null 조건을 확인하게 되고, item이 null이므로 이 조건은 true가 됩니다. 따라서 테스트 결과는 빈값 확인1: true가 되어야 합니다.
결론적으로, Container<T> 클래스에서 item 필드는 T 타입으로 선언되어 있으며, 제네릭 타입 T는 참조형(또는 래퍼 클래스)으로 지정될 때 해당 필드는 참조형 멤버 변수로서 null로 자동 초기화됩니다. 따라서 isEmpty() 메서드가 item == null을 체크하는 것만으로도 해당 Container가 객체를 가지고 있지 않은 상태('비어 있음')를 올바르게 판단할 수 있습니다. 타입별로 비어 있는 상태를 다르게 구현할 필요는 없습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 큐펀치님.
제네릭 타입을 사용하여 isEmpty()
메서드를 구현할 때, 타입에 따라 비어있는지를 확인하는 방법에 대해 궁금하신 것 같습니다. 제네릭은 컴파일 타임에 타입을 확정합니다. 즉, 실행 시점에 타입을 가변적으로 처리할 수 있는 것이 아니라, 컴파일 시 타입 안정성을 보장받을 수 있습니다. 그렇기 때문에, isEmpty()
메서드는 컨테이너가 비어있는지를 판단하기 위해 null
여부를 확인하는 것으로 충분합니다.
public class Container<T> {
private T value;
public boolean isEmpty() {
return value == null;
}
}
public class ContainerTest {
public static void main(String[] args) {
Container<Integer> integerContainer = new Container<>();
System.out.println("빈값 확인1: " + integerContainer.isEmpty());
}
}
위 코드로 isEmpty()
메서드를 구현하면, value
가 null
인 경우에는 true를 반환하고, 아닌 경우에는 false를 반환할 것입니다. 이 테스트의 결과로 “빈값 확인1: true”가 출력되야 합니다. 이미지에 보여진 결과는 오타나 다른 문제가 있을 가능성이 있으며, value
의 초기 상태를 잘 확인해 주셔야 합니다.
관련된 질문이나 유사한 답변 URL도 도움이 될 수 있으니, 아래를 참고해 주세요:
제네릭을 사용하여 타입 안정성과 코드 재사용성을 높일 수 있습니다. 타입별 처리는 제네릭 타입에 따라 자연스럽게 이루어지며, 각 타입에 대한 세부적인 동작이 필요하다면 특정 타입의 메서드를 추가 정의하시는 것도 좋은 방법입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.