본문 바로가기
반응형

java25

[자바] java.util.function 패키지 일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해 놓은게 java.util.function 패키지이다. 인터페이스에 정의된 메서드 이름도 통일되고, 재사용성이나 유지보수 측면에서 매번 새로운 함수형 인터페이스를 정의하지 말고, 가능하면 이 패키지의 인터페이스를 활용하는 것이 좋다. 기본 함수형 인터페이스 java.lang.Runnable void run() 매개변수도 없고, 반환값도 없음. Supplier T get() -> T 매개변수는 없고, 반환값만 있음. Spplier : 공급자 - 받는거 없이 주기만 한다. Consumer T -> void accept(T t) Supplier와 반대로 매개변수만 있고, 반환값이 없다. Consumer : 소비자 - 받기만 하고 주는게 없다.. 2023. 3. 3.
[자바] 제네릭 Parameter Type - Naming Conventions 자바 제네릭을 공부할 때 T, V, U, N, K, V, E 등의 알파벳을 볼 수 있는데 의미는 아래와 같다. 파라미터 네이밍 규칙은 아래와 같다. E Element K Key N Number T Type V Value S, U, V etc. 2nd, 3rd, 4th types 꼭 위 알파벳을 써야되는건 아니지만 이런건 이렇게 표현하겠다라는 약속과 같다고 보면 될 것 같다. 2023. 2. 24.
[자바] 메소드 참조 Function f = (String s) -> Integer.parseInt(s); 위 람다식을 표현하면 아래와 같다. Integer wrapper(String s) {//메서드 이름은 의미없음. return Integer.parseInt(s); } 이 때 wrapper 메서드는 그저 값을 받아와서 Integer.parseInt()에게 넘겨주는 일만 한다. 이때 거추장스러운 메소드를 벗겨내고 Integer.parseInt()를 아래와 같이 직접 호출할 수 있다. Function f = Integer::parseInt; //메서드참조 컴파일러는 생략된 부분을 우변의 parseInt메서드의 선언부로부터, 또는 좌변의 Function 인터페이스에 지정된 제네릭 타입으로부터 쉽게 알아낼 수 있다. 또 다른 예.. 2023. 2. 23.
[자바] 함수형 인터페이스(Functional Interface) 자바에서 모든 메서드는 클래스 내에 포함되어야 하는데, 람다식은 메서드가 하나의 독릭접인 기능을 하기 때문에 함수라는 용어를 사용한다고 했다. 사실 람다식은 익명 클래스의 객체와 동등하다. (int a, int b) -> a > b ? a : b new Object() { int max(int a, int b) { return a > b ? a : b; } } 위 코드에서 max는 임의로 이름을 붙인것일뿐 의미는 없다. 람다식으로 정의된 익명 객체의 메서드를 어떻게 호출할 수 있을까? 객체의 메서드를 호출하려면 참조변수가 있어야 한다. 타입 f = (int a, int b) -> a > b ? a : b; 이 경우 참조변수 f의 타입은 어떤 걸로 해야 될까? 참조형이므로 클래스 또는 인터페이스를 사용할 .. 2023. 2. 22.
[자바] 람다식(Lambda expression) JDK1.8 부터 추가된 람다식은 자바가 등장한 이후 가장 큰 변화였다. 람다식의 도입으로 인해, 자바는 객체지향언어인 동시에 함수형 언어가 되었다. 1. 람다식이란? 람다식(Lambda expression)은 간단히 말해서 메서드를 하나의 식(expression)으로 표현한 것이다. 람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해준다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로, 람다식을 '익명 함수(anonymous function)'이라고도 한다. int[] arr = new int[3]; Arrays.setAll(arr, (i) -> (int)(Math.random() * 5) + 1); 위의 식에서 '(i) -> (int)(Math.random() * 5) +.. 2023. 2. 22.
[자바] 제네릭 와일드 카드 제네릭 와일드 카드 제네릭은 아래와 같이 오버로딩하면 컴파일 에러가 발생한다. 제네릭 타입이 다른 것만으로는 오버로딩이 성립하지 않기 때문이다. static Juice makeJuice(FruitBox box) { ... } static Juice makeJuice(FruitBox box) { ... } 제네릭 타입은 컴파일러가 컴파일할 때만 사용하고 제거해버린다. 그래서 위 두 메서드는 오버로딩이 아니라 '메서드 중복 정의'이다. 이럴 때 사용하기 위해 고안된 것이 바로 '와일드 카드' 이다. 와일드 카드는 기호 '?'로 표현하는데, 와일드 카드는 어떠한 타입도 될 수 있다. '?' 만으로는 Object 타입과 다를게 없으므로, 다음과 같이 'extends' 와 'super' 로 상한(upper bou.. 2023. 2. 16.
[자바] Properties Properties Properties는 HashMap의 구버전인 Hashtable을 상속받아 구현한것으로 (String, String) 형태로 저장하는 단순화된 컬렉션클래스이다. 주로 애플리케이션의 환경설정과 관련된 속성(property)을 저장하는데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다. 그래서 간단한 입출력은 Properties를 활용하면 몇 줄의 코드로 쉽게 해결될 수 있다. 메서드 설명 Properties() Properties 객체를 생성 Properties(Properties defaults) 지정된 Properties에 저장된 목록을 가진 Properties 객체를 생성 String getProperty(String key) 지정된 키의 값을 반환 String ge.. 2023. 2. 16.
[자바] HashMap HashMap은 키(key)와 값(value)을 묶어서 하나의 데이터(entry)로 저장한다는 특징을 갖는다. 그리고 해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다. public class HashMap extends AbstractMap implements Map, Cloeable, Serializable { transient Entry[] table; ... static class Entry implements Map.Entry { final Object key; Object value; ... } } HashMap은 Entry 라는 내부 클래스를 정의하고, 다시 Entry 타입의 배열을 선언하고 있다. 키와 값은 별개의 값이 아니라 서로 관련된 값.. 2023. 2. 15.
[자바] HashSet HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션이며, 중복된 요소를 저장하지 않는다. 만약 이미 저장되어 있는 요소와 중복된 요소를 추가하고자 한다면 add나 addAll 메서드들은 false를 반환함으로써 중복된 요소이기 때문에 추가에 실패했다는것을 알린다. HashSet의 특징을 이용하면, 컬렉션 내의 중복 요소들을 쉽게 제거할 수 있다. ArrayList와 같이 List 인터페이스를 구현한 컬렉션과 달리 HashSet은 저장순서를 유지하지 않고 저장순서를 유지하려면 LinkedHashSet을 사용하면 된다. HashSet은 내부적으로 HashMap을 이용해서 만들어졌으며, HashSet이란 이름은 해싱(hashing)을 이용해서 구현했기 때문에 붙여진 것이다. 생성자 또는 메서드 설.. 2023. 2. 15.
반응형