IntelliJ와 Lombok을 이용해 프로젝트 만들기(2)

hyunn·2021년 8월 5일
0

Java-basic

목록 보기
19/26
post-thumbnail

[StoreService] 클래스 생성

public class StoreService {

    private StoreDTO[] storeDTOS;

    public StoreService(StoreDTO[] storeDTOS) {
        this.storeDTOS = storeDTOS;
    }

    public StoreDTO findByMenuName(String menuName) {
		//...
        return null;
    }
}

로직위주의 클래스

메소드 우선 설계

파라미터와 리턴타입으로 데이터 위주의 클래스 타입 (StoreDTO) 활용

생성자 의미 - Ready 준비

멤버변수 - 누적 / 상태 / 조력자

[StoreUI] 생성

ⅰ) 메소드 우선 설계

ⅱ) 메소드 - 파라미터XX, 리턴타입XX

public class StoreUI {
    public void fnMenu() {
        System.out.println("원하는 메뉴?");
    }
}

Main에서 StoreUI 불러오기

public class Main {
    public static void main(String[] args) {

        StoreUI storeUI = new StoreUI();

        storeUI.fnMenu();

    }
}

실행결과

원하는 메뉴?

StoreUI 추가

public class StoreUI {

    private Scanner scanner;

    public void fnMenu() {
        System.out.println("원하는 메뉴?");

        scanner = new Scanner(System.in);
    }
}

클래스 영역에 인스턴스로 선언하면 클래스 전체에서 사용할 수 있음
여러 메소드에서 공유해서 사용 가능
인스턴스마다 고유의 상태 유지
해당 클래스의 인스턴스가 만들어질 때 같이 생성되었다가 같이 소멸함

StoreUI 생성자 추가

생성자 - 일종의 제한사항

이게 있어야만 작동된다 그런식으로 생각하기

public class StoreUI {

    private Scanner scanner;

    public StoreUI() {
        this.scanner = new Scanner(System.in);
    }

    public void fnMenu() {
        System.out.println("원하는 메뉴?");

    }
}

내부에서 외부에 있는 멤버변수 scanner에 접근하기 위해 this 사용

-> this는 안써줘도 무방함

NullPointerException 유발

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 에러가 발생하는 것

의존성 주입으로 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

=> 스프링

StoreUI 생성자 수정

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의 인스턴스를 생성하면서 생성자에 맞게 파라미터를 입력해줌

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(),
                /*...*/
        };
    }

    public StoreDTO findByMenuName(String menuName) {
        /*...*/ 
        return null;
    }
}

StoreUI와 StoreService에서 코드 추가하고 Main에서 출력하기

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

0개의 댓글