본문 바로가기

강의/TDD, Clean Code with Java 12기

람다 실습 1 - 익명 클래스를 람다로 전환

람다 실습 1 - 익명 클래스를 람다로 전환

  • Car 클래스는 아래와 같다.
package nextstep.fp;

import java.util.Objects;

public class Car {
    private final String name;
    private final int position;

    public Car(String name, int position) {
        this.name = name;
        this.position = position;
    }

    public Car move(MoveStrategy moveStrategy) {
        if (moveStrategy.isMovable()) {
            return new Car(name, position + 1);
        }
        return this;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Car car = (Car) o;
        return position == car.position &&
                Objects.equals(name, car.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, position);
    }
}
  • Movestrategy 추상 메서드는 아래와 같다.
public interface MoveStrategy {
    boolean isMovable();
}
  • 다음 테스트 코드는 MoveStrategy에 대한 익명 클래스로 구현하고 있는데 람다를 적용해 구현해보자.
// nextstep.fp.CarTest의 이동, 정지 method
public class CarTest {
    @Test
    public void 이동() {
        Car car = new Car("pobi", 0);
        Car actual = car.move(new MoveStrategy() {
            @Override
            public boolean isMovable() {
                return true;
            }
        });
        assertEquals(new Car("pobi", 1), actual);
    }

    @Test
    public void 정지() {
        Car car = new Car("pobi", 0);
        Car actual = car.move(new MoveStrategy() {
            @Override
            public boolean isMovable() {
                return false;
            }
        });
        assertEquals(new Car("pobi", 0), actual);
    }
}

 

  • 람다를 적용한 코드는 아래와 같다.
public class CarTest {
    @Test
    public void 이동() {
        Car car = new Car("pobi", 0);
        Car actual = car.move(() -> true);
        assertThat(actual).isEqualTo(new Car("pobi", 1));
    }
    
    @Test
    public void 정지() {
      Car car = new Car("pobi", 0);
      Car actual = car.move(() -> false);
      assertEquals(new Car("pobi", 0), actual);
    }
}

car.move는 매개변수로 MoveStrategy 타입을 받고 있다.

MoveStrategy 인터페이스는 추상 메서드 isMovable 한개만을 가지고 있다.

isMovable 메서드는 매개 변수가 존재하지 않으며, boolean 값을 return 받고 있다.

public void 정지() {
  Car actual = car.move(() -> false);
  // isMovable 메서드는
  // 매개변수가 존재하지 않으며 : ()
  // return 값은 false로 지정할 것이다. : false
}

인터페이스에 존재하는 추상 메서드가 1개일 때만 가능하다.

public void 정지() {
  Car actual = car.move(() -> false);
    
  Car actual = car.move(new MoveStrategy() {
      @Override
      public boolean isMovable() {
          return false;
      }
  }
}

[참고]

https://nlp.jbnu.ac.kr/PL2020/java_lambda_expression.pdf

위 파일에서 메소드의 매개변수로 람다식 전달 부분을 추가로 살펴보면 도움이 될 것이다.