Language 61

긴 함수(2)

조건문 분해하기(Decompose Conditional) 여러 조건에 따라 달라지는 코드를 작성하다보면 종종 긴 함수가 만들어지는 것을 목격할 수 있다. “조건” 과 “액션” 모두 “의도”를 표현해야한다 기술적으로는 “함수 추출하기”와 동일한 리팩토링이지만 의도만 다를 뿐이다. 리팩토링 (전) private Participant findParticipant(String username, List participants) { Participant participant = null; if (participants.stream().noneMatch(p -> p.username().equals(uesrname))) { participant = new Participant(uesrname); participant..

Language/Java 2022.08.14

[리팩토링] 긴 함수

임시 변수를 질의 함수로 바꾸기 (Replace Parameter with Query) 함수의 매개변수 목록은 함수의 다양성을 대변하며, 짧을수록 이해하기 좋다. 어떤 한 매개변수를 다른 매개변수를 통해 알아낼 수 있다면 중복 매개변수라 생각할 수 있다. 매개변수에 값을 전달하는 것은 함수를 호출하는 쪽의 책임이다. 가능하면 함수를 호출하는 쪽의 책임을 줄이고 함수 내부에서 책임지도록 노력한다. 임시 변수를 질의 함수로 바꾸기와 함수 선언 변경하기를 통해 이 리팩토링을 적용한다. 예시 participants.forEach(p -> { long count = p.homework().values().stream() .filter(v -> v == true) .count(); double rate = coun..

Language/Java 2022.08.06

Optional

Optional 이란? 오직 값 한 개가 들어있을 수도 없을 수도 있는 컨테이너 NullPointerException 개발하면서 가장 많이 괴롭히는 예외 중 하나가 NPE(NullPointerException) 이다. 이를 피하기 위해서는 어떤 방법이 있었을까? Test t = null; System.out.println("t = " + t.v); // NPE 발생 //예외 처리 로직 if( t == null) { System.out.println("Test is NULL"); } else { System.out.println(" t = " + t.v); } NPE를 해결하기 위하여 위와 같이 if...else 문으로 null을 검사하는 예외 처리 로직을 추가해야한다. 하지만 이 방법으로는 null값을 ..

Language/Java 2022.07.02

Java8 Stream

Stream 이란? 컬렉션, 배열등에 대해 저장되어있는 요소들을 하나씩 참조하며 반복적인 처리를 가능하게 하는 기능이다. Stream을 이용한다면 불필요한 for문과 그 안에서 이루어지는 if문 등의 분기 처리를 쓰지 않고도 깔끔하게 직관적인 직관적인 코드로 변형할 수 있다. Stream API 사용법 Stream API는 데이터, Stream생성(), 중개연산()...종료연산(); 구조로 사용된다. Stream 특징 데이터를 담고 있는 저장소 (컬렉션)이 아니다 Funtnional in nature 스트림이 처리하는 데이터 소스를 변경하지 않는다 스트림으로 처리하는 데이터는 오직 한번만 처리한다 무제한일 수도 있다(Short Circuit 메소드를 사용해서 제한할 수 있다 중개 오퍼레이션은 근본적으로 ..

Language/Java 2022.07.02

인터페이스 기본 메소드와 스태틱 메소드

기본 메서드 (Default Methods) 인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새 기능을 추가할 수 있다. 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다. 반드시 문서화 할 것. (@implSpec 태그 사용) /** * @IimplSpec * getName()으로 가져온 문자열을 대문자로 바꿔 출력 */ public interface Foo { void printName(); default void printNameUpperCase(){ System.out.println (getName().toUpperCase()); } String getNa..

Language/Java 2022.06.19

메소드 레퍼런스

메소드 레퍼런스란? 람다가 하는 일이 기존 메서드 또는 생성자를 호출하는 거라면, 메소드 레퍼런스를 사용해서 매우 간결하게 표현 즉, 람다식을 더 간결하게 표현하는 방법이 메소드 레퍼런스 이다. 메소드 참조하는 방법 스태틱 메소드 참조 타입::스태틱 메소드 특정 객체의 인스턴스 메소드 참조 객체 레퍼런스::인스턴스 메소드 임의 객체의 인스턴스 메소드 참조 타입::인스턴스 메소드 생성자 참조 타입::new 메소드 또는 생성자의 매개변수로람다의 입력값을 받는다 리턴값 또는 생성한 객체는 람다의 리턴값 이다. 예제 코드 import java.util.Arrays; import java.util.List; import java.util.function.Function; import java.util.functi..

Language/Java 2022.06.18

함수형 인터페이스와 람다 표현식

람다 (인자 리스트) -> { 바디 } // 인자 -> 바디 Function plus10 = (i) -> i + 10; 인자 리스트 인자가 없을때 : () 인자가 한개일 때: (one) 또는 one 인자가 여러개 일 때 : (one, two) 인자의 타입은 생략 가능, 컴파일러가 추론(infer)하지만 명시할 수도 있다. (Integer one, Integer two) 바디 화상표 오른쪽에 함수 본문을 정의한다. 여러 줄인 경우에 {}를 사용해서 묶는다 함 줄인 경우에 생략 가능, return도 생략 가능 import java.util.function.BinaryOperator; import java.util.function.Supplier; public class Foo { public static v..

Language/Java 2022.06.18

자바에서 제공하는 함수형 인터페이스

Function T타입을 받아서 R타입을 리턴하는 함수 인터페이스 사용 방법 1 public class Plus10 implements Function { @Override public Integer apply(Integer integer) { return integer + 10; } } public class Foo { public static void main(String[] args) { Plus10 plus10 = new Plus10 (); System.out.println (plus10.apply ( 1 )); } } 사용 방법 2 import java.util.function.Function; public class Foo { public static void main(String[] args..

Language/Java 2022.06.18

함수형 인터페이스와 람다 표현식 소개

함수형 인터페이스 인터페이스 안에 추상 메소드가 하나만 있는것을 말한다. 함수형 인터페이스를 사용하고 싶으면 @FunctionalInterface 어노테이션을 사용하면 된다. @FunctionalInaterface는 자바에서 지원하기 때문에 import 할 필요가 없고 @FunctionalInaterface을 안써도 사용이 가능하지만 함수형 인터페이스인걸 알리기 위해 사용해주는것이 좋다 @FunctionalInterface을 사용하면 추상 메소드가 2개 이상일시 @FunctionalInterface에 에러 표시가 나타난다. static,default 사용하여 다른 메소드를 사용이 가능하다 @FunctionalInterface public interface RunSomething { void doIt();..

Language/Java 2022.06.15

java8과 java11 차이점

자바8 인터페이스에서 디폴트 메소드와 정적 메소드를 포함 디폴트 메소드는 하위 구현 클래스에서 재정의가 가능하지만, 정적 메소드는 구현 클래스에서 재정의할 수 없다. interface TestInterface { default String logic() { return "test"; } static String logic2() { return "test2"; } } 람다 표현식 람다식은 메소드를 하나의 식으로 표현한 것을 말한다. 그리고 람다식은 함수의 이름이 없기 때문에 익명 함수라고 부르며, 메소드의 매개 변수로 전달되거나 메소드의 결과로 반환될 수 있는 특징이 있어서 함수를 변수로 다룰 수 있다는 장점이 있다. 람다식은 메소드를 식으로 나타낸 것이긴 하지만, 엄밀히 말하면 이 메소드를 가진 객체를 ..

Language/Java 2022.05.08