public class StoreService {
private StoreDTO[] storeDTOS;
public StoreService(StoreDTO[] storeDTOS) {
this.storeDTOS = storeDTOS;
}
public StoreDTO findByMenuName(String menuName) {
//...
return null;
}
}
로직위주의 클래스
메소드 우선 설계
파라미터와 리턴타입으로 데이터 위주의 클래스 타입 (StoreDTO) 활용
생성자 의미 - Ready 준비
멤버변수 - 누적 / 상태 / 조력자
ⅰ) 메소드 우선 설계
ⅱ) 메소드 - 파라미터XX, 리턴타입XX
public class StoreUI {
public void fnMenu() {
System.out.println("원하는 메뉴?");
}
}
public class Main {
public static void main(String[] args) {
StoreUI storeUI = new StoreUI();
storeUI.fnMenu();
}
}
원하는 메뉴?
public class StoreUI {
private Scanner scanner;
public void fnMenu() {
System.out.println("원하는 메뉴?");
scanner = new Scanner(System.in);
}
}
클래스 영역에 인스턴스로 선언하면 클래스 전체에서 사용할 수 있음
여러 메소드에서 공유해서 사용 가능
인스턴스마다 고유의 상태 유지
해당 클래스의 인스턴스가 만들어질 때 같이 생성되었다가 같이 소멸함
생성자 - 일종의 제한사항
이게 있어야만 작동된다 그런식으로 생각하기
public class StoreUI {
private Scanner scanner;
public StoreUI() {
this.scanner = new Scanner(System.in);
}
public void fnMenu() {
System.out.println("원하는 메뉴?");
}
}
내부에서 외부에 있는 멤버변수 scanner에 접근하기 위해 this 사용
-> this는 안써줘도 무방함
public class StoreUI {
private Scanner scanner;
public void fnMenu() {
System.out.println("원하는 메뉴?");
String menuStr = this.scanner.nextLine();
System.out.println(menuStr);
}
}
this.scanner.nextLine(); 에서 this.을 통해 scanner로 넘어갔는데 scanner에서 new로 받아주는 것이 없어서 NullPointerException 에러가 발생하는 것
public class StoreUI {
private Scanner scanner;
//의존성 주입
public StoreUI(Scanner scanner) {
this.scanner = scanner;
}
public void fnMenu() {
System.out.println("원하는 메뉴?");
String menuStr = this.scanner.nextLine();
System.out.println(menuStr);
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
StoreUI storeUI = new StoreUI(scanner);
//의존성 주입
storeUI.fnMenu();
}
}
Main에서 scanner를 넣어주지 않으면 실행이 안되도록 설계 -> 의존성 주입
의존성 주입 -> 의존적 관계 <-(생성자 주입 / setter 주입 쓰기도함)
-> 외부에서 필요한 객체 생성 주입
-> 내부에서 new
=> 스프링
public class StoreUI {
private Scanner scanner;
//협력자 - 의존성
private StoreService storeService;
public StoreUI(Scanner scanner, StoreService storeService) {
this.scanner = scanner;
this.storeService = storeService;
}
public void fnMenu() {
System.out.println("원하는 메뉴?");
String menuStr = this.scanner.nextLine();
System.out.println(menuStr);
}
}
public class Main {
public static void main(String[] args) {
StoreService service = new StoreService();
Scanner scanner = new Scanner(System.in);
StoreUI storeUI = new StoreUI(scanner, service);
storeUI.fnMenu();
}
}
StoreUI에 협력자 기능을 할 StoreService의 인스턴스를 추가해 불러옴
StoreUI에 StoreService를 파라미터로 포함한 새로운 생성자 만들기
Main에서 StoreService의 인스턴스를 생성하고 StoreUI의 인스턴스를 생성하면서 생성자에 맞게 파라미터를 입력해줌
public class StoreService {
private StoreDTO[] storeDTOS;
public StoreService() {
this.storeDTOS = new StoreDTO[]{
StoreDTO.builder().name("A").menu("a").build(),
StoreDTO.builder().name("B").menu("b").build(),
StoreDTO.builder().name("C").menu("c").build(),
StoreDTO.builder().name("D").menu("d").build(),
StoreDTO.builder().name("E").menu("e").build(),
StoreDTO.builder().name("F").menu("f").build(),
/*...*/
};
}
public StoreDTO findByMenuName(String menuName) {
/*...*/
return null;
}
}
public class StoreUI {
private Scanner scanner;
private StoreService storeService;
public StoreUI(Scanner scanner, StoreService storeService) {
this.scanner = scanner;
this.storeService = storeService;
}
public void fnMenu() {
System.out.println("원하는 메뉴?");
String menuStr = this.scanner.nextLine();
System.out.println(menuStr);
StoreDTO storeDTO = this.storeService.findByMenuName(menuStr);
System.out.println(storeDTO);
}
}
public class StoreService {
private StoreDTO[] storeDTOS;
public StoreService() {
this.storeDTOS = new StoreDTO[]{
StoreDTO.builder().name("A").menu("a").build(),
StoreDTO.builder().name("B").menu("b").build(),
StoreDTO.builder().name("C").menu("c").build(),
StoreDTO.builder().name("D").menu("d").build(),
StoreDTO.builder().name("E").menu("e").build(),
StoreDTO.builder().name("F").menu("f").build(),
StoreDTO.builder().name("FFFF").menu("f").build(),
StoreDTO.builder().name("홍콩반점").menu("짜장면, 짬뽕").build()
};
}
public StoreDTO findByMenuName(String menuName) {
Optional<StoreDTO> result =
Arrays.stream(this.storeDTOS).filter(storeDTO -> storeDTO.getMenu().indexOf(menuName)>=0).findFirst();
if (result.isPresent()){
return result.get();
} else {
return null;
}
}
}
public class Main {
public static void main(String[] args) {
StoreService service = new StoreService();
Scanner scanner = new Scanner(System.in);
StoreUI storeUI = new StoreUI(scanner, service);
storeUI.fnMenu();
}
}
원하는 메뉴?
짜장
짜장
StoreDTO(name=홍콩반점, lat=0.0, lng=0.0, menu=짜장면, 짬뽕, score=0.0)
Process finished with exit code 0