Java

· Java
Java 8 API의 몇몇 함수형 인터페이스는 다양한 유틸리티 메서드를 포함한다. 예를 들어 Comparator, Function, Predicate 같은 함수형 인터페이스는 람다 표현식을 조합할 수 있도록 유틸리티 메서드를 제공한다. 이것은 무슨 의미일까? 간단히 말해, 간단한 여러 개의 람다 표현식을 조합해서 두 Predicate의 or 연산을 수행하는 커다란 Predicate를 만들 수 있다. 또한 한 함수의 결과가 다른 함수의 입력이 되도록 두 함수를 조합할 수 있다. 그런데 Java 8 API에서 지원하는 Comparator, Function, Predicate 인터페이스는 함수형 인터페이스 아닌가? "함수형 인터페이스는 추상화 메서드가 1개뿐이라며?!" 라고 생각할 수 있을것이다. 그렇다. 추..
· Java
메서드 참조란? 메서드 참조는 특정 람다의 축약형이라고 생각할 수 있다. 메서드 참조를 이용하면 기존 메서드 정의를 재활용해서 람다처럼 전달할 수 있으며 때로는 람다 표현식보다 메서드 참조를 사용하는 것이 더 가독성이 좋으며 자연스러울 수 있다. inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())); // 람다 표현식 inventory.sort(compareTo(Apple::getWeight)); // 메서드 참조 위 코드를 보면 Apple::getWeight는 Apple에 정의된 getWeight의 메서드 참조다. 메서드명 앞에 구분자(::)를 분해 방식으로 메서드 참조를 활용하였다. 메서드 참조를 이용하면 같은..
· Java
자바 8 라이브러리 설계자들은 java.util.function 패키지로 여러가지 새로운 함수형 인터페이스를 제공한다. Predicate java.util.function.Predicate 인터페이스는 test라는 추상 메서드를 정의하며 test는 제네릭 형식 T의 객체를 인수로 받아 boolean을 반환한다. T 형식의 객체를 사용하는 boolean 표현식이 필요한 상황에서 Predicate 인터페이스를 사용할 수 있다. @FunctionalInterface public interface Predicate { boolean test(T t); } public List filter(List list, Predicate P) { List results = new ArrayList(); for (T t:li..
· Java
람다란 무엇인가? 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 람다라는 용어는 람다 미적분학 학계에서 개발한 시스템에서 유래했다. 람다 표현식에는 이름은 없지만 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있다. 람다의 특징을 하나씩 살펴보자. 익명 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다. 구현해야 할 코드에 대한 걱정거리가 줄어든다. 함수 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다. 전달 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성 익명 클래스처럼 많은 코드를 구현할 필요가 없다...
· Java
동작 파라미터화란? 우리가 어떤 상황에서 일을 하든 소비자 요구사항은 항상 바뀐다. 변화하는 요구사항은 소프트웨어 엔지니어링에서 피할 수 없는 문제다. 회사에서 매일 점심 메뉴를 정해야 하는데 매일 변하는 과장님의 입맛을 맞춰서 정해야 한다고 예를 들어보자. 월요일 - "주말에 과식을 했으니 칼로리가 적은 음식을 먹어야겠어" 화요일 - "어제는 칼로리가 적은 음식을 먹었으니 오늘은 푸짐한 음식을 먹고 싶어" 수요일 - "어제 퇴근하고 술을 먹어서 해장으로 국물이 있는 음식을 먹고 싶어" 목요일 - "스트레스를 받으니 매운 음식을 먹고 싶군" 금요일 - "오늘은 금요일이라 기뻐서 칼로리가 높은 음식을 먹을래!" 이렇게 자주 변화하는 요구사항에 동작 파라미터화(Behavior Parameterization)..
· Java
Java 패키지를 Github에 간단히 릴리즈 해 배포 후 다른 프로젝트에서 쉽게 사용할 수 있다. 나의 경우는 프로젝트마다 Message Queue를 사용하는데 큐를 보내고, 받는 페이로드를 공통으로 사용하고 있다. 보안이 중요하지 않은 코드는 릴리즈 해 사용하는것도 편리한 방법이 될 것 같다. 인텔리제이, Gradle 기준으로 정리하겠다. 일단 배포할 모듈을 생성한다. 예제를 찾다보면 maven plugin을 적용하면 된다고 하는데 Gradle 7버전에는 maven plugin이 지원되지 않는듯하다. Gradle 7버전 이상을 사용한다면 모듈을 생성 후 build.gradle에 maven-pulish 플러그인을 적용해준다. plugins { id 'java' } // maven-publish 추가 시..
· Java
이번에는 Spring Boot 프로젝트에서 Slack으로 메세지를 발송할것이다. 매우매우매우 간단하다. 먼저 Slack에 앱을 추가해준다. 메세지를 받을 채널에 앱을 추가해준다. 메세지를 보낼 이름과 아이콘을 설정한다. 이제 Java에서 POST로 웹 후크 URL로 호출만 하면 된다. payload={"text": "보낼 메세지 내용"} @Component public class SlackUtil { private static final String webHookUrl = "https://hooks.slack.com/services/12421421421421412412414"; public static void messageSend(String message) { try { URL url = new UR..
· Spring
log4j(Log For JAVA)란? Java 기반 Logging 유틸리티로써 debug용 도구로 주로 사용된다. 애플리케이션에 문제 발생 시 문제의 위치를 빠르고 정확히 파악하기 위해 사용한다. 또한 성능 및 속도에 영향을 미치지 않고 편리하게 사용할 수 있다. log4j의 특징 속도 최적화 thread-safe 하다. 즉, 멀티스레드 환경에서도 안전 properties 파일과 xml 형식으로 실행 중 수정 적용 가능 5단계의 레벨의 장애를 사용(DEBUG < INFO < WARN < ERROR
· Java
컬렉션 프레임워크(Collection Framework)란? 다수의 데이터(데이터 그룹)를 저장하는 클래스들을 표준화한 설계 컬렉션 프레임워크의 핵심 인터페이스 컬렉션을 크게 List, Set Map 3가지 타입이 존재한다. List와 Set은 공통된 부분이 많아 Collection 인터페이스로 정의 할 수 있지만, Map은 전혀 다른 형태이므로 상속계층에 포함되지 않는다. Vector, Stack, Hashtable, Properties와 같은 클래스들은 컬렉션 프레임워크가 만들어지기 이전부터 존재하던것이기 때문에 컬렉션 프레임워크의 명명법을 따르지 않는다.(사용하지 않는것이 좋다) Collection 인터페이스 List 인터페이스 순서가 있는 데이터의 집합, 데이터의 중복을 허용 구현 클래스 : Ar..
· Java
String Class 기존에 다른 언어에서는 문자열을 char형의 배열로 다루었으나 자바에서는 문자열을 위한 클래스를 제공한다. String클래스는 문자열을 저장하고 이를 다루는데 필요한 메서드를 제공한다. 변경 불가능한(immutable) 클래스 String클래스에는 문자열을 저장하기 위해서 문자형 배열 변수(char[]) value를 인스턴스 변수로 정의해놓고 있다. 인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스변수(value)에 문자형 배열(char[])로 저장되는 것이다. public final class String implements ... { private char[] value; ... } 한번 생성된 String 인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, ..
beekei
'Java' 태그의 글 목록 (3 Page)