woowacourse-study / 2022-effective-java Goto Github PK
View Code? Open in Web Editor NEW우아한테크코스 4기 레벨 1 이펙티브 자바 스터디입니다.
우아한테크코스 4기 레벨 1 이펙티브 자바 스터디입니다.
안녕하세요 호호😊 @yhh1056
스터디 중 남겼던 질문 백업을 위해 이슈 생성 합니다~
@Ohzzi
오찌 안녕하세요! 오늘 발표 잘 들었습니다 😃
궁금한 것이 하나 있어 질문드립니다!! 저는 보통 외부에서 리스트를 주입하여 생성할 때 new ArrayList<>()
를 활용하여 방어적 복사를 진행했습니다.
public class Lotto {
private final List<Integer> numbers;
public Lotto(List<Integer> numbers) {
this.numbers = new ArrayList<>(numbers);
}
...
}
오찌의 발표 자료를 살펴보면 List.copyOf()
를 활용했는데 둘의 차이점
이나 copyOf만의 이점
이 있을까요??
안녕하세요 연로그 발표 잘들었습니다~!😀
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으로 선언 해도 외부에선 접근이 불가능하네요!
안녕하세요 야호! 티키입니다.
범위 안의 지역변수를 읽고, 수정할 수 있음
참조해주신 자료에서 람다에서는 final이거나 사실상 final인 변수만 읽을 수 있고 에 대해서 좀 더 자세한 설명 부탁드리겠습니다.
제가 이 부분에 대해서 질문 드리고 싶은 방향은
https://aeno.notion.site/2-2376ab244be047ec9678f2950247da82
여기에 질문 올려주시면 댓글 남길게요!
야호 질문 올리는걸 잊고 하루 늦었습니다! 😭😭
enum 방식으로 싱글턴을 만드는 방법에 대해 어떻게 생각하시나요?
열거 타입 방식의 싱글턴이 안전하고 여러 장점에 관한건 좋은 것 같아요!!
하지만 필드 방식이나 정적 팩터리 방식으로 사용하는게 싱글턴의 의도를 더 잘 전달하는 것이지 않을까 생각이 들었고,
enum은 상수를 관리하기 위해 등장한건데 싱글턴으로 사용하면 사용 의도에 맞게 개발하는 것인가 생각이 들어서 질문드렸어요!
안녕하세요 매트😀
의존 객체 주입 패턴을 사용하여 해당 객체에게 유연성을 부여해주고 테스트 용이성을 개선하는 부분이 공감이 되네요!
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를 주입받아서 어떤 점이 더 좋았나요?
안녕하세요 연로그! 야호입니다 :)
오늘 연로그의 아이템 설명 중에,
톱 레벨에 위치한다는 건 같은 패키지의 모든 클래스가 접근할 수 있다는 의미이다.
이 때private static
을 중첩시키면 바깥 클래스 하나에서만 접근할 수 있다.
라는 부분이 있었는데요!
private
을 이용하는 것 까지는 이해가 되는데 static
까지 사용해야 하는 이유가 궁금합니다!
private
만 사용해도 바깥 클래스에서만 접근할 수 있지 않나요?
안녕하세요 매트~!
궁금한 점이 생겨서 Issue로 질문 드립니다 :)
BigDecimal 보여주신 코드를 보면 아래 세가지가 저장되는데요
그렇다면 10/3 = 3.333333333333....
이런 나누어 떨어지지 않는 경우에는 어떤 형식으로 저장되고 처리되는지 궁금합니다!
저희가 이번에 미션에서 LottoNumber를 캐싱하라는 리뷰들을 많이 받았고 실제로 크루들이 LottoNumber의 Pool을 만들어서 사용한 것으로 알고 있는데요!
다만, 정말 아주 무거운 객체가 아닌 이상, 단순히 객체 생성을 피하고자 본인만의 객체 풀을 만들지 말자. JVM의 가비지 컬렉터는 상당히 잘 최적화 되어있어 가벼운 객체를 다룰 때는 본인이 만든 객체 풀보다 훨씬 빠르다.
라고 이야기를 해주셨습니다! 그런데 LottoNumber는 사실 그렇게 무거운 객체는 아닌데, 이런 경우에 풀을 만드는 것이 좋지 못한 방법일까요?
안녕하세요 후니! 오늘 발표 잘 들었습니다.
한 가지 궁금한 것이 있어서 질문 드립니다! 아래와 같이 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);
}
}
...
}
이때 실제로 불려지는 메서드의 우선순위는 무엇인가요??
안녕하세요 연로그! 오늘 발표 잘 들었습니다! 😃
궁금한 점이 하나 있어서 질문드립니다!
중첩 클래스를 작성한 java 파일을 컴파일하면 몇개의 클래스 파일이 생기나요??
매개변수에 다른 인수를 넣지 않고 가변 인수만 사용하는 경우에, 컴파일 타임에서는 오류를 잡지 못하고 런타임에서 문제가 발생한다고 해주셨는데요, 예제 코드에서는 orElseThrow로 IllegalArgumentException을 직접 던져주셨습니다! 만약에 그럼 이런 처리를 하지 않는 경우에 프로그램은 어떻게 작동하게 되나요? 따로 예외가 발생하거나 하는 케이스가 있나요?
안녕하세요 알파😄
Enum 값을 사용하여 상수를 선언했을 때, compareTo를 사용하여 Enum 객체를 비교할 때 Enum의 ordinal 값을 사용하여 비교한다고 코드 예시를 보여준 점에 대해서 질문 드립니다.
System.out.println(Days.MONDAY.compareTo(Days.FRIDAY));
Enum끼리 비교할 때 ordinal 값을 이용해서 비교하면 활용도가 떨어진다고 생각했습니다.
그리하여 혹시 compareTo를 override 해서 사용할 수 있는지, 사용할 수 없다면 어떤 방법을 사용해서 더 의미 있는 비교를 할 수 있는지 궁금합니다.
안녕하세요 루키, 알파입니다!
오늘 발표에서 정규식을 이용한 패턴 매칭에서 유한 상태 머신이 어떻게 패턴을 찾는지 알려주셨는데요.
혹시 유한 상태 머신이 패턴을 찾는 알고리즘이 문자열 검색 알고리즘인 KMP를 채택하는 지 궁금합니다.
그것이 아니라면 어떤 원리로 패턴을 매칭하는지, 시간복잡도는 어떻게 되는지 궁금합니다.
안녕하세요 연로그😄
이펙티브 자바 책의 내용을 통해서 질문드립니다.
인스턴스 생성을 막는 이유로 생성자를 private로 선언하는 것이 직관적이지 않아서 다음과 같이 주석을 달아준다고 적혀 있습니다.
// 기본 생성자가 만들어지는 것을 막는다(인스턴스 화 방지용).
이에 대해서 예시로 보여주신 코드에는 주석이 적혀있었는지, 그리고 연로그의 생각은 어떤지 궁금합니다.
removeIf 메서드의 lock을 설명하는 부분에서 나온
decorated() 가 무엇인지 잘 모르겠습니다! 설명 부탁드려요!
안녕하세요 야호, 알파입니다.
컬렉션 : 적극적 생성
-> 자료구조가 포함하는 모든 값을 메서드에 포함시킴
스트림 : 게으른 생성
-> 요청할 때만 요소를 계산하는 고정된 자료구조를 가짐
스트림은 여러개의 조건이 중첩된 상황에서
값이 결정나면 불필요한 연산을 진행하지 않고 조건문을 빠져나옴
-> 실행 속도를 높임
= 쇼트 서킷
단, 특정 연산자를 사용할 때만 적용됨!
ex) allMatch, anyMatch, noneMatch, findFirst, findAny, limit, ...
안녕하세요 티키~!
Pull Request에서 질문했던 것에 대한 답변이 너무 좋아서 기록용으로도 이슈로도 남겨둡니다 :)
Set<Lotto>[] lotteriesByRank = new HashSet[Rank.values().length];
74번째 라인의 new 키워드로도 충분한 것 같은데 Set[]로 형변환 해주시는 이유가 있으실까요??
호호! 예제를 보며 궁금한 점이 있어 질문 드립니다.
private static final Car[] EMPTY_CARS = new Car[0];
public Car[] getCars() {
return cars.toArray(EMPTY_CARS);
}
해당 예제에서 길이가 0인 배열
을 미리 상수로 선언하여 불변으로 활용하고 필요에 따라 재사용 하여 메모리를 절약할 수 있다고 이해해도 괜찮을까요?
안녕하세요 호호 😄
public List<Car> getCars() {
if (cars.isEmpty()) {
return Collections.emptyList();
}
return new ArrayList<>(cars);
}
해당 코드와 같이 빈 ‘불변’ 컬렉션 사용하여 반환할 때, 반환되는 리턴 타입은 어떻게 결정되는 것인가요?
안녕하세요 썬😀
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번 코드의 차이점은 무엇인가요?
안녕하세요 오찌 @Ohzzi 😊
스터디 발표 후 남겼던 질문 백업을 위해 이슈로도 생성합니다
ppt의 마지막 페이지에서 "생성자는 초기화가 완벽히 끝난 상태의 객체를 생성해야 한다."라고 하셨는데 값을 생성자에서 초기화하면 안되는걸까요?
왜 초기화가 끝난 상태라고 하셨을까요?
안녕하세요 티키, 알파입니다!
Key의 Hash값을 계산해서 테이블의 인덱스로 사용하기에
노드의 Key가 일치할때까지 연결리스트 또는 트리를 탐색한다.
따라서 HashMap은 해시 충돌이 자주 발생한다면 시간 복잡도가 O(logN)에 근접하게 된다.
안녕하세요 후니~!
궁금한 점이 생겨 이슈 남깁니다😄
성능 이슈로 인한 예제로 Set 내부 코드를 보여주셨는데요
파라미터가 0 ... 10개인 경우의 of가 있고
아래 같은 가변 인수를 받는 of가 따로 있어요
@SafeVarargs
@SuppressWarnings("varargs")
static <E> Set<E> of(E... elements) { ... }
0 ... 10개인 경우의 of가 이미 존재하는데 왜 switch를 통해 element 개수가 0, 1, 2인 경우를 또 다시 검증하나요?
안녕하세요 오찌 티키입니다 🖐
이번 아이템을 읽고 자동차 경주 미션에 적용해본 적이 있는데, 이 경우에 대해서 오찌의 생각은 어떤지 의견이 궁금합니다.
Car 객체를 불변으로 유지하기 위해서 코드를 변경하고 있었습니다. 이때 불변 객체를 만드는 규칙에서 참조 필드 값 또한 단순한 private final이 아니라 이 객체도 불변을 유지해야 하기에 참조 필드 또한 불변 객체를 만들면서 궁금증이 생겼습니다.
Car 객체를 불변으로 만들면서 Car 가 참조하는 Position 객체를 불변으로 만들었습니다. 따라서 불변 객체로의 장점을 활용할 수 있게 되었지만, 자동차가 1번 움직일 때마다 Position의 객체가 상태 값을 변화하는 것이 아닌 새로운 객체를 생성하게 되었습니다. 이런 경우에 자동차가 움직일 때마다 새로운 객체를 생성하게 되는 자원의 소모가 많아지게 되는 단점이 있습니다.
Car 객체에서 Position의 값을 계속해서 상태가 변할 수 있는 가변 객체라고 생각하고 불변으로 만들지 않는 것입니다. 이에 불변 객체의 장점을 모두 활용하지 못하지만 성능상의 이점과 편리함을 가질 수 있게 됩니다.
이런 경우에 오찌는 불변 객체를 적용해야하는 기준이 어떤지 궁금합니다.
안녕하세요 에덴, 시간복잡도 덕후 알파입니다
발표시 해쉬 코드 충돌시 O(1)이 아닌 O(N)이 걸린다고 하셨는데 자바 hashmap 기준 O(log N)으로 알고 있습니다.
혹시 왜 O(N)이 걸리는지 설명해주실 수 있나요? 책에서 설명하는 것이 hashmap이 아닌가요?
안녕하세요 호호☺
잠깐 Optional에 대한 이야기를 짚어 주셨었는데요
메소드에서 반환 값에 Optional을 사용해도 null을 처리해주는 로직은 꼭 필요할 것 같아요
굳이 Optional을 사용하는 이유가 있을까요?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.