2021 03 14
2021-03-14¶
블랙잭 미션 2단계 피드백¶
- 메서드가 모두 static으로 이루어진 클래스는 private으로 생성자 닫아두자
- 객체 생성에 대한 검증 로직을 생성자와 정적 팩토리 메서드 중에서 어디서 해야할까? 장단점은? - 내 답변: https://github.com/woowacourse/java-blackjack/pull/193#discussion_r593838481 - 생성자 - 우선 여기서 해주니까 static 하게 함수를 선언하지 않아도 되네 - static 하게 함수를 정의해 주는게 무슨 단점이 있을까? - 메모리를 할당 받고 프로그램 종료 시점에 반환되므로 사용하지 않고 있어도 메모리가 할당되어 있음 - 디버깅도, 테스트도 어렵다고 하네... - static 그래도 장점도 있겠지 - 객체 생성없이 변수 접근/메서드 실행이 가능해 속도가 빠르다 - JVM이 클래스를 읽어 들일때 자동적으로 메모리에 적재 - 캡슐화/은닉성에 대한 측면으로 바라보자... - 이게 결국 validation이 객체가 인스턴스화 될 때 필요한 과정인거자나?
- 중복에 대한 검사는 Set으로 해도 괜찮지 않을까?
- 참고: https://kapentaz.github.io/java/Java8-stream%EC%9C%BC%EB%A1%9C-%EC%A4%91%EB%B3%B5%EB%90%9C-%EC%9A%94%EC%86%8C-%EC%A1%B4%EC%9E%AC-%ED%99%95%EC%9D%B8/#
- 참고: https://www.geeksforgeeks.org/stream-allmatch-java-examples/
- 내 답변: https://github.com/woowacourse/java-blackjack/pull/193#discussion_r593837044
- stream의 distinct(), count() 로 고유한 원소 갯수 세기
- distinct()는 list "전체"를 대상을 탐색하며 중복을 제거
public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 1); boolean duplicated = list.stream() .distinct() .count() != list.size(); System.out.println(duplicated); }- HashSet으로 검사하기 - 중복된 요소가 존재하면 거기서 끊고 리턴할 수 있게 코드 작성 가능
public static void main(String[] args) { List<Member> list = Arrays.asList( new Member(1L, "Tom"), new Member(2L, "Smith"), new Member(3L, "Tom")); boolean unique = list.stream() .map(Member::getName) .allMatch(new HashSet<>()::add); System.out.println(unique); }- 사실 필요한 정보는 해당 리스트 안에 중복된 객체의 유무이지, 고유한 객체가 몇 개나 리스트에 있는지가 아님
- DealerMoney와 PlayerMoney를 굳이 나눴어야 했나? - Money로 만드는 것은 어떤가? - VO를 공부해볼 것
- assertEquals vs assertSame - assertEquals: 두 개의 값이 같은지를 비교 - assertSame: 두 객체가 동일한 객체인지 주소값으로 비교 - Singleton 으로 만들어진 객체를 비교확인 - 리스트의 clone 메서드로 복사된 객체 비교 할수도 있음