create() : 보드를 초기화 한 후 (board.initialize()) board의 pieceCount()의 리턴값이 예상하는 값(32)와 같은지 확인합니다.
board.showBoard()의 리턴값이 예상하는 값과 같은지 확인합니다.
기존의 Pawn 클래스의 이름을 변경하였습니다.
Color타입의 color, PieceName 타입의 name, representation 이라는 속서을 갖도록 했습니다.
생성자에서 인자로 받은 color와 name을 대입하고, createRepresentation()의 리턴값을 representation에 대입하였습니다. 요구사항에서 private으로 지정하라고 하여 생성자를 private으로 설정하였습니다.
createRepresentation() : 기물의 name에 해당하는 각 tempRepresentation 값을 기물의 색이 white면 소문자, black이면 대문자로 반환하도록 구현했습니다.
각각의 기물을 생성하는 메소드들 createWhitePawn(), createBlackPawn(), createWhiteKnight(), createBlackKnight(), createWhiteRook(), createBlackRook(), createWhiteBishop(), createBlackBishop(), createWhiteQueen(), createBlackQueen(), createWhiteKing(), createBlackKing() : PieceTest의 요구사항에서 기물을 생성하는 메소드를 static 메소드를 호출하도록 되어있어서 static 메소드로 구현했습니다.
→ static메소드여야 하는 이유를 생각해보니, 기물들은 외부에서 생성자를 호출하지 못하도록 private으로 생성자를 설정했고, 이 메소드들이 static이여야 Piece객체 생성없이 호출할수 있기 때문에 static 메소드로 정의되어야 한다고 생각했습니다.
isBlack(), isWhite() : 각 기물의 color가 black인지 white인지 여부를 boolean값으로 반환합니다.
메서드의 매개변수에 final 키워드를 붙이는 경우
: 메서드 안에서 변수값을 변경할 수 없다.
Java에서 System.getProperty() 사용법
자바를 실행할 때, 실행되는 곳의 정보를 얻어오거나 운영체제의 정보가 필요할 때가 있다.
System.getPreperty() 괄호 안에 주어진 특정 문자를 넣으면 그 값이 String으로 출력된다.
예를들어 실행하고 있는 현재 위치를 알고 싶으면 "user.dir"를 인자로 넣으면 된다.
정적 팩토리 메소드
정적 팩토리 메서드(static factory method)
자바의 정석 14장 람다와 스트림
스트림의 연산
스트림의 특징
스트림을 데이터 소스를 읽기만 하고, 변경하지 않는다. (원본 변경 X, read only)
스트림은 Iterator처럼 일회용이다.
최종 연산이 수행되기 전까지는 중간 연산이 수행되지 않는다. → 지연된 연산
스트림은 작업을 내부 반복으로 처리한다.
forEach() 메서드가 해당
forEach()는 메서드 안으로 for문을 넣은 것이다.
코드가 간결해진다.
스트림의 forEach()
stream.forEach(System.out::println);
위의 한문장은 원래 이 코드이다.
for(String str : strList) {
System.out.println(str);
}
스트림의 작업을 병렬로 처리
기본형 스트림 제공 - IntStream, LongStream, DoubleStream 등등
Stream 대신에 IntStream을 사용하면 된다.
→ 오토박싱과 언박싱의 비효율이 줄어든다.
숫자와 관련된 유용한 메서드를 IntStream이 Stream보다 더 많이 제공한다.
컬렉션
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> intStream = list.stream();
intStream.forEach(System.out::print);
</> 실행 결과
12345
배열
Stream<String> strStream = Stream.of("a", "b", "c");
strStream.forEach(System.out::println);
</> 실행 결과
abc
기본형 배열을 소스로 하는 스트림을 생성하는 메서드들
IntStream IntStream.of(int ... values)
IntStream IntStream.of(int[])
IntStream Arrays.stream(int[])
IntStream Arrays.stream(int[] array, int startInclusive, int endExclusive)
이외에도 long과 double 타입의 배열로부터 LongStream과 DoubleStream을 반환하는 메서드들도 있다. (위와 같은 형태임)
예시 - 기본형 타입의 배열로부터 스트림 생성
int[] intArr = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(intARr);
intStream.forEach(System.out::print);
</> 실행 결과
12345
임의의 수
IntStream intStream = new Random().ints(); // 무한 스트림 생성
intStream.limit(5).forEach(System.out::print);
IntStream intStream2 = new Random().ints(5); // 크기가 5인 난수 스트림 반환
ints() : 무한스트림이다.
지정된 범위의 난수를 요소로 갖는 스트림을 생성하는 메서드 (Random 클래스)
무한 스트림
유한 스트림
예시 - 지정된 범위의 난수 스트림 생성
IntStream intStream = new Random().ints(5, 10);
intStream.limit(5).forEach(System.out::println);
</> 실행 결과
9
6
7
8
8
특정 범위의 정수
IntStream intStream = IntStream.range(1, 5);
intStream.forEach(System.out::print);
</> 실행 결과
1234
람다식 - iterate(), generate()
Stream 클래스의 iterate()와 generate()는 람다식을 매개변수로 받아서 무한 스트림을 생성한다.
static Stream iterate(T seed, UnaryOperator f)
UnaryOperator : 단항 연산자
이전 요소에 종속적
이전 요소를 seed로 해서 다음 요소를 계산한다.
Stream.iterate(0, n -> n + 2)
.limit(5)
.forEach(System.out::print);
</> 실행 결과
02468
static Stream generate(Supplier s)
Supplier : 입력은 없고, 출력만 있다.
→ 매개변수가 없는 람다식만 허용
이전 요소에 독립적
seed를 사용하지 않는다.
Stream.generate(() -> 1)
.limit(5)
.forEach(System.out::print);
</> 실행 결과
11111
iterate()와 generate()에 의해 생성된 스트림은 기본형 스트림 타입의 참조변수로 다룰 수 없다.
(내일)