Giter Site home page Giter Site logo

2022-effective-java's People

Contributors

bcc0830 avatar hyeonic avatar injoon2019 avatar jayjaehunchoi avatar leo0842 avatar ohzzi avatar syoun602 avatar wishoon avatar yaho99 avatar yeon-06 avatar yh20studio avatar yhh1056 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

2022-effective-java's Issues

[item55] Optional을 사용하는 구체적인 상황

안녕하세요 호호😊 @yhh1056
스터디 중 남겼던 질문 백업을 위해 이슈 생성 합니다~

  1. Optional을 사용하는 구체적인 예제
  2. (1에 대한 답변으로 DB 관련을 받아서) DB에 데이터 없는 경우에 Optional이 아니라 그냥 객체를 반환하면 에러가 나나요? 아니면 null일 수도 있음을 명시하기 위해 사용하나요?

[item17] 생성자에서 방어적 복사 활용

@Ohzzi
오찌 안녕하세요! 오늘 발표 잘 들었습니다 😃

궁금한 것이 하나 있어 질문드립니다!! 저는 보통 외부에서 리스트를 주입하여 생성할 때 new ArrayList<>()를 활용하여 방어적 복사를 진행했습니다.

public class Lotto {
    private final List<Integer> numbers;

    public Lotto(List<Integer> numbers) {
        this.numbers = new ArrayList<>(numbers);
    }
    ...
}

오찌의 발표 자료를 살펴보면 List.copyOf()를 활용했는데 둘의 차이점이나 copyOf만의 이점이 있을까요??

[item 24] 익명클래스의 상수는 언제 static 영역에 올라가나요?

안녕하세요 연로그 발표 잘들었습니다~!😀

@yeon-06

public class Calculator {
    private int x;
    private int y;

    public Calculator(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int plus() {
        Operator operator = new Operator() {
            private static final String COMMENT = "더하기"; // 상수
            // private static int num = 10; // 상수 외의 정적 멤버는 불가능
          
            @Override
            public int plus() {
                // Calculator.plus()가 static이면 x, y 참조 불가
                return x + y;
            }
        };
        return operator.plus();
    }
}

interface Operator {
    int plus();
}

위 예제 코드에서 COMMENT는 언제 메모리에 올라가고(1), 익명 클래스가 사용되고 난 후의 COMMENT 는 지워지는지 static 영역에 남아있는지(2) 궁금합니다. public으로 선언 해도 외부에선 접근이 불가능하네요!

[item45] 람다에서의 final 변수

안녕하세요 야호! 티키입니다.

코드블록으로만 할 수 있는 일

  • 범위 안의 지역변수를 읽고, 수정할 수 있음

    • 🙅‍♀️ 람다에서는 final이거나 사실상 final인 변수만 읽을 수 있고, 지역 변수를 수정하는건 불가능함

참조해주신 자료에서 람다에서는 final이거나 사실상 final인 변수만 읽을 수 있고 에 대해서 좀 더 자세한 설명 부탁드리겠습니다.

제가 이 부분에 대해서 질문 드리고 싶은 방향은

  • 람다식에서는 람다 식 바깥에서 선언한 변수(인스턴스 변수, 지역 변수, 클래스 변수)들은 모두 다 final 이거나 effectively final이어야 한다는 뜻인가요?
  • 사실상 final은 어떤 것인가요?

[item 3] enum 싱글턴에 관하여

야호 질문 올리는걸 잊고 하루 늦었습니다! 😭😭

enum 방식으로 싱글턴을 만드는 방법에 대해 어떻게 생각하시나요?

열거 타입 방식의 싱글턴이 안전하고 여러 장점에 관한건 좋은 것 같아요!!
하지만 필드 방식이나 정적 팩터리 방식으로 사용하는게 싱글턴의 의도를 더 잘 전달하는 것이지 않을까 생각이 들었고,
enum은 상수를 관리하기 위해 등장한건데 싱글턴으로 사용하면 사용 의도에 맞게 개발하는 것인가 생각이 들어서 질문드렸어요!

[item5] 인터페이스를 주입 받는 이유

안녕하세요 매트😀

#10

의존 객체 주입 패턴을 사용하여 해당 객체에게 유연성을 부여해주고 테스트 용이성을 개선하는 부분이 공감이 되네요!

public Lotto(LottoNumberGenerator lottoNumberGenerator) {
      List<Integer> numbers = lottoNumberGenerator.generate(DEFAULT_LOTTO_NUMBERS_SIZE);
      this.lottoNumbers = numbers.stream()
              .map(LottoNumber::new)
              .collect(toSet());
}

예시에 나온 코드에 관한 질문인데요 Lotto를 생성할 때 List<Integer> 형태의 데이터를 받아도 테스트가 가능하고 유연해지는데
LottoNumberGenerator를 주입받아서 어떤 점이 더 좋았나요?

[item15] 바깥 클래스 하나에서만 접근할 수 있게 하는 경우

안녕하세요 연로그! 야호입니다 :)

