LG CNS 부트캠프 학습일지 16일차
학습 내용
- Collection
- Generics
- Stream API
- 예외처리
자바기본문법
Generics에 대해서 배웠다. 코드를 보면 대충 무슨 말인지는 아는데, 직접 구현을 하는 것은 어려워했다. 이번 기회에 Generics와 템플릿에 대해서 배웠다.
1
2
3
4
5
6
7
8
9
10
11
class ResponseTemplate <T> {
private T code;
T getCode() {
return this.code;
}
void setCode(T code) {
this.code = code;
}
}
Collection 인터페이스에 대해서 배웠다. ArrayList, HashMap, HashSet 등 여러 객체를 담아두는 클래스라면 대부분 사용하는 인터페이스이다. 개인적으로 Collections 클래스는 어떤 리스트에서 무작위로 고르기위해 Collections#shuffle() 메소드를 사용하면서 자주 접했다.
Stream은 thread safe 하다는 것을 배웠다. 마인크래프트 모드를 만들 때 자주 사용했지만 마인크래프트는 멀티스레드를 지원하는 게임이 아니라서 아무 생각없이 사용했었다. 알고보니 생각보다 더 많은 편의기능을 제공한다. ArrayList를 Stream으로 변환하고 map, filter, forEach 같은 고차함수를 호출해서 자료를 가공하는 방식으로 사용했다.
1
2
3
4
5
6
7
8
9
10
public void getRandom() {
List<Pokemon> pokemons = new ArrayList<>( ... );
List<Pokemon> filtered = pokemons.stream()
.filter(Species::isFireType)
.toList();
List<Pokemon> random = new ArrayList<>(filtered);
Collections.shuffle(random);
return random.get(0)
}
filter 등의 고차함수에는 Predicate를 전달해주어야 하는데, 참/거짓 값을 반환하는 람다식을 정의할 수도 있다. 개인적으론 위와 같이 method reference를 전달하는 것을 좋아한다.
예외처리
남용한다고 말해도 할 말이 없을 정도로 많이 사용한다. Clean Code의 저자는 예외처리를 사용하는 것을 권장했는데, 코드의 정상흐름 사이사이에 오류를 처리하는 코드가 들어가지 않게되고 가독성을 높이는 효과가 있기 때문이다. 저자의 생각에 동의했고 실제로 적용해보니 효과가 있었다. 만약 예외처리를 사용하지 않았다면 오류코드를 반환하는 함수와 조건을 사용해야했을 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
public doSomething(UserData data) {
if (!isValidName(data)) {
return;
}
processUserName(data.getName());
if (!isValidAddress(data)) {
return;
}
processUserAddress(data.getAddress());
}
하지만 예외처리를 하면 메소드 최상단에 정상흐름을 정의할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
public doSomething(UserData data) {
try {
processUserName(data.getName());
processUserAddress(data.getAddress());
} catch (IllegalNameException e) {
handleIllegalName();
} catch (IllegalAddressException e) {
handleIllegalAddress();
}
}
사실 간단한 예로 들면 조건을 사용한 경우도 크게 어렵지 않아서 어떤 이점이 있는지 이해하기 쉽지 않다. 만약에 정상흐름 전에 오류를 한 번에 점검할 수 있다면 그나마 괜찮다. 하지만 조건문을 사용하면 정상흐름과 오류확인을 번갈아가면서 하는 경우가 많았고, 정상흐름을 파악하기 어려워지는 경험을 많이 했었다.
결론
코딩의 기술이라는 책이 생각났다. 엄청 새로운 내용을 담은 책은 아니었지만 두껍지 않아서 가벼운 마음으로 자주 읽을 수 있는 책이었다. 이 책을 읽고 코드를 작성하는 방식이 꽤 달라졌는데, 그 이유가 고차함수를 사용하라고 강조했기 때문이다. 이 책은 C++를 사용했고 Standard Library가 제공하는 고차함수들을 소개했었다.
고차함수가 좋은 이유는 개발자의 반복문에서 하나의 일만 하게 유도한다는 점이다. 고차함수를 사용하지 않는다면 반복문을 열어서 배열이나 리스트에 담긴 요소를 순회한다. 그리고 각 요소에 접근할 때마다 조건문을 사용해서 분기하고 다른 함수를 호출해서 데이터를 가공하는데, 개발자도 모르는 사이에 반복문 안에서 여러 일이 수행된다. 이렇게 작성한 코드는 나중에 다시 읽으면 이해하기 어려운 경우가 많았다.
고차함수도 일반 반복문과 마찬가지로 람다식을 전달하면서 그 안에서 여러 일을 수행하게 만들 수도 있다. 하지만 method reference를 전달함으로서 각 단계에서 어떤 일을 하는지 이름을 붙일 수 있고 그 메소드를 더욱 작게 만들려는 고민을 하면서 이해하기 쉬운 코드를 작성하는데 도움이 된다고 할 수 있겠다.
Comments powered by Disqus.