Justin의 개발 로그
article thumbnail
Java 함수형 프로그래밍 #2
프로그래밍/Java-Spring 2023. 1. 17. 13:16

람다 : 익명 함수 람다식 또는 람다함수는 프로그래밍 언어에서 사용되는 개념으로 익명함수(匿名函數, Anonymous functions)를 지칭한다. 함수형 인터페이스 하나의 추상 메서드만 선언된 인터페이스 람다 표현식으로 함수형 인터페이스의 추상 메서드 구현을 직접 전달할 수 있다. 람다 표현식 = 함수형 인터페이스의 추상 메서드 코드 전달 그렇다면 왜 아래 Comparator 인터페이스는 함수형 인터페이스인가? @FunctionalInterface Comparator { int compare(T o1, T o2); boolean equals(Object obj); } Java의 모든 참조형 객체는 Object 클래스의 equals, getClass, hasCode, toString ... 메서드를 사..

article thumbnail
Java 함수형 프로그래밍
프로그래밍/Java-Spring 2023. 1. 17. 09:39

전통적으로 프로그래밍 언어에는 언어의 구성원(참조, 객체, 클래스, 메소드 등)에게 일급 시민과 이급 시민이라는 등급이 존재한다. Java 7 까지 분류 Java 8~ 이후 메소드도 1급 시민권을 획득 함수형 프로그래밍이 떠오르면서 1급 객체(First-class citizen)란 말을 많이 듣게 되는 것 같다. 1급 객체의 특징은 아래와 같다. 아래 1급시민의 3가지 조건을 충족하는 객체라면 1급객체 라고 할수 있다. 1급 시민의 조건 3가지 1. 변수나 데이타에 할당 할 수 있어야 한다. 2. 객체의 인자로 넘길 수 있어야 한다. 3. 객체의 리턴값으로 리턴 할수 있어야 한다. 주로 사용하고 있는 언어인 JAVA에서는, 함수가 1급 객체에 해당하지 않는다. Kotlin, JavaScript 등의 언어..

Java 8 함수형 인터페이스 (Functional Interface)
프로그래밍/Java-Spring 2023. 1. 11. 15:58

Overview 함수형 인터페이스란 1 개의 추상 메소드를 갖는 인터페이스를 말합니다. Java8 부터 인터페이스는 기본 구현체를 포함한 디폴트 메서드 (default method) 를 포함할 수 있습니다. 여러 개의 디폴트 메서드가 있더라도 추상 메서드가 오직 하나면 함수형 인터페이스입니다. 자바의 람다 표현식은 함수형 인터페이스로만 사용 가능합니다. Functional Interface 함수형 인터페이스는 위에서도 설명했듯이 추상 메서드가 오직 하나인 인터페이스를 의미합니다. 추상 메서드가 하나라는 뜻은 default method 또는 static method 는 여러 개 존재해도 상관 없다는 뜻입니다. 그리고 @FunctionalInterface 어노테이션을 사용하는데, 이 어노테이션은 해당 인터페..

article thumbnail
5. 와일드카드 타입 <?>, <? extends ...> <? super ...>
프로그래밍/Java-Spring 2023. 1. 11. 15:57

5. 와일드카드 타입 , : 제한없음

@RequiredArgsConstructor 를 이용한 의존성 주입
프로그래밍/Java-Spring 2022. 12. 14. 09:43

목표 @RequiredArgsConstructor 어노테이션의 특징과 이를 이용한 의존성 주입 @RequiredArgsConstructor 이 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 합니다. 스프링 의존성 주입의 특징 중 한가지를 이용하는데 다음과 같습니다. 어떠한 빈(Bean)에 생성자가 오직 하나만 있고, 생성자의 파라미터 타입이 빈으로 등록 가능한 존재라면 이 빈은 @Autowired 어노테이션 없이도 의존성 주입이 가능하다. Example @Service @RequiredArgsConstructor public class RequiredArgsC..

매개변수 유효성 검사 Objects.requireNonNull() 및 Test 코드
프로그래밍/Java-Spring 2022. 12. 7. 17:19

Java7 부터 Objects.requireNonNull() 메소드가 있어 더 이상 null 검사를 수동으로 하지 않아도 된다. //생성자 public ClassName(Long id, Long fromMemberId, Long toMemberId, LocalDateTime createAt) { this.id = id; this.fromMemberId = Objects.requireNonNull(fromMemberId) ; this.toMemberId = Objects.requireNonNull(toMemberId); this.createAt = Objects.requireNonNullElse(createAt, LocalDateTime.now()); } Object.requireNonNull() : 반드..

article thumbnail
The Economics of TDD (TDD의 경제성)

[원본 문서] https://semaphoreci.com/blog/economics-of-tdd The Economics of TDD - Semaphore TDD can help you accelerate development and reduce costs over a project’s lifecycle. semaphoreci.com [번역] 관리 관점에서 테스트 주도 개발(TDD) 도입을 설득하기 어려울 수 있습니다. 이는 상대적으로 큰 초기 투자를 수반하고, 명백한(정량적, 사업적으로 보여줄 수 있는) 비즈니스 이점이 없으며, (가장 중요한) 고객(회사)은 테스트가 아닌 기능에 대해 개발 비용에만 주로 관심이 있습니다. 그렇지만, 프로젝트의 다음 이정표에 도달하기 위해 테스팅(TDD)을 줄이려는 유혹..

TDD Mockito 기초 사용법

Gradle.build 설정 dependencies { testCompile('org.junit.jupiter:junit-jupiter-api') testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine') testImplementation ('org.mockito:mockito-core:2.26.0') } [테스트 코드] package mock; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock..

TDD - Junit4, Junit5 예외 테스트 방법

-- Junit5 예외 테스트 샘플 //빌링 금액 단위가 맞지 않으면 에러 처리 if(amount % AMOUNT_OF_MONTH != 0) { throw new InvalidParameterException("금액이 잘 못 되었습니다."); } -- Junit5 예외 발생 + 세부항목 검증 @Test void 빌링_금액예외테스트() { Billing bill; InvalidParameterException exception = assertThrows(InvalidParameterException.class, () -> new Billing(1, LocalDate.now(), 11000) ); assertEquals("금액이 잘 못 되었습니다.", exception.getMessage()); } -- J..

article thumbnail
[TDD]Springboot + Gradle + Jacoco 커버리지 확인

새 프로젝트 설정 IntelliJ -> File -> New Project Gradle, Java, Web 체크 후 [Next] Name 설정 -> [Finish] brew install gradle build.gradle 수정 //[AS-IS] plugins { id 'java' id 'war' } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenCentral() } ... 생략 //[TO-BE] plugins { id 'org.springframework.boot' version '2.2.2.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' id 'java' id..