오늘 연로그의 아이템 설명 중에,

톱 레벨에 위치한다는 건 같은 패키지의 모든 클래스가 접근할 수 있다는 의미이다.
이 때 private static을 중첩시키면 바깥 클래스 하나에서만 접근할 수 있다.

라는 부분이 있었는데요!
private 을 이용하는 것 까지는 이해가 되는데 static 까지 사용해야 하는 이유가 궁금합니다!
private 만 사용해도 바깥 클래스에서만 접근할 수 있지 않나요?

[item60] 정수와 소수점을 따로 저장하는 경우

안녕하세요 매트~!
궁금한 점이 생겨서 Issue로 질문 드립니다 :)

BigDecimal 보여주신 코드를 보면 아래 세가지가 저장되는데요

  • 정수
  • 소수점 자리수
  • 정밀도

그렇다면 10/3 = 3.333333333333....
이런 나누어 떨어지지 않는 경우에는 어떤 형식으로 저장되고 처리되는지 궁금합니다!

[item06] 객체 캐싱 기준

저희가 이번에 미션에서 LottoNumber를 캐싱하라는 리뷰들을 많이 받았고 실제로 크루들이 LottoNumber의 Pool을 만들어서 사용한 것으로 알고 있는데요!

다만, 정말 아주 무거운 객체가 아닌 이상, 단순히 객체 생성을 피하고자 본인만의 객체 풀을 만들지 말자. JVM의 가비지 컬렉터는 상당히 잘 최적화 되어있어 가벼운 객체를 다룰 때는 본인이 만든 객체 풀보다 훨씬 빠르다.

라고 이야기를 해주셨습니다! 그런데 LottoNumber는 사실 그렇게 무거운 객체는 아닌데, 이런 경우에 풀을 만드는 것이 좋지 못한 방법일까요?

[item53] of 메서드의 우선순위

안녕하세요 후니! 오늘 발표 잘 들었습니다.

한 가지 궁금한 것이 있어서 질문 드립니다! 아래와 같이 2개의 값을 전달하는 of 메서드를 사용한다고 가정하였습니다.

Set<Integer> numbers = Set.of(1, 2);

가변 인수를 활용하는 아래 메서드 에서도 변수가 두개인 경우를 case로 다루고 있는 것을 확인했습니다.

public interface Set<E> extends Collection<E> {
   ...
    static <E> Set<E> of(E e1, E e2) {
        return new ImmutableCollections.Set12<>(e1, e2);
    }
    ...
    static <E> Set<E> of(E... elements) {
        switch (elements.length) { // implicit null check of elements
            case 0:
                return ImmutableCollections.emptySet();
            case 1:
                return new ImmutableCollections.Set12<>(elements[0]);
            case 2:
                return new ImmutableCollections.Set12<>(elements[0], elements[1]);
            default:
                return new ImmutableCollections.SetN<>(elements);
        }
    }
    ...
}

이때 실제로 불려지는 메서드의 우선순위는 무엇인가요??

[Item24] 중첩 클래스 컴파일

안녕하세요 연로그! 오늘 발표 잘 들었습니다! 😃

궁금한 점이 하나 있어서 질문드립니다!

중첩 클래스를 작성한 java 파일을 컴파일하면 몇개의 클래스 파일이 생기나요??

[item53] 가변인수를 방어적으로 사용하지 않을 시, 예외 처리

매개변수에 다른 인수를 넣지 않고 가변 인수만 사용하는 경우에, 컴파일 타임에서는 오류를 잡지 못하고 런타임에서 문제가 발생한다고 해주셨는데요, 예제 코드에서는 orElseThrow로 IllegalArgumentException을 직접 던져주셨습니다! 만약에 그럼 이런 처리를 하지 않는 경우에 프로그램은 어떻게 작동하게 되나요? 따로 예외가 발생하거나 하는 케이스가 있나요?

[item34] 열거 타입 사용시 compareTo()

안녕하세요 알파😄

Enum 값을 사용하여 상수를 선언했을 때, compareTo를 사용하여 Enum 객체를 비교할 때 Enum의 ordinal 값을 사용하여 비교한다고 코드 예시를 보여준 점에 대해서 질문 드립니다.

System.out.println(Days.MONDAY.compareTo(Days.FRIDAY));

