본문 바로가기
교육/Java&Spring

kosta 클라우드 네이티브 애플리케이션 개발 과정 day 9

by Renechoi 2022. 12. 30.

kosta 클라우드 네이티브 애플리케이션 개발 과정 day 9

 


프로그램 개발 (객체지향) 

 

1. 어떤 객체가 필요할까? 

2. 해당 객체에 대한 (특성, 기능) 구분

3. 해당 클래스 생성(필드, 메서드) 구현  + 생성자 정의

4. 객체 생성 => 파라미터값 -> 어떤 생성자를 호출이 결정된다.

5. 객체 => 배열에 추가, 객체(인스턴스 변수): 필드, 메서드 호출 => .(점)

 

메서드. 생성자 : 파라미터의 개수와 데이터형을 기준으로 중복을 체크한다 ! 

=> 파라미터가 달라지거나 데이터형이 달라지면 같은 이름의 메서드가 가능함 

=> 오버로딩 

 


전화번호부를 관리하는 프로그램을 만들어보자 

 

PhoneInfo CRUD program


커스텀 예외처리를 통한 코드 라인 줄이기 

 

객체 배열에서 각 객체마다 해당하는 값을 찾는 코드를 다음과 같이 작성할 수 있다. 

 

String nameRequested = inputView.getName(SEARCH);
System.out.println(contacts.size());
boolean found = false;
for (int i = 0; i < contacts.size(); i++) {
    if (contacts.get(i).equals(nameRequested)) {
        found = true;
        break;
    }
}
if (!found) {
    System.out.println("no such name found !");
}

if (getContact(nameRequested) == null) {
    System.out.println("no such name found !");
    return;
}

 

이와 같은 코드를 stream과 custom 예외 클래스를 사용할시 다음과 같이 축약이 가능하다. 

 

return contacts.stream()
        .filter(c -> c.getName().equals(nameFrom))
        .findFirst()
        .orElseThrow(() -> new InvalidContactException(InvalidContactException.CONTACT_NOT_FOUND));

 

 


전체 클래스 

 

- main 

 

package kosta.mission2.mission2_07;

import kosta.mission2.mission2_07.domain.Controller;
import kosta.mission2.mission2_07.ui.InputView;

public class Main {
    public static void main(String[] args) {
        // TODO : 전화번호부 관리 프로그램을 구현하자
        // 객체 : 한 사람의 전화 내역을 가진다
        //  => 상태 : 이름(name), 전화번호(phoneNo), 생년월일(birth)
        //  => 기능 : 전화번호 내역을 출력(show)
        //
        // 클래스 : PhoneInfo

        // 1. 해당 클래스를 구현하고 객체를 생성하고 사용해보자
        // 2. 키보드로부터 메뉴를 입력 받아 각 케이스를 선택하도록 하자 : 1.추가 2.출력 3. 종료
        // 3. manager 클래스를 생성해서 각각의 기능을 구현하도록 하자
        // 4. 각각 추가, 출력에 대한 기능을 구현
        // 5. 수정
        // 6. 삭제

        InputView inputView = new InputView();

        Controller controller = new Controller(inputView);
        controller.run();
    }
}

 

 

- inputView

 

package kosta.mission2.mission2_07.ui;

import java.util.Scanner;

public class InputView {

    Scanner scanner;

    private enum ConsoleMessage {
        REQUEST_GENERAL_COMMAND("명령을 입력하세요(1.추가 2.전체 조회 3.검색 4.수정 5.삭제 6.종료): "),
        REQUEST_NAME("%s 이름을 입력하세요: "),
        REQUEST_NUMBER("전화번호를 입력하세요: "),
        REQUEST_DOB_YEAR("생년월일을 차례로 입력하세요(년)"),
        REQUEST_DOB_MONTH("생년월일을 차례로 입력하세요(월)"),
        REQUEST_DOB_DATE("생년월일을 차례로 입력하세요(일)");

        private final String message;

        ConsoleMessage(String message) {
            this.message = message;
        }
    }

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

    public int getGeneralCommand() {
        System.out.print(ConsoleMessage.REQUEST_GENERAL_COMMAND.message);
        return validateNumber(scanner.nextLine());
    }

    public String getName(String optionalMessage) {
        System.out.printf(ConsoleMessage.REQUEST_NAME.message, optionalMessage);
        return scanner.nextLine();
    }

    public String getNumber() {
        System.out.print(ConsoleMessage.REQUEST_NUMBER.message);
        return scanner.nextLine();
    }

    public int getDobYear() {
        System.out.print(ConsoleMessage.REQUEST_DOB_YEAR.message);
        return validateNumber(scanner.nextLine());
    }

    public int getDobMonth() {
        System.out.print(ConsoleMessage.REQUEST_DOB_MONTH.message);
        return validateNumber(scanner.nextLine());
    }

    public int getDobDate() {
        System.out.print(ConsoleMessage.REQUEST_DOB_DATE.message);
        return validateNumber(scanner.nextLine());
    }

    public int validateNumber(String userInput) {
        try {
            return Integer.parseInt(userInput);
        } catch (NumberFormatException e) {
            throw new InvalidNumberInputException(InvalidNumberInputException.INVALID_COMMAND);
        }
    }

}

 

- InvalidNumberInputException (inputView 커스텀 예외 클래스)

package kosta.mission2.mission2_07.ui;

public class InvalidNumberInputException extends IllegalArgumentException{
    public static final String INVALID_COMMAND= "입력값이 잘못되었습니다. 숫자만 입력하세요";

