제네릭스 ( Generics ) : 데이터 타입을 나중에 확정하는 기법
클래스나 메서드를 선언할 때 어떤 데이터가 올지 확신이 없다면, 제네릭 타입으로 구현
=> 나중에 객체 생성시 타입을 확정하여 구현
객체의 타입을 컴파일 할 때 체크할 수 있어서 안정성을 해치지 않는 선에서 적당히 형변환이 가능한 기법
안정성 - 의도하지 않은 타입의 객체가 저장되는것을 막는 것.
제네릭의 타입값은 대문자로 ( 미지수 x를 많이쓰는것처럼 K, V 를 많이씀 )
객체 구현시 타입을 적어서 처리 ( 안써도 형변환 해주면 가능 )
Lambda + Stream => 람다와 스트림
javascript에서 arrowFunction(화살표함수) 와 비슷한 형태
lambda : 람다식 ( 식을 단순하게 표현하는 방법 )
외부자료의 부수적인 영향 (side effect)를 주지 않도록 구현하는 방법
Stream : 자료의 대상과 관계없이 동일한 연산을 수행할 수 있도록 해주는 반복자 - 메서드 체이닝 기법을 사용
- 람다의 표현식
(매개변수) -> {구현}
매개변수가 1개면 () 생략가능
x -> { return x+1; }
(x,y) -> { return x+y; }
return이 없으면 { 생략가능 }
x -> x+1;
x -> return x+1 ; // 오류
Lambda function : 익명클래스를 사용하여 쓰는 함수
람다식의 장점 : 코드간결성, 병령처리가능, 불필요한 연산 최소화
단점 : 가독성이 떨어짐. 반복문 사용시 성능저하
Consumer : 값이 1개 / BiConsumer : 값이 2개
함수형 인터페이스 생성
메서드가 1개여야만 함.
@FunctionalInterface
interface Number{
int add(int a, int b);
// int sub(int a, int b); // 메서드가 2개면 error
}
@FunctionalInterface를 달아주어야함 함수형 인터페이스인걸 나타내기위해.
Stream(스트림)
- 실제 입력(출력)되는 데이터의 흐름.
- 파이프 라인으로 데이터가 흘러가는 흐름의 개념
- 스트림은 자료에 스트림을 생성하여 연산(복사본)
- 스트림 연산은 연산을 다 수행하면 소모됨.(1회성)
- 기존 자료를 복사하여 스트림을 구성하기 때문에 기존 자료의 변경을 유발하지않음.
스트림용 연산이 별도 존재
중간연산, 최종연산으로 구분됨
중간연산 : 메서드를 이어서 사용할 수 있음.
- distinct() : 중복제거
- filter() : 조건에 맞는 자료만 다음 스트림으로 이동
- limit() : 스트림의 일부를 잘라냄
- skip() : 스트림의 일부를 건너뜀
- sorted() : 정렬 ...
최종연산 : 스트림의 최종 결과 연산 ( 마지막자리에서만 가능 )
- forEach(),count(),sum() ...
- allMatch() : 스트림 요소가 전부 일치하는지..
- anyMatch() : 하나라도 일치하는지...
- toArray() : 배열로변환
- collect() : 스트림수집
count() 연산은 return Long
average() 연산은 return OptionalDouble
max() 는 return OptionalInt
Optional : nullPointException 같은 Exception을 처리할 수 있게 도와줌.
Student 클래스를 만들어서 이름 , 점수만 받아서
Student 리스트를 만들고 Stream으로 출력해보기
List<Student> list = new ArrayList<>();
list.add(new Student("홍길동",80));
list.add(new Student("이영한",46));
list.add(new Student("김성대",53));
list.add(new Student("최윤환",74));
list.add(new Student("김정현",90));
list.stream().forEach(n -> {
System.out.println(n);
});
list.stream()
.forEach(n -> {
String name = n.getName();
int point = n.getPoint();
System.out.println(name + " => " + point);
});
// list의 점수 합계 / 전체 인원수
int sum = list.stream()
.mapToInt(n -> n.getPoint())
.sum();
System.out.println("점수합계 : " + sum);
long cnt = list.stream().count();
System.out.println("인원수 : " + cnt);
System.out.println("--------- 이름 내림차순 ---------");
list.stream().sorted(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getName().compareTo(o1.getName());
}
})
.forEach(n -> System.out.println(n));
임의로 5명을 추가해준 다음에 출력해보고 점수합계와 인원수를 stream으로 출력해봄.
이름기준으로 오름, 내림차순을 해보기위해 Comparator을 이용.
public class Student {
private String name;
private int point;
public Student() {
}
public Student(String name, int point) {
this.name = name;
this.point = point;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
@Override
public String toString() {
return "Student [ " + name + " : " + point + " ]";
}
}
'자바 수업 정리' 카테고리의 다른 글
수업정리 17일차. (1) | 2024.10.15 |
---|---|
수업정리 16일차. (3) | 2024.10.14 |
수업정리 14일차. (0) | 2024.10.10 |
수업정리 13일차. (2) | 2024.10.08 |
수업정리 12일차. (5) | 2024.10.07 |