Enum끼리 비교할 때 ordinal 값을 이용해서 비교하면 활용도가 떨어진다고 생각했습니다.
그리하여 혹시 compareTo를 override 해서 사용할 수 있는지, 사용할 수 없다면 어떤 방법을 사용해서 더 의미 있는 비교를 할 수 있는지 궁금합니다.

[item06] 유한 상태 머신에 대하여

안녕하세요 루키, 알파입니다!
오늘 발표에서 정규식을 이용한 패턴 매칭에서 유한 상태 머신이 어떻게 패턴을 찾는지 알려주셨는데요.
혹시 유한 상태 머신이 패턴을 찾는 알고리즘이 문자열 검색 알고리즘인 KMP를 채택하는 지 궁금합니다.
그것이 아니라면 어떤 원리로 패턴을 매칭하는지, 시간복잡도는 어떻게 되는지 궁금합니다.

[item4] Private 생성자 사용 시 주석 사용

안녕하세요 연로그😄

이펙티브 자바 책의 내용을 통해서 질문드립니다.

인스턴스 생성을 막는 이유로 생성자를 private로 선언하는 것이 직관적이지 않아서 다음과 같이 주석을 달아준다고 적혀 있습니다.

// 기본 생성자가 만들어지는 것을 막는다(인스턴스 화 방지용).

이에 대해서 예시로 보여주신 코드에는 주석이 적혀있었는지, 그리고 연로그의 생각은 어떤지 궁금합니다.

[item21] decorated()

removeIf 메서드의 lock을 설명하는 부분에서 나온
decorated() 가 무엇인지 잘 모르겠습니다! 설명 부탁드려요!

[item45] 스트림의 short circuit

안녕하세요 야호, 알파입니다.

스트림과 컬렉션의 비교

컬렉션 : 적극적 생성
-> 자료구조가 포함하는 모든 값을 메서드에 포함시킴

스트림 : 게으른 생성
-> 요청할 때만 요소를 계산하는 고정된 자료구조를 가짐

스트림은 여러개의 조건이 중첩된 상황에서
값이 결정나면 불필요한 연산을 진행하지 않고 조건문을 빠져나옴
-> 실행 속도를 높임
= 쇼트 서킷

단, 특정 연산자를 사용할 때만 적용됨!
ex) allMatch, anyMatch, noneMatch, findFirst, findAny, limit, ...
  • 스트림이 short-circuit을 통해 컬렉션을 for문으로 순회하는 것보다 손실이 적다라고 하셨는데요.
  • 여기서 궁금한 점은 findAny의 경우, 최악의 상황에는 존재하지 않는 객체를 찾을 때 모든 객체들을 다 한번씩은 봐야 하기 때문에 결국 for문과 다름이 없다고 생각합니다.
  • 다른 예시로 insertion sort의 경우 "거의 정렬된 배열"을 정렬할 때는 그 어떤 정렬 알고리즘 보다 빠르다고 알려져 있는데요. 그러나, 최악의 경우는 전체 배열 길이의 제곱만큼의 시간복잡도가 발생하기 때문에 "insertion sort의 시간복잡도는 n이다"라고 말하는 것이 오답입니다.
  • 따라서, 말씀해주신 short-circuit은 확률적인 부분에 의해 발생한다고 생각합니다. 그렇기 때문에 "스트림은 short-circuit의 이익을 얻을 수 있다"라고 말하는 것은 개인적으로는 잘 이해가 가지 않는데 이에 대한 답변 주시면 감사하겠습니다.

[item37] new HashSet[length]를 사용하지 않는 이유

안녕하세요 티키~!
Pull Request에서 질문했던 것에 대한 답변이 너무 좋아서 기록용으로도 이슈로도 남겨둡니다 :)

Set<Lotto>[] lotteriesByRank = new HashSet[Rank.values().length];

74번째 라인의 new 키워드로도 충분한 것 같은데 Set[]로 형변환 해주시는 이유가 있으실까요??

[item54] 상수로 선언해둔 빈 배열

호호! 예제를 보며 궁금한 점이 있어 질문 드립니다.

private static final Car[] EMPTY_CARS = new Car[0];

public Car[] getCars() {
    return cars.toArray(EMPTY_CARS);
}

해당 예제에서 길이가 0인 배열을 미리 상수로 선언하여 불변으로 활용하고 필요에 따라 재사용 하여 메모리를 절약할 수 있다고 이해해도 괜찮을까요?

[item54] 빈 ‘불변’ 컬렉션을 반환에서 타입

