자바 공부를 하면서 스프링 실습을 진행중인데 마침 오늘 실습했던 음식 주문 과정 구현하는 부분에서 객체의 같고 다름을 판단하는 부분이 나와서 연계해서 작성해 보았습니다.
해당 프로젝트는 다음과 같은 요구사항이 있습니다.
음식 주문 project의 설계 및 요구사항
- 도메인을 구성하는 객체에는 어떤 것들이 있는지 고민
- 손님, 메뉴판, 메뉴, 요리사, 요리
- 객체들 간의 관계를 고민
- 손님 -- 메뉴판
- 손님 -- 요리사
- 요리사 -- 요리
- 동적인 객체를 정적인 타입으로 추상화해서 도메인 모델링 하기
- 손님 -- 손님 타입
- 요리 -- 요리 타입
- 메뉴판 -- 메뉴판 타입
- 메뉴 -- 메뉴 타입
- 협력을 설계
- 객체들을 포괄하는 타입에 적절한 책임을 할당
- 구현하기
MenuTest
- 메뉴판에서 메뉴이름에 해당하는 메뉴를 반환한다.
- 메뉴판에 없는 메뉴를 선택할 시 예외를 반환한다.
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
public class MenuTest {
@DisplayName("메뉴판에서 메뉴이름에 해당하는 메뉴를 반환한다.")
@Test
void chooseTest() {
Menu menu = new Menu(List.of(new MenuItem("돈까스",5000), new MenuItem("냉면",7000)));
// 메뉴판에서 메뉴이름에 해당하는 항목을 반환
MenuItem menuItem = menu.choose("돈까스");
// 객체간의 비교를 위해 equals() and hashCode() 필요
assertThat(menuItem).isEqualTo(new MenuItem("돈까스", 5000));
}
@DisplayName("메뉴판에 없는 메뉴를 선택할 시 예외를 반환한다.")
@Test
void chooseTest2() {
Menu menu = new Menu(List.of(new MenuItem("돈까스",5000), new MenuItem("냉면",7000)));
assertThatCode(() -> menu.choose("통닭"))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("잘못된 메뉴 이름입니다.");
}
}
- 메뉴이름에 해당하는 항목을 메뉴판에서 가져오기 위해 객체 간 비교를 진행해야 한다.
- 이때 두 객체가 동일한 객체인지 비교하기 위해 equals() 와 hashCode() 메소드를 필요로 한다.
- 인텔리제이 기준 MenuItem class에서 Generate(Alt+insert) → equals() and hashCode() 를 통해 간단히 override 할 수 있는데 실습하면서 equals()만 하면 되지 hashCode()를 왜해주나 했더니
- 같은 객체라면 hashCode 메서드를 호출했을 때의 결과값인 해시코드도 같아야 하기 때문이었다.
- 이것과 관련 자세한 내용은 아래 java.lang 패키지의 Object 클래스(hashCode()에 정리해놓았다.
java.lang패키지 - Object클래스(hashCode())
2023.05.02 - [JAVA] - java.lang패키지 - Object클래스(equals()) java.lang패키지 - Object클래스(equals()) java.lang 패키지 자바프로그래밍에 가장 기본이 되는 클래스들을 포함 import문 없이 사용 가능 ex) String클래
smallsnail.tistory.com
import java.util.Objects;
public class MenuItem {
private final String name;
private final int price;
public MenuItem(String name, int price) {
this.name = name;
this.price = price;
}
public boolean matches(String name) {
return this.name.equals(name);
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
// Generate(Alt+insert) → equals() and hashCode() 를 통해 간단히 override 가능
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MenuItem menuItem = (MenuItem) o;
return price == menuItem.price && Objects.equals(name, menuItem.name);
}
@Override
public int hashCode() {
return Objects.hash(name, price);
}
}
'SPRING' 카테고리의 다른 글
JDBC (0) | 2023.06.01 |
---|---|
Servlet (0) | 2023.06.01 |
Test code (0) | 2023.05.10 |
도커(docker)설치 후 MySQL에 접속하는 방법 (0) | 2023.05.09 |
도커(docker)란? (1) | 2023.05.09 |