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));
}
}
반응형
'교육 > Java&Spring' 카테고리의 다른 글
kosta 클라우드 네이티브 애플리케이션 개발 과정 day 10 (0) | 2023.01.02 |
---|---|
java & spring 2 (1) | 2022.12.31 |
kosta 클라우드 네이티브 애플리케이션 개발 과정 day 8 (0) | 2022.12.30 |
kosta 클라우드 네이티브 애플리케이션 개발 과정 day 7 (0) | 2022.12.28 |
kosta 클라우드 네이티브 애플리케이션 개발 과정 day 6 (0) | 2022.12.28 |