안녕하세요 호호 😄

 public List<Car> getCars() {
     if (cars.isEmpty()) {
         return Collections.emptyList();
     }
     return new ArrayList<>(cars);
 }

해당 코드와 같이 빈 ‘불변’ 컬렉션 사용하여 반환할 때, 반환되는 리턴 타입은 어떻게 결정되는 것인가요?

[item58] forEach 메소드와 향상된 for문 차이

안녕하세요 썬😀

List<Integer> numbers = List.of(1, 2, 3, 4, 5);

for (Integer number : numbers) {        // 1
    System.out.println(number);
}

numbers.forEach(System.out::println);   // 2

1번과 2번 코드의 차이점은 무엇인가요?

[item17] 생성자는 초기화 끝난 상태의 객체를 생성해야 한다?

안녕하세요 오찌 @Ohzzi 😊
스터디 발표 후 남겼던 질문 백업을 위해 이슈로도 생성합니다

ppt의 마지막 페이지에서 "생성자는 초기화가 완벽히 끝난 상태의 객체를 생성해야 한다."라고 하셨는데 값을 생성자에서 초기화하면 안되는걸까요?
왜 초기화가 끝난 상태라고 하셨을까요?

[item37] HashMap의 Hash collision시 시간복잡도

안녕하세요 티키, 알파입니다!

Key의 Hash값을 계산해서 테이블의 인덱스로 사용하기에 
노드의 Key가 일치할때까지 연결리스트 또는 트리를 탐색한다. 
따라서 HashMap은 해시 충돌이 자주 발생한다면 시간 복잡도가 O(logN)에 근접하게 된다.
  • 위 발표 자료에서 Collision이 발생 시 시간 복잡도가 왜 O(logN)인지 궁금합니다!

[item53] Set 내부 구현

안녕하세요 후니~!
궁금한 점이 생겨 이슈 남깁니다😄

성능 이슈로 인한 예제로 Set 내부 코드를 보여주셨는데요

파라미터가 0 ... 10개인 경우의 of가 있고
아래 같은 가변 인수를 받는 of가 따로 있어요

@SafeVarargs
@SuppressWarnings("varargs")
static <E> Set<E> of(E... elements) { ... }

0 ... 10개인 경우의 of가 이미 존재하는데 왜 switch를 통해 element 개수가 0, 1, 2인 경우를 또 다시 검증하나요?

[item17] 불변 객체를 어디까지 적용해야 하는가?

안녕하세요 오찌 티키입니다 🖐

이번 아이템을 읽고 자동차 경주 미션에 적용해본 적이 있는데, 이 경우에 대해서 오찌의 생각은 어떤지 의견이 궁금합니다.

Car 객체를 불변으로 유지하기 위해서 코드를 변경하고 있었습니다. 이때 불변 객체를 만드는 규칙에서 참조 필드 값 또한 단순한 private final이 아니라 이 객체도 불변을 유지해야 하기에 참조 필드 또한 불변 객체를 만들면서 궁금증이 생겼습니다.

  1. Car 객체를 불변으로 만들면서 Car 가 참조하는 Position 객체를 불변으로 만들었습니다. 따라서 불변 객체로의 장점을 활용할 수 있게 되었지만, 자동차가 1번 움직일 때마다 Position의 객체가 상태 값을 변화하는 것이 아닌 새로운 객체를 생성하게 되었습니다. 이런 경우에 자동차가 움직일 때마다 새로운 객체를 생성하게 되는 자원의 소모가 많아지게 되는 단점이 있습니다.

  2. Car 객체에서 Position의 값을 계속해서 상태가 변할 수 있는 가변 객체라고 생각하고 불변으로 만들지 않는 것입니다. 이에 불변 객체의 장점을 모두 활용하지 못하지만 성능상의 이점과 편리함을 가질 수 있게 됩니다.

이런 경우에 오찌는 불변 객체를 적용해야하는 기준이 어떤지 궁금합니다.

[item11] 시간복잡도 질문

안녕하세요 에덴, 시간복잡도 덕후 알파입니다
발표시 해쉬 코드 충돌시 O(1)이 아닌 O(N)이 걸린다고 하셨는데 자바 hashmap 기준 O(log N)으로 알고 있습니다.
혹시 왜 O(N)이 걸리는지 설명해주실 수 있나요? 책에서 설명하는 것이 hashmap이 아닌가요?

[item54] Optional을 사용하는 이유

안녕하세요 호호☺

잠깐 Optional에 대한 이야기를 짚어 주셨었는데요
메소드에서 반환 값에 Optional을 사용해도 null을 처리해주는 로직은 꼭 필요할 것 같아요
굳이 Optional을 사용하는 이유가 있을까요?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.