[TIL] 2월 18일

yeon·2021년 2월 18일
0

미션4 구현

  1. Board 클래스
  • 리스트 whitePawns와 blackPawns : 기물 pawn을 담는 리스트입니다.
  • 리스트 shitePieces와 blackPieces : pawn이외의 기물을 담는 리스트입니다.
  • distinguish() : 인자로 받은 piece가 어느 리스트에 들어가야하는지를 판별해주는 기능을 합니다.
  • add() : piece를 해당하는 리스트에 추가해주는 기능을 합니다.
  • size()와 findPiece() : 이 메소드들은 현재 미션에서는 사용하지 않지만 이전 미션 요구사항에 있었고 다음미션에 사용할 수도 있을거 같아서 메소드명과 매개변수 타입을 수정하고 삭제하지 않고 뒀습니다.
  • initialize() : board에 기물들을 초기화하는 기능을 합니다. initBlackPiece(), initBlackPawn(), initWhitePawn(), intitWhitePiece()를 호출합니다.
  • initBlackPiece() : pawn을 제외한 black 컬러의 Piece의 객체를 생성하여 리스트에 담습니다.
  • initWhitePiece() : pawn을 제외한 white 컬러의 Piece 객체를 생성하여 리스트에 담습니다.
  • initWhitePawn() : white의 pawn을 생성하여 리스트에 담습니다.
  • initBlackPawn() : black의 pawn을 생성하여 리스트에 담습니다.
  • pieceCount() : whitePawns, whitePiece, blackpawns, whitePieces 리스트의 크기의 총합을 구해, 기물들의 총 개수를 반환합니다.
  • showBoard() : 리스트에 담긴 기물들의 representation을 포함한 board를 문자열로 반환합니다.
  • getEmptyResult() : board의 빈공간을 갖는 한 열을 나타내는 문자열을 반환합니다.
  • getWhitePawnResult(), getBlackPawnResult(), getWhitePieceResult(), getBlackPieceResult() : 각각 해당하는 리스트에 담긴 기물들의 representation을 하나의 문자열로 반환합니다.
  1. BoardTest 클래스
  • create() : 보드를 초기화 한 후 (board.initialize()) board의 pieceCount()의 리턴값이 예상하는 값(32)와 같은지 확인합니다.

    board.showBoard()의 리턴값이 예상하는 값과 같은지 확인합니다.

  1. enum Color와 PieceName
  • 체스 기물의 색깔과 종류는 정해져 있기때문에 enum으로 생성했습니다.
  • PieceName에 tempRepresentation 이라는 속성으로 각 기물에 해당하는임시의 representation 값을 갖도록 하였습니다.
  1. Piece 클래스
  • 기존의 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값으로 반환합니다.

  1. PieceTest 클래스
  • 기존의 PawnTest 의 이름을 변경했습니다.
  • create_piece() : 생성된 기물의 생상과 representation이 예상하는 값과 같은지 확인합니다.
  • check_color() : Piece클래스의 isBlack()과 isWhte()의 값이 예상하는 값과 같은지 확인합니다.
  1. StringUtils 클래스
  • StringUtils의 객체를 생성할 수 없도록 기본 생성자를 private으로 설정했습니다.
  • new line문자가 운영체제마다 다르다는 것을 보완하기 위해 상수 NEWLINE을 추가하여 System.getProperty("line.separator") 값을 주었습니다.
  • appendNewLine : 인자로 받은 문자열에 NEWLINE을 더하여 줄바꿈한 문자열을 반환하도록 하였습니다.

메서드의 매개변수에 final 키워드를 붙이는 경우

: 메서드 안에서 변수값을 변경할 수 없다.

Java에서 System.getProperty() 사용법

Java에서 System.getProperty()

자바를 실행할 때, 실행되는 곳의 정보를 얻어오거나 운영체제의 정보가 필요할 때가 있다.

System.getPreperty() 괄호 안에 주어진 특정 문자를 넣으면 그 값이 String으로 출력된다.

예를들어 실행하고 있는 현재 위치를 알고 싶으면 "user.dir"를 인자로 넣으면 된다.

정적 팩토리 메소드

정적 팩토리 메서드(static factory method)

  • 객체 생성을 캡슐화하는 기법
  • 객체를 생성하는 static메소드를 만드는 기법
  • 정적 팩토리 메소드의 이름으로 흔히 사용되는 것들
    • valueOf
    • of
    • getInstance
    • newInstance
    • getType
    • newType
  • 장점
    • 메소드에 이름이 있어서 생성자에 비해 가독성이 좋다.
    • 호출할 때마다 새로운 객체를 생성할 필요가 없다.
    • 하위 자료형 객체를 반환할 수 있다.
    • 형인자 자료형(parameterized type)객체를 만들 때 편하다.
  • 단점
    • 정적 팩토리 메서드만 있는 클래스라면, 생성자가 없으므로 하위 클래스를 못만든다.
    • 정적 팩토리 메서드는 다른 정적 메서드와 잘 구분되지 않는다.

자바의 정석 14장 람다와 스트림

스트림(stream)

