월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결이펙티브 자바 완벽 공략 1부
프로젝트 설정 관련 질문
안녕하세요! '소스 코드' 강의에서 알려주신 대로 상호 의존하는 부분을 주석 처리하고 mvn install 하는 도중 오류가 있어 질문 드립니다. java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid' 라는 오류가 발생하여 JDK 설정을 11 로 바꾸어 주었습니다.lombok 관련 문제인 것으로 되어서, 버전을 1.18.30 으로 바꾸어 주었습니다. 그러나 이 경우에는 컴파일 에러 (AppConfig 등 Chinese Hello Service 를 참조하는 클래스들에서) 가 발생합니다.현재 상황은 위와 같습니다. 해결할 방법이 없을까요?
- 미해결이펙티브 자바 완벽 공략 1부
브릿지 패턴과 서비스 제공자 프레임워크 관계
스프링이랑 ServiceLoader는 주요 구성요소가 무엇인지 알것 같습니다만.. 브릿지 패턴은 어떻게 대응되는지 잘모르겠습니다.서비스 제공자 인터페이스와, 구현체는 대응되지만, 서비스 제공자 등록 API와 서비스 접근 API는 어디에 해당되는것인가요??
- 미해결이펙티브 자바 완벽 공략 1부
[과제] EnumMap과 EnumSet가 HashMap과 HashSet보다 효율적인 이유
EnumMap 특징 - 열거형 크기만큼 배열이 생겨나며, ordinal에 따라 index가 정해진다. - 배열을 사용하기 때문에 연산속도가 빠르다. - 열거형 순서에 따라 데이터가 정렬된다. - 키의 순서대로 순회할 때 효율적이다. EnumSet 특징 - 비트 벡터를 통해 공간과 성능을 최적화한다. - 다양한 집합 연산(교집합, 차집합, 합집합 등)을 제공한다.* 비트 벡터란 비트 배열로 구성된 자료구조, 0이면 집합에 미포함, 1이면 집합에 포함을 의미한다
- 미해결이펙티브 자바 완벽 공략 1부
정적팩토리메소드와 ServiceLoader는 무슨 관계인가요?
ServiceLoader는 정적팩토리메소드를 사용하든 안하든 모든 구현체를 가져오는데 정적팩토리메소드 장점에서 나오는 이유를 잘모르겠습니다!
- 미해결이펙티브 자바 완벽 공략 1부
강의 제목 오타 발견!!! 뚜둥
'아이템 10. 완벽 공략 25 - 리스코프 치환 원친' 이라고 되어있어요..!!
- 미해결이펙티브 자바 완벽 공략 1부
mvn install
첫 강의에 나오는 세팅대로 깃 클론 따서 해당 부분들을 주석 처리하고 mvn install 을 하면 사진과 같은 오류가 발생합니다. 버전 문제인거 같은데 혹시 이유를 알 수 있을까요>
- 미해결이펙티브 자바 완벽 공략 1부
강의 코드
강의 코드를 못찾겠는데 어디서 찾을 수 있을까요?
- 해결됨이펙티브 자바 완벽 공략 1부
Builder 필수값 질문입니다.
기선님 안녕하세요. Lombok Builder의 단점을 듣고 검색 해봣는데https://hothoony.tistory.com/1295이 방법이라면 가능하게 되는걸까요?
- 미해결이펙티브 자바 완벽 공략 1부
Elvis, IElvis 질문이 있습니다.
ConcertTest에서 Elvis의 인스턴스를 가져와서 매번 노래를 부르게 하면 리소스를 지속적으로 사용하여 낭비 하는것도 이해하였습니다.그래서 Elvis를 인터페이스화 하여 MockElvis를 만들고 Elvis 인스턴스를 대체해서 Concert의 테스트를 좀 더 유연하게 한다는 것도 이해하였습니다.하지만, 인터페이스화 하지않고, 아래와 같이 BDDMockito.mock을 통해 해당 클래스를 mocking하게 되면 위와 무슨차이가 있는지 궁금합니다. class ConcertTest { @Test void perform() { Concert concert = new Concert(BDDMockito.mock(Elvis.class)); concert.perform(); assertTrue(concert.isLightsOn()); assertTrue(concert.isMainStateOpen()); } }
- 미해결이펙티브 자바 완벽 공략 1부
EnumMap, EnumSet 정리
EnumMap열거형 상수를 Key로 사용하는 Map의 구현체.열거형 상수 값을 키로 사용할 수 있고, 그 상수 마다 고유한 value를 매핑하여 사용한다.EnumMap은 내부적으로 배열로 구현되어 있어, 매우 빠른 성능을 제공특히 다른 맵보다 메모리 사용량이 적다.static EnumMap<OrderStatus, String> korMap = new EnumMap<>(OrderStatus.class) { { put(PREPARING, "준비중"); put(SHIPPED, "출고완료"); put(DELIVERING, "배송중"); put(DELIVERED, "배송완료"); } }; public static void main(String[] args) { OrderStatus.korMap.forEach((key, value) -> System.out.println(key + " " + value)); }EnumSet열거형 상수를 사용하여 집합(Set)을 구현체Set의 특성상 중복된 원소를 허용하지 않음.EnumSet은 내부적으로 비트 벡터로 구현되어 있어 매우 효율적이고 작은 메모리를 사용.비트연산을 통해 집합 연산을 매우 빠르게 수행static EnumSet<OrderStatus> allOrderStatus = EnumSet.allOf(OrderStatus.class); public static void main(String[] args) { allOrderStatus.forEach(System.out::println); }
- 미해결이펙티브 자바 완벽 공략 1부
HelloService 구현체
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 아이템 1의 장점3,4,5 강의를 듣다가 궁금한 것이 생겨 문의 드립니다.HelloSerivce의 주석 처리를 풀고 static HelloService of(String lang) { if (lang.equals("ko")) { return new KoreanHelloService(); } else { return new EnglishHelloService(); } }HelloSerivceFactory main 메소드에 아래의 코드를 넣으면 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { HelloService eng = HelloService.of("eng"); ServiceLoader<HelloService> loader = ServiceLoader.load(HelloService.class); loader.stream().forEach(a -> System.out.println(a.get().hello())); ChineseHelloService, EnglishHelloService 2개의 구현체가 ServiceLoader에 등록되며HelloNi Hao가 출력되는 것이 아닌가요?Ni Hao만 출력되었는데,제가 강의 내용을 잘못 이해한건지, 2개 다 출력하려면 어떻게 코드를 입력해야할지 궁금해 문의 드립니다.감사합니다.
- 미해결이펙티브 자바 완벽 공략 1부
[과제] 강의 너무 만족스럽습니다.
EnumSet, EnumMap 은 배열을 지정하고 상수 index를 통해 Enum 인스턴스를 직접 매핑합니다. 이런 구조 때문에 값을 넣고 빼는 것이 시간 측면에서 매우 효율적입니다.마찬가지로 배열을 지정하여 데이터를 저장하기 때문에 메모리가 절약됩니다. 그리고 Enum 상수의 개수는 결정되어있기 때문에 HashMap 과 HashSet과 달리 배열이 부족하여 늘려줘야 하는 일이 없습니다.null 값을 처리하지 않아도 됩니다. HashSet 과 HashMap의 값, key, value 는 null 이 될 수 있습니다. 하지만 Enum 상수는 절대 null 이 될 수 없기 때문에 null 값을 처리하는 작업을 하지 않아도 됩니다.
- 미해결이펙티브 자바 완벽 공략 1부
PhantomReference 가 소멸되는 시점을 보는 코드 부분이 약간 이상한것 같습니다.
public class PhantomReferenceExample { public static void main(String[] args) throws InterruptedException { BigObject strong = new BigObject(); ReferenceQueue<BigObject> rq = new ReferenceQueue<>(); BigObjectReference<BigObject> phantom = new BigObjectReference<>(strong, rq); strong = null; System.gc(); Thread.sleep(3000L); // TODO 팬텀은 유령이니까.. // 죽었지만.. 사라지진 않고 큐에 들어갑니다. System.out.println(phantom.isEnqueued()); Reference<? extends BigObject> reference = rq.poll(); BigObjectReference bigObjectCleaner = (BigObjectReference) reference; bigObjectCleaner.cleanUp(); reference.clear(); } }위에 코드에서 커스텀하게 만든 BigObjectReference 로 형변환을 하고 cleanUp을 따로 호출 하는 부분이 이해가 잘 가지 않습니다. cleanUp 메서드도 단순히 출력만하는데굳이나 상속을 받아서 커스텀하게 만든 형태가 만든게 무의미한 것 같습니다. 기선님이 의도한 소멸되는 시점을 확인하고자 하면 아마 아래와 같이 clear 메서드를 오버라이딩하는게 좀 더 맞지 않나 조심 스럽게 의견을 내봅니다.public class BigObjectReference<BigObject> extends PhantomReference<BigObject> { public BigObjectReference(BigObject referent, ReferenceQueue<? super BigObject> q) { super(referent, q); } @Override public void clear() { super.clear(); System.out.println("clean up"); } }public class PhantomReferenceExample { public static void main(String[] args) throws InterruptedException { BigObject strong = new BigObject(); ReferenceQueue<BigObject> rq = new ReferenceQueue<>(); BigObjectReference<BigObject> phantom = new BigObjectReference<>(strong, rq); strong = null; System.gc(); Thread.sleep(3000L); // TODO 팬텀은 유령이니까.. // 죽었지만.. 사라지진 않고 큐에 들어갑니다. System.out.println(phantom.isEnqueued()); Reference<? extends BigObject> reference = rq.poll(); reference.clear(); } } 출력화면
- 미해결이펙티브 자바 완벽 공략 1부
안녕하세요
안녕하세요...소스코드는 어디서 다운로드받을수있나요?깃허브에 effective-java인가요??...과제도 따로있다면어떻게 제출하고 진행하는지 방법알수 있을까요?
- 미해결이펙티브 자바 완벽 공략 1부
객체 소멸에 관한 질문
안녕하세요! 강사님 강의를 듣다가 궁금한 점이 생겨서 질문 드려요.Stack 클래스에 pop메서드가 기존에 배열 해당 참조값을 리턴해 주는 역할을 할 뿐 배열 자체에는 여전히 참조하는 값이 남아있어서 while 문을 돌려서 pop메서드로 다 꺼내도 가비지 컬렉션 대상이 아닌 것은 이해가 갔습니다.그러면 혹시 Stack 클래스를 사용하는 메서드가 끝나게 되면 Stack을 참조하고 있던 지역 변수가 해제가 되면서 Stack 인스턴스가 가비지 컬렉션 대상이 되고 참조하고 있던 elements 배열도 같이 가비지 컬렉션 대상이 되는 건가요?제가 이해하기론 Stack을 참조하는 지역변수 참조 관계가 끊어졌다고 하더라도 Heap 영역에 존재하는 elements 배열 내부에는 여전히 다른 Object들을 참조하는 강 결합으로 이어져 있기 때문에 가비지 컬렉션이 가비지 대상이 아니라고 판단하여 다 쓴 참조를 여전히 가지고 있기 때문에 메모리 영역을 차지하여 다 쓴 객체 참조를 해제하라고 이해하였습니다.다른 곳에서 가비지 컬렉션 대상이 되는 객체들을 보았는데 Heap 영역 내에서 참조를 하고 있는 관계이면 강 결합이어도 가비지 대상이 된다는 글을 봐서 혹시 제가 잘못 이해한 것인지 궁금합니다.질문이 너무 두서없는 것 같지만 제가 본 글 링크를 남겨 놓습니다.https://d2.naver.com/helloworld/329631
- 미해결이펙티브 자바 완벽 공략 1부
정적 팩토리 메서드에 대해 질문이 있습니다.
정적 팩토리 메서드를 사용하지 않을 이유가 있나?라는 의문이 듭니다.강의에서도 말씀하시길 무조건 정적 팩토리 메서드를 고려하지 말고 상황에 맞춰 정적 팩토리 메서드를 사용하라 하셨는데요.상속 관련 부분과 javadoc 관련 부분을 제외하면 무조건 사용하는 것이 맞지 않나 생각이 듭니다.제가 생각하는 큰 장점은 새로운 인스턴스를 생성하지 않아 GC가 실행되는 빈도수?가 적어지기 때문에 무조건 사용하는 것이 맞다고 생각하는데 혹시 제가 놓치고 있는 부분이 있는지 궁금합니다.
- 해결됨이펙티브 자바 완벽 공략 1부
Mock test 관련 질문입니다!
안녕하세요 선생님! 제가 이해를 한 내용이 맞는지 질문 드리고자 글을 남기게 되었습니다. (말씀드리기 앞서, 강의 너무 잘 듣고 있습니다 ㅎㅎ 좋은 강의 너무 감사드린다는 말씀 전하고 싶습니다!) 싱글톤 객체를 테스트마다 매번 생성하는게 Mock 객체를 생성하는 것 보다 operation 비용이 많이 든다고 설명해주셨는데요.제가 이 내용에 대해테스트 코드 상에서 싱글톤 객체를 생성할 때는 "필요한 모든 필드가 들어가있는 상태인 객체"를 생성하고, Mock객체를 생성할 때는 싱글톤 객체보다 필드가 적어서 상대적으로 비용이 적게 든다 라고 이해를 하고 있습니다. 혹시 이해한 내용이 맞을까요..?? (이해한 내용에 대해서 확실한지 검증하려고 여러 문헌을 찾아봤지만 찾을 수가 없었어요 ㅠㅠ)
- 미해결이펙티브 자바 완벽 공략 1부
안녕하세요 선생님, 강의를 보고나서 Optional 소스코드를 뜯어보다가 어려운 부분이 있어서 질문 드립니다.
안녕하세요 선생님, 우선 저는 선생님의 디자인패턴 강의도 듣고 왔습니다만, 그럼에도 이 부분이 의아한데 저의 부족한 검색 실력 탓인지 도저히 해답을 찾을 수 없어 질문을 드리게 됐습니다. 바로 Optional의 정적 팩터리 메서드인 empty와 내부에 가지고 있는 EMPTY 인스턴스에 대한 것입니다..이번 강의를 듣고 저번 싱글톤 패턴 강의 들었던 것을 떠올리며 아~ 이래서 그랬구나~ 하면서 소스코드들을 보고 있는데 empty()메서드 위의 주석을 보면Option.empty()가 Singletone을 보장하지 않으니 이것들을 ==으로 비교하는 모험을 굳이 하지 말라고 적혀있는데요.누가 봐도 가장 보편적인 형태의 싱글톤 패턴인데 싱글톤을 보장하지 않는다고 하니 대체 이게 무슨소리인지 너무 궁금합니다..아니면 기존 디자인패턴 강의에서 말씀하셨듯이 Reflection으로 싱글톤이 깨질 수 있어서 100% 보장할 수 없다는 말인 것일까요?강의와 다소 거리가 있는 질문인 점 먼저 사과드립니다. 혹시라도 답변 달아주실 수 있다면 정말 감사할 것 같습니다.
- 미해결이펙티브 자바 완벽 공략 1부
기선님 질문있습니다..
오픈하신 강의 리팩토링, 디자인패턴, 이펙티브 시리즈 1탄이렇게 구매했습니다. 이펙티브 시리즈 나머지 강의도 구매할 의사 있습니다.이렇게 기선님 강의만 보면 위의 언급한 3권의 책은 별도로 사서볼 필요는 없겠죠?
- 미해결이펙티브 자바 완벽 공략 1부
intellij의 equals 자동 생성 기능
intellij 기능으로 equals 생성시 체크박스가 나오는데, 하위 클래스를 허용할지 말지 결정하는 부분이 나오네요.equals 내부에서 하위 클래스를 getClass()로 확인하여 다르다면 false를 리턴하는 부분롬복에서는 하위 클래스를 허용하도록만 equals를 만들어 주는 것 같은데, intellij 기능으로 만들 때는 해당 부분을 주의해야 할 것 같습니다