> For the complete documentation index, see [llms.txt](https://blakes-organization.gitbook.io/rainsister/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://blakes-organization.gitbook.io/rainsister/java/java17.md).

# JAVA17

Java16 의 특성중 Instanceof 를 회고하기 위해 그때 코드를 다시 재사용해 보자.[이전글](broken://pages/lEWBwa40mgdPXaSPm3HJ)&#x20;

```java
Map<String, Object> data = new HashMap<>();
data.put("key1", "aaa");
data.put("key2", 111);
if (data.get("key1") instanceof String s) {
  log.info(s);
}
```

value 에는 서로 같지 않은 data 타입이 있다. 이때 instanceof 로 꺼내온 data 타입이 무엇인지를 알아내고 타입에따로 비지니스로직을 처리한다. 더 나아가서 String、Integer、Double 등 더 많은 유형의 데이터 타입이 Map 의 value 값으로 있다면 아래와 같이 해야 되지않을까?

```java
if (data.get("key") instanceof String s) {
  log.info(s);
} else if (data.get("key") instanceof Double s) {
  log.info(s);
} else if (data.get("key") instanceof Integer s) {
  log.info(s);
}
```

하지만 이런 유형의 if else 패턴은 체크포인트가 많아질수로 가독성도 떨어지고 추후 유지보수에도 큰 부담된다. 그러면 switch로 개선해보자.

```java
switch (data.get("key1")) {
  case String s  -> log.info(s);
  case Double d  -> log.info(d.toString());
  case Integer i -> log.info(i.toString());
  default        -> log.info("");
}
```

어떤가? 코드 읽기가 편해졌다.

여기서 추가로 언급해보자면 Lambda 함수를 써서 break 는 더 이상 쓰지 않아도 되게 됐다.

끝!
