JAVA Programming/JAVA 개념 정리

JAVA 람다식과 컬렉션 프레임 워크

psy_er 2024. 4. 3. 00:38
728x90

JAVA 람다식과 컬렉션 프레임 워크

 

람다식

람다식이란 메서드를 하나의 식으로 표현한 것이다.

함수를 하나의 식으로 표현함으로써 간략하게 표현을 할 수 있고, 메서드의 이름과 반환값이 사라져 익명함수라고 부른다.

람다식은 익명 함수답게 메서드에서 이름과 반환 타입을 제거하고,  매개변수 선언부와 몸통 {} 사이에 ->를 사용한다.

 

 

람다식 변환하는 방법

1. return 생략

2. 중괄호 생략

3. 중괄호에 문장 하나면 세미콜론 생략 가능

4. 중괄호에 문장이 return 문일 경우 중괄호 생략 불가능, 세미콜론 생략 불가능

5. 매개변수 타입 생략

6. 매개변수 1개이면 매개변수 괄호 생략

7. 매개변수 타입이 있다면, 괄호 생략 불가능

 

 

람다식 변환 예시

예시 1

int max(int a, int b){
   return a>b?a:b;
}

(a,b) -> a>b?a:b

 

예시 2

void printVal(String name, int i){
   System.out.println(name + "=" + i);
}

(name, i) -> System.out.println(name + "=" + i)

 

예시 3

int square(int x){
   return x*x;
}

x -> x*x

 

예시 4

int roll(){
   return (int)(Math.random()*6);
}

() -> {return (int)(Math.random()*6);}

 

예시 5

int sumArr(int[] arr){
   int sum = 0;
   for(int i:arr){
      sum+=i;
   }
   return sum;
}

(int[] arr) -> {
   int sum = 0;
   for(int i:arr){
      sum+=i;
   }
   return sum;
}

 

람다식은 개발을 보다 쉽고 빠르게 하기 위해 만들어진 것 같다!

 

 

Java.util.function 패키지

일반적으로 자주 사용되는 형식의 메서드를 함수형 인터페이스로 정의한 패키지이다.

Java.util.funciton 패키지의 인터페이스를 활용함으로써 재사용 가능하고, 유지 보수 측면에서 좋다.

 

함수형 인터페이스 메서드 반환타입 설명
java.lang.Runable run() void 매개변수 없고, 반환 값 없음
Supplier<T> get() T 매개변수 없고, 반환 값 있음
Consumer<T> accept(T t) void 매개변수 있고, 반환 값 없음
Function<T, R> apply(T t) R 매개변수 있고, 반환 값 있음
Predication<T> test(T t) boolean 매개변수 있고, 반환 타입 boolean

 

람다식을 사용하여 문자열이 비어있는지 확인하는 예시

// 문자열의 길이가 0인 람다식을 Predicate 인터페이스를 구현하여 정의한다.
Predicate<String> isEmptyStr = s -> s.length() == 0;

// 빈문자열 할당
String s = "";

// Predicate 인터페이스의 test 함수를 이용해 String을 받아 Boolean 값을 반환
if(isEmptyStr.test(s)){ // if(s.length() == 0);과 같은 조건문
   System.out.println("빈 문자열 입니다");
}

 

 

컬렉션 프레임워크

컬렉션 프레임워크란 자료구조와 알고리즘을 구조화하여 클래스로 구현한 것이다.

 

 

자바의 자료구조

- List : 순서가 있는 목록, 중복 허용

- Set : 순서 상관없는 목록, 중복 허용하지 않음

- Queue : FIFO

- Map : key-value 형태 저장, 순서 없음, 키 중복 허용하지 않음, 값 중복 허용

 

<List>

배열처럼 인덱스가 있다. 객체를 저장한다.

ArrayList, Vector, LinkedList가 있다.

ArrayList는 Thread safe 하지 않고, Vector는 Thread safe 하다.

Thread safe 하지 않는다는 뜻은 객체 값을 다수가 변경하려고 할 때 문제 발생 가능하다는 얘기.

 

- ArrayList

가장 자주 사용되는 컬렉션 클래스이다.

List <String> list = new ArrayList<String>(30);

ArrayList에 객체를 추가하면 객체가 인덱스로 관리된다.

ArrayList에 저장 공간을 넘어서면 더 큰 새로운 배열을 생성해 복사한 다음 나머지 객체를 저장한다.

ArrayList와 배열의 차이는 인덱스 길이 자동 생성 후 추가.

ArrayList는 자동 동기화 처리가 되지 않아 빠른 처리, But 오버헤드 발생 가능성 증가, 중간 데이터 삽입시 더더욱 성능저하

인덱스 검색, 맨 마지막에 객체 추가 시 좋은 성능

 

- Vector

List<E> list = new Vector<E>();

 

스레드 개수와 상관없이 동기화 처리를 하여 Thread-safe, 자동 동기화 된다.

따라서 멀티 스레드가 동시에 실행 불가능, 안전함

But 싱글스레드 환경에도 동기화 처리를 하므로 성능이 떨어짐.

 

 

- LinkedList

ArrayList는 내부 배열 객체로 저장, But LinkedList는 주소 참조.

순서는 있지만, 인덱스가 존재하지 않아 iterator를 사용해야 한다.

추가/삭제가 빈번하게 일어나는 대용량 데이터 처리 시 성능이 좋다.

 

<Set>

순서가 없고, 데이터 중복을 허용하지 않는다. 인덱스가 없어 iterator를 사용해야 한다.

 

- Set 인터페이스 메서드

기능 메서드 설명
객체 추가 boolean add(E e) 객체 저장 성공시 ture, 중복 객체 저장시 false 리턴
객체 검색 boolean contains (Object o) 주어진 객체가 저장되어 있는지
isEmpty() 컬렉션이 비어 있는지 여부
Iterator<E> iterator() 저장된 객체를 한번씩 가지고 오는 반복자 리턴
int size() 저장된 전체 객체 수 리턴
객체 삭제 void clear() 저장된 모든 객체 삭제
boolean remove(Object o) 주어진 객체 삭제

 

- HashSet

Set<E> set = new HashSet<E>();
Iterator<E> iterator = set.iterator();

 

<Map>

Map 컬렉션은 키(key)와 값(value) 쌍(pair)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다. 여기서 키와 값은 모두 객체이다.  키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.

 

 

* Map의 주요 특징

- 모든 데이터는 키와 값이 존재한다.
- 키가 없이 값만 저장할 수는 없다.
- 값이 없이 키만 저장할 수도 없다.
- 키는 해당 Map에서 고유해야만 한다.
- 값은 Map에서 중복되어도 전혀 상관없다.
- 데이터 추가 순서는 중요하지 않다(데이터를 저장한 순서대로 결과가 출력되지 않는다).

- 키나 값에 null 저장 가능

- 여러 스레드에서 동시 접근 불가능

 

- HashMap

 

HashMap<String, String> map = new HashMap<String, String>();

 

HashMap의 키로 사용할 객체는 hashCode()와 equals() 메서드를 재정의해서 동등 객체가 될 조건을 정해야 한다

동등 객체, 키가 될 조건 : hashCode() 리턴값이 같고, equals() 메서드가 true을 반환할 때

키 타입은 대체로 String을 사용.

String에서는 문자열이 같으면 동등 객체가 될 수 있도록 이미 hashCode()와 equals 메서드가 Override 되어있음.

 

728x90