    public InvalidNumberInputException(String s){
        super(s);
    }
}

 

- controller

 

package kosta.mission2.mission2_07.domain;

import kosta.mission2.mission2_07.ui.InputView;

public class Controller {

    private InputView inputView;

    public Controller(InputView inputView) {
        this.inputView = inputView;
    }

    public static final int QUIT_COMMAND = 6;

    public void run() {
        Management management = new Management();

        while (true) {
            try {
                Command command = Command.of(inputView.getGeneralCommand());
                if (isQuit(command)) {
                    break;
                }
                command.systemAction(management, inputView);
            } catch (IllegalArgumentException e) {
                System.out.println(e.getMessage());
            }
        }
    }

    private static boolean isQuit(Command command) {
        return command.getCommand() == QUIT_COMMAND;
    }
}

 

 

- contact 

 

package kosta.mission2.mission2_07.domain;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Contact {
    private String name;
    private String number;
    private LocalDate dob;
    private String dobFormatted;


    Contact(){
    }

    public Contact(String name, String number, LocalDate dob) {
        this.name = name;
        this.number = number;
        this.dob = dob;
        this.dobFormatted = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일").format(dob);
    }

    public String getFormattedDob(){
        return this.dobFormatted;
    }

    public void printContactInfo() {
        System.out.printf("\n이름: %s 전화번호: %s 생년월일: %s\n\n", name, number, dobFormatted);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

 

- InvalidContactException (커스텀 예외 처리)

package kosta.mission2.mission2_07.domain;

public class InvalidContactException extends IllegalArgumentException{
    public static final String CONTACT_NOT_FOUND= "해당하는 contact가 없습니다!";

    public InvalidContactException(String s){
        super(s);
    }
}

 

- command 

package kosta.mission2.mission2_07.domain;

import kosta.mission2.mission2_07.ui.InputView;

import java.util.Arrays;

enum Command {

    ADD_INFO(1) {
        @Override
        public void systemAction(Management management, InputView inputView) {
            management.addInfo(inputView);
        }
    },
    PRINT_INFO_ALL(2) {
        @Override
        public void systemAction(Management management, InputView inputView) {
            management.printInfoAll();
        }

    },
    PRINT_INFO_BY_NAME(3) {
        @Override
        public void systemAction(Management management, InputView inputView) {
            management.printInfoByName(inputView);
        }
    },
    UPDATE(4) {
        @Override
        public void systemAction(Management management, InputView inputView) {
            management.update(inputView);
        }
    },
    DELETE(5) {
        @Override
        public void systemAction(Management management, InputView inputView) {
            management.delete(inputView);
        }
    },
    EXIT(6) {
        @Override
        public void systemAction(Management management, InputView inputView) {
        }
    };

    private final int command;

    Command(int userChoice) {
        validate(userChoice);
        this.command = userChoice;
    }

    public static Command of(int userChoice) {
        return Arrays.stream(values())
                .filter(v -> v.command == userChoice)
                .findFirst()
                .orElseThrow(() -> new InvalidCommandException(InvalidCommandException.INVALID_COMMAND));
    }

    public int getCommand() {
        return command;
    }

    private void validate(int userChoice) {
        if (userChoice != 1 && userChoice != 2 && userChoice != 3 && userChoice != 4 && userChoice != 5 && userChoice != 6) {
            throw new InvalidCommandException(InvalidCommandException.INVALID_COMMAND);
        }
    }

    public abstract void systemAction(Management management, InputView inputView);
}

 

- InvalidCommandException (커스텀 예외 처리)

 

package kosta.mission2.mission2_07.domain;

public class InvalidCommandException extends IllegalArgumentException {

    public static final String INVALID_COMMAND= "입력값이 잘못되었습니다. 정확한 숫자를 입력하세요";

    public InvalidCommandException(String s){
        super(s);
    }
}

 

 

- management 

 

package kosta.mission2.mission2_07.domain;

import kosta.mission2.mission2_07.ui.InputView;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class Management {

    public static final String ADDITION = "추가할";
    public static final String SEARCH = "검색할";
    public static final String UPDATE_FROM = "수정할";
    public static final String UPDATE_TO = "수정후";
    public static final String DELETE = "삭제할";

    List<Contact> contacts = new ArrayList<>();

    public void addInfo(InputView inputView) {
        contacts.add(
                new Contact(inputView.getName(ADDITION),
                        inputView.getNumber(),
                        LocalDate.of(inputView.getDobYear(), inputView.getDobMonth(), inputView.getDobDate())));
    }

    public void printInfoAll() {
        if (contacts.isEmpty()) {
            System.out.println("contacts is empty!");
            return;
        }
        for (Contact contact : contacts) {
            contact.printContactInfo();
        }
    }

    public void printInfoByName(InputView inputView) {
        String nameRequested = inputView.getName(SEARCH);
        getContact(nameRequested).printContactInfo();
    }

    public void update(InputView inputView) {
        String nameFrom = inputView.getName(UPDATE_FROM);
        String nameTo = inputView.getName(UPDATE_TO);

        getContact(nameFrom).setName(nameTo);
    }

    public void delete(InputView inputView) {
        String nameToBeDeleted = inputView.getName(DELETE);

        contacts.remove(getContact(nameToBeDeleted));
    }

    private Contact getContact(String nameFrom) {
        return contacts.stream()
                .filter(c -> c.getName().equals(nameFrom))
                .findFirst()
                .orElseThrow(() -> new InvalidContactException(InvalidContactException.CONTACT_NOT_FOUND));
    }
}

 

 

 

 

반응형