본문 바로가기

자바 수업 정리

수업정리 15일차.

제네릭스 ( 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