모던 자바 인 액션 9장 : 컬렉션 API 개선

Adam·2024년 7월 2일
0

모던 자바 인 액션

목록 보기
9/20

가독성과 유연성을 개선하는 리팩터링

가독성 좋은 코드: 다른 사람도 쉽게 이해할 수 있는 코드

가독성을 높이기 위해 문서화를 잘하고, 표준 코딩 규칙을 준수해야 한다

가독성을 높이는 리팩터링

  1. 익명 클래스를 람다 표현식으로 리팩터링

    익명 클래스는 간결한 반면 람다는 간결

    하지만 익명 클래스를 람다 표현식으로 바꾸면 모호함이 초래할 수 있다

  2. 람다 표현식을 메서드 참조로 리팩터링

    메서드 참조의 메서드명으로 코드의 의도를 명확히 할 수 있다

    Collecters API를 사용하면 코드의 의도가 더 명확해진다

  3. 명령형 데이터 처리를 스트림으로 리팩터링

    스트림은 의도를 명확히 보여준다

    멀티코어 아키텍처를 효율적으로 이용할 수 있게해준다

람다를 이용해 변화하는 요구사항에 대응할 수 있는 코드를 구현 가능

람다로 객체지향 디자인 패턴 리팩터링하기

전략패턴

한 유형의 알고리즘을 보유한 상태에서 런타임에 적절한 알고리즘을 선택하는 기법

탬플릿 메서드

특정 알고리즘을 사용해야 하는데 조금 수정하는 상황에서 사용

abstract class OnlineBanking{
	public void processCustomer(int id){
		Customer c = Database.getCustomerWithId(id);
		makeCustomerHappy(c);
	}
	abstract void makeCustomerHappy(Customer c);
}

위 예시에서 OnlineBanking을 상속 받아 makeCustomerHappy 메서드를 구현할 수 있음

옵저버

이벤트 발생시 한 객체가 다른 객체에 자동으로 알람을 보내야 하는 상황에서 사용

의무 체인

한 객체가 작업 처리 → 다음 객체로 결과 전달 → 다른 객체에서 작업 처리 → 다른 객체로 결과 전달 하는 패턴

팩토리

인스턴스화 로직을 클라이언트에 노출하지 않고 객체를 만들 때 사용

public class ProductFactory {
	public static Product createProduct(String name) {
		switch(name){
			case "loan": return new Loan();
			case "stock": return new Stock();
			case "bond": return new Bond();
			default: throw new RuntimeException("No such product " + name);
		}
	}
}

Product p = ProductFactory.createProduct("loan");

생성자와 설정을 외부로 노출하지 않고 클라이언트가 단순하게 상품을 생성

람다 테스팅

보이는 람다 표현식의 동작 테스팅

  • 람다의 동작을 테스트 하기 위해 메서드를 정의하는 것 처럼 람다를 정의하여 테스트 가능하다.

람다를 사용하는 메서드 동작에 집중하라

  • 람다의 목표는 정해진 동작을 다른 메서드에서 사용할 수 있도록 하나의 조각으로 캡슐화 하는 것
  • 람다 표현식을 사용하는 메서드의 동작을 테스트 함으로서 람다 표현식을 검증 할 수 있다.

복잡한 람다를 개별 메서드로 분할

  • 복잡한 로직이 포함된 람다를 구현하게 된다면 로직을 분리 하거나 메서드 레퍼런스를 활용하도록 하자.

고차원 함수 테스팅

  • 메서드가 람다를 인수로 받는다면 다른 람다로 메서드의 동작을 테스트할 수 있다
  • 테스트해야하는 함수가 다른 함수를 반환한다면 앞서 Comparator와 비슷하게 함수형 인터페이스의 인스턴스로 간주하고 테스트

디버깅

디버깅은 다음 두개를 확인해야 한다

  1. 스택 트레이스
  2. 로깅

람다 표현식과 스트림은 기존의 디버깅을 무력화

스택 트레이스 확인

프로그램이 메서드를 호출할 때마다 프로그램에서의 호출 위치, 호출할 때의 인수값, 호출된 메서드의 지역 변수 등을 포함한 호출 정보가 생성되며 이들 정보는 스택 프레임에 저장

문제가 발생한 지점에 이르게 된 메서드 호출 리스트를 얻어서 문제를 파악

람다 표현식은 이름이 없기 때문에 복잡한 스택 트레이스가 생성

정보 로깅

스트림 파이프라인에서 요소를 처리할 때 peek 메서드를 사용하면 스트림을 소비하지 않고, 중간 값을 확인 하는 것이 가능하다.

profile
Keep going하는 개발자

0개의 댓글