java

· JAVA
자바의 Enum은 다양한 일을 할 수 있다. 예전 포스팅에서도 설명했지만 Enum은 당수 상수 모음이 아니라 고차원의 추상 개념을 완벽히 표현할 수 있을 뿐 아니라 각 상수 데이터와 연결 지어 다양한 일을 할 수 있다. 여러분은 Enum을 사용해 if문을 제거할 수 있나요? 예전에 수업에서 코치가 한 말이다. 당시에는 무슨 의미인지 정확히 몰랐지만 미션을 진행하다 아 이렇게 if 분기문을 없앨 수 있구나 깨달은 적이 있었다. 오늘은 우아한테크코스 블랙잭 미션에서 Enum을 어떻게 활용했는지 포스팅하고자 한다. 블랙잭 결과 도출 규칙 딜러와 플레이어가 대결해서 카드패의 숫자 합이 21을 넘지 않으면서 높으면 승리하는 게임 승리 조건 블랙잭 : 처음 받은 2장의 카드가 21이면 블랙잭이라고 한다. 블랙잭일 ..
자바가 람다를 지원하면서 API를 작성하는 방법이 크게 바뀌었다. 특히 함수형 인터페이스를 사용해 메서드마다 다른 동작을 메서드를 사용하는 클라이언트에서 지정해줄 수 있다. 이런 방식을 동작 파라미터화라고 한다. 이를 이용하면 변화하는 요구사항에 효과적으로 대응할 수도 있고 클래스와 클래스 간의 의존을 맺을 때 의존을 끊어줄 수도 있다. 변하는 요구사항에 대응하기 회원들의 리스트에서 어떤 조건에 따라 필터링을 해야 한다고 가정하자. public class Member { private final String name; private final int age; public Member(String name, int age) { this.name = name; this.age = age; } } 회원은 이름..
용어 정리 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라 한다. public interface List extends Collection { List 인터페이스는 E라는 원소 타입 매개변수를 받고 이러한 제네릭 클래스와 인터페이스를 통틀어 제네릭 타입이라 한다. 제네릭 타입은 매개변수화 타입을 정의한다. 예를 들어 List라고 했을 때 Integer가 리스트가 받을 수 있는 타입을 정의한 매개변수화 타입이다. 제네릭 타입에는 로 타입이라는 것도 있다. 로 타입이란 타입 매개변수를 사용하지 않은 제네릭 타입을 의미한다. List list; 그렇다면 이 로 타입을 사용하지 말아야 하는 이유는 무엇일까? 로 타입은 타입 안정하지 않다. List rawList ..
· JAVA
위키백과에 의하면 옵저버 패턴의 정의는 다음과 같다. 옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 좀 더 풀어서 말하면 어떤 이벤트가 발생했을 때 주제(Subject)라 불리는 객체가 다른 객체 리스트(옵저버)에 자동으로 알림을 보내야 하는 상황에서 사용한다. 예를 들어서 자신이 구독한 유튜브 채널에서 영상이 올라오면 구독자들에게 알림이 오는데 이런 상황에서 옵저버 패턴을 사용한다. 구독자(옵저버)들이 유튜버(주제 객체)를 관찰하고 있는 것이다. 옵저버 패턴 구조 Observer : 데이터의 변경을 통보받는 인터페이스..
자바가 열거 타입을 지원하기 전 로또의 등수를 표현한다고 가정해보자. 열거 타입을 쓸 수 없다면 다음과 같이 표현할 수 있을 것이다. public static final int LOTTO_RANK_FIRST = 1; public static final int LOTTO_RANK_SECOND = 2; public static final int LOTTO_RANK_THRID = 3; public static final int LOTTO_RANK_FOURTH = 4; public static final int LOTTO_RANK_FIFTH = 5; public static final int LOTTO_RANK_NOTHING = 0; 1등은 정수 1로, 5등은 5로, 꽝은 0으로 정수를 열거하여 작성했다. 이렇..
로또 미션 로또 번호를 캐싱하여 불필요한 인스턴스 생성 방지 private static final Map lottoNumbers = new HashMap();; static { for (int number = MINIMUM_LOTTO_NUMBER; number LottoNumber.getInstance(source)) .isInstanceOf(IllegalArgumentException.class); } 테스트를 작성할 때 경곗값을 잘 정의하는 것이 중요하다. 로또 번호의 비즈니스 로직이 1부터 45 사이의 정수여야 하기 때문에 예외로 0과 46을 넣어서 테스트했더니 경곗값을 잘 활용했다며 리뷰어님이 칭찬해 주셨다. 객체 역할과 책임 설계 객체에게 역할과 책임을 알맞게 배분하는 일은 항상 어렵고 고민이 ..
· JAVA
우아한테크코스 로또 미션을 진행하던 중 두 리스트를 비교하여 테스트할 일이 있었다. @Test @DisplayName("수동 로또 번호 생성 검증") void createLottoTicketsByManual() { List lottoNumbers = List.of(List.of(1, 2, 3, 4, 5, 6), List.of(7, 8, 9, 10, 11, 12)); List lottoTickets = lottoMachine.purchaseLottoTicketsByManual(lottoNumbers); Iterator iterator = lottoNumbers.iterator(); for (LottoTicket lottoTicket : lottoTickets) { List ticketNumbers = lo..
스트림을 사용하면 내부 반복으로 네이티브 자바 라이브러리가 스트림 요소의 처리를 제어할 수 있다. 따라서 개발자는 컬렉션 데이터 처리 속도를 높이려고 따로 고민할 필요가 없다. 컴퓨터의 멀티코어를 활용해서 파이프라인 연산을 실행할 수 있다는 점이 중요한 특징이다. 7.1 병렬 스트림 컬렉션에 parallelStream을 호출하면 병렬 스트림이 생성된다. 병렬 스트림이란 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림이다. 따라서 모든 멀티코어 프로세서가 각각의 청크 처리를 할당할 수 있다. 병렬 실행이 무조건 빠른 것은 아니다. static long sum(int n) { long sum = 0; for (int i = 0; i < n; i++) { sum += 1; } re..
더즈
'java' 태그의 글 목록 (2 Page)