일급 함수의 조건 다음 세 가지 조건을 충족하는 함수를 일급 함수라 한다. 변수(variable)에 담을 수 있다. 함수의 인자(parameter)로 전달할 수 있다. → 동작 파라미터화 함수의 반환값(return value)으로 전달할 수 있다. → 고차 함수 즉, 일급 함수는 객체처럼 사용 가능한 함수이다. java에서 일급 함수? 원래 java는 함수를 일급 객체로 취급하지 않았다. 즉, 함수를 파라미터로 넘기거나 반환 값으로 전달할 수 없었다. 하지만 java8 이후, java에서는 함수형 인터페이스 기능을 제공하기 시작하며 (인자로 함수를 전달하고, 반환값으로 함수를 전달할 수 있게됨) 함수를 일급 객체로 사용할 수 있게 되었고, 함수형 프로그래밍이 가능해졌고, 람다식을 통해 함수형을 표현할 수..
이펙티브 자바 아이템1(생성자 대신 정적 팩터리 메서드를 고려하라)를 읽고 사다리 미션에 적용해보며 학습한 내용들을 정리해보자. 사다리 생성 미션을 진행하며, 다음과 같은 궁금증이 들었다. Player의 일급 컬렉션 Players는, 생성자의 파라미터로 List players를 받는게 좋을까, List playerNames를 받는게 좋을까? // 1. List players 받기 public Players(List players) { this.players = players; } // 2. List playerNames 받기 public Players(List playerNames) { List players = playerNames.stream() .map(Player::new) .collect(Col..
마코센세의 나이스샷 명강의를 듣고 감동을 받아 정리해보려한다! 땡큐 마코센세! new vs copyOf Java의 두 가지 복사 방법을 비교해보자. new를 통해 새로운 객체 생성 후 복사하기 copyOf 키워드 사용하기 new를 사용하여 복사하면 기존의 컬렉션과의 참조를 끊어버린다! (새로운 주소값) 하지만 가변이다. (나의 도플갱어가 생겼을 뿐이다. 얘가 지금부터 자기관리를 어떻게 하든 내 알 바 아니다!) copyOf를 사용하여 복사해도 기존 컬렉션과의 참조를 끊어버린다. 하지만 new와 다르게, 불변이다. (ImmutableCollection) (단, 원본이 불변이면 참조를 끊지 않는다. 복사할 때 참조를 끊어주는 이유에 대해 생각해보면 된다. 원본이 변할 때 복사본이 변할것을 대비해 참조를 끊어..
성동일은 아는데, 동일성은 뭘까? ㅋㅋ (죄송합니다) 동일성(Identity)은 두 객체의 메모리 주소가 같음을 의미한다. 동등성(Equality)은 두 객체의 값이 같음을 의미한다. 즉, 동일성은 유전자까지 똑같고, 동등성은 겉보기만 똑같은 것이다! 동일성은 나와 내 복제인간이라면, 동등성은 나와 내 도플갱어 쯤? java 에서 동일성은 ==로, 동등성은 equals로 확인 가능하다! 코드로 확인해보자! void 동일성() { List crews1 = List.of("ash", "ako", "maco"); List crews2 = crews1; System.out.println(crews1 == crews2); // true System.out.println(crews1.equals(crews2)); ..
JUnit5란? 자바 개발자가 가장 많이 사용하는 테스팅 프레임워크이다. Java 8 이상에서 사용 가능하다. JUnit5는 크게 세 개의 모듈로 구성되어 있다. (JUnit4는 단일 jar) JUnit Platform: TestEngine 인터페이스를 정의한다. TestEngine을 통해 테스트를 발견하고, 실행하고, 결과를 보고한다. JUnit Jupiter: TestEngine 구현체 / Jupiter API(Junit5를 위한 테스트 API)를 사용해 작성한 테스트 코드를 실행할 때 사용한다. JUnit Vintage: TestEngine 구현체 / 기존 JUnit3,4 버전으로 작성한 테스트 코드를 실행할 때 사용된다. JUnit5 Gradle 의존성 Junit Jupiter API를 사용해 테..
IntelliJ에서 테스트코드를 작성할 때, Assertions 키워드를 작성하면 자동완성 기능으로 두 가지를 추천해준다. 하나는 org.junit.jupiter.api.Assertions이고, 하나는 org.assertj.core.api.Assertions이다. 강의를 듣거나 다른 사람들의 코드들을 보면, 보동 후자를 사용하곤 한다. 심지어 JUnit5 공식 문서에 가도 서드파티 라이브러리인 AssertJ 사용을 권장한다. 그러면, 왜 다들 AssertJ를 쓰는걸까? 1. 가독성 다음 두 가지 메서드를 보아라. // 1. assertEquals(a, b); // 2. assertThat(a).isEqualTo(b); 1번 코드를 보면 어느것이 실제 값이고, 어느 것이 예상 값인지 쉽게 유추할 수 없다...
public void drive() { Random random = new Random(); int number = random.nextInt(10); if (number >= 4) { position += 1; } } 자동차는 랜덤한 숫자를 하나 선택하고, 이가 4 이상이면 전진한다. 자동차의 전진 여부를 테스트하기 위해선 어떻게 해야할까? @DisplayName("자동차 전진 테스트") @Test void driveTest() { Car car = new Car("test"); car.drive(); assertThat(car.getPosition()).isEqualTo(1); } 이렇게 테스트하면.. 0~3이면 실패고, 4~9면 성공이니 60% 확률로 성공한다. 그러면 이를 @RepeatedTest..
프리코스때는 다음과 같이 InputView에서 도메인을 생성해 return해주었다. // InputView.java public List readCoaches() { List coachNames = readWordsSeparatedByComma(); validateCoach(coachNames); return convertToCoach(coachNames); } 하지만 View에서 Domain을 생성까지 담당하면, InputView의 책임이 너무 커지는 것 같았다. 따라서 이번 미션에서는 InputView는 문자열 및 원시값을 전달해주는 역할만을 하도록했다. Domain으로 바꿔주는 것은 Controller의 책임이라 생각했다. 다만, “a,b,c”를 List.of(a,b,c); 문자열 파싱해주는 것은 ..
입력값 검증을 InputView에서 진행할까, Domain에서 진행할까? 가장 많이 고민했던 부분이다. 입력값 검증을 input할 때 View에서 해야할지, domain을 생성하는 시점에 해야할지 고민했다. 웹서비스에서의 회원가입 절차에서는 올바르지 않은 입력값(ex. 비밀번호 특수문자 미포함, 10자 이하 등)의 경우 주로 웹프론트엔드에서 검증한다. 중복된 아이디의 경우 주로 백엔드에서 검증한다. 따라서 빈 입력값 및 글자수 제한 등의 조건은 View에서 처리하고, 중복 등과 같은 조건은 Domain에서 처리하는 방법을 생각해봤다. 하지만 페어와 협의 과정에서 해당 미션에서는 “자동차 이름이 중복될 수 없다.”라는 조건이 없기에 중복된 이름에 대해서는 이름 뒤에 구분자 및 식별숫자를 붙여주기로 결정했다..