66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결이펙티브 자바 완벽 공략 2부
아이템 28 타입 안전
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.아이템 28 마지막 요약에 제네릭은 불공변이고 타입 정보가 소거된다. 그 결과 배열은 런타임에는 타입 안전하지만 컴파일 타임에는 그렇지 않다. 제네릭은 반대다. 라고 적혀있는데 배열이 런타임에 타입 안전하다는게 이해가 잘 안됩니다. Object[] objectArray = new Long[1]; /* ArrayStoreException 발생 */ objectArray[0] = "타입이 달라 넣을 수 없음"; //ArrayStoreExcpetion위 코드 처럼 공변되면서 런타임에 에러가 나는데 저장 했을때 저장 시점에 에러를 반환하면 타입 안전하다고 하는건가요?public class Chooser<T> { private final T[] choiceArray; public Chooser(Collection choices) { choiceArray = (T[]) choices.toArray(); } public T choose() { return choiceArray[0]; } public static void main(String[] args) { Collection<Integer> choices = new ArrayList<>(); choices.add(1); choices.add(2); choices.add(3); Chooser<String> chooser = new Chooser<>(choices); System.out.println(chooser.choose()); //ClassCastException } } 제네릭은 저장 시점에는 잘못된 형식의 데이터가 들어갔는지 런타임에 검사 할 수 없기 때문에 런타임 시점에 안전하지 않다고 하는건가요?
- 해결됨이펙티브 자바 완벽 공략 2부
아이템19 - 구체 클래스가 표준 인터페이스를 구현하지 않았는데 상속을 금지하면 사용하기에 상당히 불편해진다.
안녕하세요 강사님! 이펙티브 자바 강의 재밌게 수강하고 있습니다. 항상 감사드립니다. 책의 내용 중 하나가 도저히 이해가 되지 않아 질문 드립니다![아이템19]"구체 클래스가 표준 인터페이스를 구현하지 않았는데 상속을 금지하면 사용하기에 상당히 불편해진다. 이런 클래스라도 상속을 꼭 허용해야겠다면 합당한 방법이 있다." 에서 "사용하기에 상당히 불편해진다." 가 무얼 뜻하는지 잘 모르겠습니다. 그리고 상속을 금지했는데, 허용한다? 라는 말도 잘 이해가 가지 않습니다!제가 이해하기로는 1. "구체 클래스가 표준 인터페이스를 구현하지 않았는데 상속을 금지하면 사용하기에 상당히 불편해진다. : 표준 인터페이스를 구현하지 않은 클래스는 내부 동작을 예측하기가 쉽지 않다. 또한 확장이나 변경이 제한적이다. 상속을 금지하게되면 더 제한적이게 된다.2. "이런 클래스라도 상속을 꼭 허용해야겠다면 합당한 방법이 있다." :위와 같이 제한적인 불편함이 싫다면 상속을 허용하고 내부메서드에서 자기의 재정의 가능 메서드를 호출하는 코드를 제거하는데, 그 중 하나의 방법이 'private 도우미 메서드' 방법을 사용하라.라는 뜻일까요? 맞다면 아래와 같은 상황일까요?1. 이전 릴리스에서는 표준 인터페이스를 구현하지 않고 상속도 금지한 구체클래스였다.2. 다음 릴리스때 이 구체클래스를 확장해야겠다고 판단했고, 상속을 허용하기로 했다.
- 미해결이펙티브 자바 완벽 공략 2부
다음 강의 질문
안녕하세요 강사님강의 너무 잘 듣고 있습니다.혹시 다음 이펙티브 자바 3편은 언제쯤 나올까요?다음 강의도 너무 기대돼서 여쭤봅니다.
- 미해결이펙티브 자바 완벽 공략 2부
아이템16, 조금 애매한 것 같습니다.
안녕하세요. 항상 좋은 강의 해주셔서 감사합니다.한 가지 질문드리고 싶은 것이 있습니다. 기선님께서 강의에서 public 가변 필드를 노출하면, 언제 어디서 값이 바뀔지 모르기 때문에 객체의 복사가 필요하고 그에 따라서 성능 저하가 발생할 수 있다고 말씀을 해주셨습니다. 그런데 private 필드로 선언하더라도, public setter나 필드의 변경 지점을 제공한다면 동일한 문제를 내포하는 것이 아닌가요? 예를 들어 아래와 같이 코드를 작성한다면, doSomething에서도 Setter가 열려있기 때문에 doSomething 내부에서 값을 복사해서 쓰거나, main 내부에서 값을 복사해서 써야하는 것은 매한가지 인 것 같습니다.public static void main(String[] args) { TestClass testClass = new TestClass(1,1); System.out.println(testClass.getT()); doSomething(testClass); System.out.println(testClass.getT()); } private static void doSomething(TestClass testClass) { testClass.setT(10); }기선님께서 말씀하셨던 의도는 setter() 역시 공개되지 않은 상황일 때를 말씀하실까요?
- 미해결이펙티브 자바 완벽 공략 2부
아이템 32. 핵심 정리 12:00 이 부분에서 질문이 있습니다.
String[] attributes = pickTwo("좋은", "빠른", "저렴한");제가 자바 기초가 약해서 이해를 못하는걸까요? .. bytecode로 확인하면pickTwo 메소드를 반환하게 된다면 Object(추상적) 형식으로 반환 해서 String(구체적) 형식으로 변환(타입 케스트) 해서 문제(ClasscastException)가 발생된다고 해주셨는데요 그러니깐구체적 -> 추상적 으로 변환 문제없음추상적 -> 구체적 으로 변환 문제 있음결론은 이것인데 Object obj = new Object(); obj = "test"; // 추상적인 Object 에 담음 String string = (String) obj; // 구체적인 String 에 담음해당 원인이라면 해당 소스는 에러가 발생해야 되는것이 아닌가요?.... 자바 기초가 약해서 그런지 조금 이해가 안되는 부분이 있어서 질문 드립니다.
- 미해결이펙티브 자바 완벽 공략 2부
아이템31 비한정적와일드카드
안녕하세요, 저번 1탄과 이번의 강의는 정말 유용하게 잘 듣고 있습니다. 제가 알기로는 List<? extends T> aaa 와 같이 사용할 경우, aaa에 할당되는 값이 T의 list 일수도 T의 자손의 list일 수도 있어서. 말씀하신 대로 추가하거나 변경하는게 안되는 걸로 알고 있습니다. <?>의 경우 <? extends Object> 로 봐도 된다고 본적이 있는 것 같습니다. 그럼 이 때에도 extends 로 인해 변경하지 못하는 것으로 생각 해도 될까요?