스트림이란?(814p)

  • 다양한 데이터소스를 표준화된 방법으로 다루기 위한것
  • 스트림 : 데이터의 연속적인 흐름
  • 스트림을 사용한 코드가 간결하고 재사용성도 높다.

스트림의 연산

  • 스트림을 이용하나 작업
    1. 스트림 만들기
    2. n번의 중간 연산(0~n번)
    3. 최종연산(0~1번)
  • 연산 : 스트림에 정의된 메서드 중에서 데이터 소스를 다루는 작업을 수행하는 것
  • 중간 연산 : 연산 결과가 스트림인 연산, 반복적으로 적용 가능
  • 최종 연산 : 연산 결과가 스트림이 아닌 연산, 단 한번만 적용 가능

스트림의 특징

  • 스트림을 데이터 소스를 읽기만 하고, 변경하지 않는다. (원본 변경 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보다 더 많이 제공한다.

스트림 만들기 (818p)

컬렉션

  • Collection 인터페이스의 stream()메소드를 이용해서 컬렉션을 스트림으로 변환
  • 예시 - List로부터 스트림을 생성
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> intStream = list.stream();
intStream.forEach(System.out::print);

</> 실행 결과
12345

배열

  • 배열을 소스로 스트림을 생성하는 메서드 (Arrays와 Stream에 구현되어 있음)
    • Stream Stream.of(T... values)
    • Stream Stream.of(T[])
    • Stream Arrays.stream(T[])
    • Stream Arrays.stream(T[] array, int startInclusive, int endExclusive)
  • 예시 - 배열로부터 스트림을 생성
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

임의의 수

  • 난수를 요소로 갖는 스트림 생성하기
    • Random 클래스에 있는 메서드를 이용해서 난수 스트림을 반환한다.
    • IntStream ints()
    • LongStream longs()
    • DoubleStream doubles()
    • 이 메서드들은 무한 스트림이여서 limit()을 사용해서 잘라서 유한스트림으로 만들어 줘야한다.
    • 유한스트림으로 만들어주려면 위의 메소드의 인자로 스트림의 크기를 지정해줄 수 있다.
  • 예시
IntStream intStream = new Random().ints();    // 무한 스트림 생성
intStream.limit(5).forEach(System.out::print);

IntStream intStream2 = new Random().ints(5);    // 크기가 5인 난수 스트림 반환 
  • ints() : 무한스트림이다.

    • limit()로 잘라주어야함
    • 아니면 ints(5); 이런식으로 크기를 지정해줘서 유한 스트림으로 반환할 수도 있다.
  • 지정된 범위의 난수를 요소로 갖는 스트림을 생성하는 메서드 (Random 클래스)

    • 무한 스트림

      • IntStream ints(int begin, int end)
      • LongStream longs(long begin, long end)
      • DoubleStream doubles(double begin, double end)
    • 유한 스트림

      • IntStream ints(long streamSize, int begin, int end)
      • LongStream longs(long streamSize, long begin, long end)
      • DoubleStream doubles(long streamSize, double begin, double end)
    • 예시 - 지정된 범위의 난수 스트림 생성

      IntStream intStream = new Random().ints(5, 10);
      intStream.limit(5).forEach(System.out::println);
      
      </> 실행 결과
      9
      6
      7
      8
      8

특정 범위의 정수

  • 지정된 범위의 연속된 정수를 스트림으로 생성한다.
  • IntStream IntStream.range(int begin, int end)
  • IntStream IntStream.rangeClosed(int begin, int end)
    • rangeClosed()는 end값까지 포함해서 반환
  • 예시
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()에 의해 생성된 스트림은 기본형 스트림 타입의 참조변수로 다룰 수 없다.

    • mapToInt()와 같은 메서드로 변환해야함

오늘 한일

  • 자바의 정석 14장 스트림 파트 학습
    • cs10때 함수형프로그래밍이 어려웠어서 다시 공부하고싶다. 함수형 프로그래밍으로 짠 코드가 훨씬 간결해서 그런지 멋있어보인다..
    • 분명히 스트림을 cs10때 학습했는데 다시 강의를 듣기전까지는 이전에 학습한것이 떠오르지 않았다.
    • 두번째로 공부하니 조금 더 이해가 가는 듯하다.
    • 자바의 정석 학습하고 유튜브에 케빈TV 모던 자바도 봐야지
  • 미션4 구현 완료하고 PR 보냄
  • 메서드의 매개변수에 final 붙이는 것의 의미? System.getProperty(), 정적 팩토리 메소드?
  • 어제 일찍 자서 오늘 7시반에 일어났다. 매일 일과시간 30분전에 일어나서 허겁지겁 씻고 책상에 앉았는데 일찍 일어나니 아침도 먹고 공부도 좀 하고 더 좋은거같다. 학습시간에 집중도 더 잘되는 기분이라 내일도 일찍 일어날 예정이다. 내일 아침에는 코테 문제를 풀고싶다. 제발.

Todo

(내일)

  • 오늘 수업한 내용 복습 enum, 참조변수와 함수호출
    • valueObject란

0개의 댓글