1~3일차 까지는 자바로 프로젝트를 진행했다.
이에 대한 상세 내용은 하단의 게시글에 있다.
https://paabaep.tistory.com/17
프로젝트 이후에는 Junit 5의 사용법을 익혔다.
기존에 쓰던 Junit 4와는 조금 달라졌다.
우선 여기서 사용하는 문법에는 다음과 같은 것들이 있다.
@BeforeAll : 모든 테스트 실행전 최초 한번 실행
@BeforeEach : test 실행할 때마다 test 전에 실행
@Test : test 실행 / static & private 적용 불가
@AfterEach : test 종료할 때마다 test 이후 실행
@AfterAll : 모든 test 종료 후 마지막 실행
@Disabled : test 를 수행하지 않고 path
@DiplayName : test 이름 설정 메소드명 대신 출력
단정문의 문법도 새로 익혔다.
단정문은 이미 구현된 프로그램의 모든 가정의 적합성을 논리적으로 테스트 하는 기능이다.
실행중 발생하는 예외를 단순히 지정된 핸들러로 처리하는 예외와는 다르다.
프로그래머가 맞다는 가정하에 상황에 대한 대한 T/F 체크 이기 때문이다.
다음으로 자바 Stream API와 람다식을 배웠다.
Stream API는 데이터 그룹을 간단하고 효율적으로 처리할 수는 기능으로 데이터 베이스와 같은 연산 수행이 가능하다.
람다식은 메소드를 직접 정의하지 않고 하나의 식으로 표현한 것이다.
예제로 이를 익혀보았다.
package step01;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import model.domain.People;
public class StreamAPI1 {
//step01 - double colon :: 연산자
public static void m1() {
People p1 = new People("뉴재석",30);
People p2 = new People("유재석",40);
People p3 = new People("올드재석",50);
//List<People> 반환
Arrays.asList(p1, p2, p3).forEach(System.out::println);
//이거랑 위랑 같은 코드임!!
List<People> datas = Arrays.asList(p1, p2, p3);
for(People p : datas) {
System.out.println(p);
}
}
//step02 - stream api 활용( -> 처리하는 람다식 활용)
public static void m2() {
ArrayList<Integer> all = new ArrayList<Integer>();
all.add(3); // new Integer(3) 오토박싱
all.add(0);
all.add(99);
all.add(6);
//stream 객체로 변환 -> 6이상인 데이터만 정제 -> int변환 -> 총합 프린트
//filter 메소드의 반환 값은 String타입, 따라서 연산을 위해서 mapToInt() 호출해서 int로 변환
int result = all.stream().filter(v -> v >= 6).mapToInt(i -> i).sum();
System.out.println(result);
System.out.println("---------------------");
//다수의 점수들 중에 70점 넘는 점수만 출력
List<Integer> datas = Arrays.asList(10,20,30,90,70,80,50);
datas.stream().filter(v -> v >= 70).forEach(System.out::println);
Arrays.asList(10,20,30,90,70,80,50).stream().filter(v -> v >= 70).forEach(System.out::println);
System.out.println("---------------------");
System.out.println(all.stream().filter(v -> v<=6).mapToInt(i->i).count());
System.out.println(all.stream().filter(v -> v<=6).mapToInt(i->i).max().getAsInt());//Optional 객체의 내용물 반환
System.out.println(all.stream().filter(v -> v<=6).mapToInt(i->i).max());//6값을 보유한 Optional 객체
System.out.println("---------------------");
//skip(i) i인덱스 값 전까지를 무시, i 부터 출력?
Arrays.asList(10,20,30,90,70,80,50).stream().skip(2).forEach(System.out::println);
System.out.println("---------------------");
Arrays.asList(Arrays.asList(1, 2), Arrays.asList(10, 20), Arrays.asList(100, 200)).stream()
/* .flatMap(i->i.stream()) */.forEach(System.out::println); // [] 식으로 끊어서 출력됨
System.out.println("---------------------");
Arrays.asList(Arrays.asList(1, 2), Arrays.asList(10, 20), Arrays.asList(100, 200)).stream()
.flatMap(i->i.stream()).forEach(System.out::println); //각각을 하나의 Stream으로 묶어서 출력
System.out.println("---------------------");
System.out.println(Arrays.asList(1,2,3,4).stream().reduce((v1,v2)->v1+v2).get());
System.out.println("---------------------");
System.out.println(Arrays.asList(1,2,3).stream().collect(Collectors.toList()));
Arrays.asList(1,2,3).stream().iterator().forEachRemaining(System.out::println);
}
public static void main(String[] args) {
m2();
}
}
Stream API의 주요 클래스에는 Optional이 있다.
null을 대신하기 위해 만들어진 데이터 타입으로 객체를 보유하는 컨테이너의 기능이 가능하다.
이를 학습하기 위한 예제이다.
/*
* Optional API 학습
* 1. list/map/set처럼 데이터 보유 가능
* 2. 필요성
* 실행시 발생가능한 예외중에 널포인트 예외 골치
* try~catch없이 즉 실행시에만 발견
* 예외 발생 하지 않게 안정적인 사전 처리 구현 가능하게 해주는 기술
* 3.
*/
package step01;
import java.util.Optional;
import org.junit.jupiter.api.Test;
public class StreamAPI2 {
// NonOptional
// @Test
public void m1() {
String v = null;
System.out.println(v.length());
}
// Optional
// @Test
public void m2() {
String v = null;
Optional<String> opt = Optional.ofNullable(null);
Optional<String> opt2 = Optional.ofNullable("String");
System.out.println(opt);
System.out.println(opt2);
System.out.println(opt.isPresent()); // null이면 false
System.out.println(opt2.isPresent()); // 아니면 true 반환
// null여부와 무관하게 정상 실행
opt.ifPresent(data -> {
System.out.println(v.length()); // 널이 아니면 실행? 널이면 skip
});
// Optional API 사용시에는 문제가 발생한다고 해도 하단 로직은 정상 실햄
// 서버의 중지 없이 실행 유지
System.out.println("정상실행");
}
// null 불허 _ .of() : null 객체 발생시 널포인트 예외 발생
// of() 사용시에는 ifPresent() 필요성은 없음
// @Test
public void m3() {
String v = null;
Optional<String> opt = Optional.of(v);
Optional<String> opt2 = Optional.of("String");
System.out.println(opt.isPresent());
System.out.println(opt2.isPresent());
// System.out.println(v.length());
System.out.println("정상실행");
}
// orElse()
// 데이터가 널인 경우를 고려해서 실행하고자 하는 로직이 있을 경우 권장
// null 인경우만 실행
// null이 아닌경우엔 Optional 객체가 보유한 객체의 내용값이 출력
@Test
public void m4() {
String v = null;
Optional<String> opt = Optional.ofNullable(v);
System.out.println(opt.orElse("널인 경우 실행"));
Optional<String> opt2 = Optional.ofNullable("string");
System.out.println(opt2.orElse("널인 경우 실행"));
// System.out.println(v.length());
System.out.println("정상실행");
}
}
'부트캠프수업정리' 카테고리의 다른 글
6주차 정리(2/7~2/11) (0) | 2022.02.14 |
---|---|
5주차 정리(2/3~2/4) (0) | 2022.02.04 |
4주차 정리(1/24~1/28) (0) | 2022.01.28 |
2주차 정리(1/11~1/14) (0) | 2022.01.14 |
1주차 정리(1/3~1/7) (0) | 2022.01.07 |