이전 글에서 언급했던 제리님의 테코톡 영상을 참고해서 김영한님 자바 입문 강의에 있는 2차원 배열 문제와 풀이 3번 상품 관리 프로그램
을 간략하게 구현해 보았다. 사실 Java
를 이용한 프로그래밍 자체가 거의 처음인 수준이다 보니 제대로 이해했는지, 규칙에 맞게 구현했는지 스스로 판단할 수준이 되지 못해서 평가 자체가 어렵다.
문제 자체는 이렇다.
[출처: 김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음]
강의에서는 기본적으로 배열 2개와 조건문, 반복문만을 이용해서 간단하게 구현한다. 그런데 문득 이 문제를 보는 순간 이전 글의 MVC
패턴이 생각났고, 해당 방법으로 구현해 보자는 생각이 들었다. 나는 프로그래밍 언어를 새로 배울 때 스스로 이것저것 만들어 보는 것이 가장 중요하다고 생각하는 사람이라 마음이 더 동했던 것 같다.
첫 번째로 구현한 부분은 Model
이다. 이 프로그램은 말 그대로 상품 관리 프로그램
이기 때문에 Model
은 상품의 정보를 담고 있는 클래스여야한다고 생각했다. 따라서 다음과 같이 구현했다.
package product;
public class Product {
private String name;
private int price;
public Product(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
public void setName(String name) {
this.name = name;
}
public void setPrice(int price) {
this.price = price;
}
}
MVC
패턴의 1규칙인 'Model
은 Controller
와 View
에 의존하지 않아야 한다. 즉, Model
내부에 Controller
와 View
에 관련된 코드가 있으면 안 된다.'를 생각하며 작성한 코드이다.
다음은 View
부분이다.
package product;
public class OutputView {
public static void printProduct(Product product) {
System.out.println(product.getName() + ": " + product.getPrice() + "원");
}
public static void printMenu() {
System.out.println("1. 상품 등록 | 2. 상품 목록 | 3. 종료");
System.out.print("메뉴를 선택하세요: ");
}
public static void printExit() {
System.out.println("프로그램을 종료합니다.");
}
public static void printNoMoreProducts() {
System.out.println("더 이상 상품을 등록할 수 없습니다.");
}
public static void printInputName() {
System.out.print("상품 이름을 입력하세요: ");
}
public static void printInputPrice() {
System.out.print("상품 가격을 입력하세요: ");
}
public static void printNoProducts() {
System.out.println("등록된 상품이 없습니다.");
}
}
View
는 Controller
에 의존하면 안 되기 때문에 Controller
로부터 상품 정보를 넘겨받아 출력하는 부분과 기타 출력 부분을 구현하였다.
마지막으로 Controller
부분이다.
package product;
import java.util.Scanner;
public class Controller {
public static void main(String[] args) {
Product[] products = new Product[10];
Scanner scanner = new Scanner(System.in);
// 상품 재고
int inventory = 0;
while (true) {
int menu;
OutputView.printMenu();
menu = scanner.nextInt();
if (menu == 3) { // 프로그램 종료
OutputView.printExit();
break;
} else if (menu == 1) { // 상품 등록
if (inventory == 10) { // 상품믈 더 이상 등록할 수 없는 경우
OutputView.printNoMoreProducts();
} else {
OutputView.printInputName();
scanner.nextLine();
String name = scanner.nextLine();
OutputView.printInputPrice();
int price = scanner.nextInt();
products[inventory] = new Product(name, price);
inventory++;
}
} else { // 상품 목록
if (inventory == 0) { // 등록된 상품이 없는 경우
OutputView.printNoProducts();
} else {
for (int i = 0; i < inventory; i++) {
OutputView.printProduct(products[i]);
}
}
}
}
}
}
사실 규칙에 맞게 제대로 잘 구현했는지는 모르겠다. 하지만 이렇게 일종의 패턴을 지키려고 노력하면서 프로그래밍을 해본 경험은 처음인데 확실히 유지보수를 위해 쓰기 시작했다는 말이 무슨 뜻인지 알 것 같다.
명확하게 기능이 나뉘어있기 때문에 문제가 발생하는 부분을 특정하기도 쉽고 해당 부분만 수정하면 되기 때문이다. main
함수의 길이가 너무 긴 것 같아서 나중에는 함수로 따로 빼서 구현해 보려고 한다.
Java
자체는 C
와 유사한 부분이 초반에는 좀 있어서 기본적인 부분은 빠르게 넘어간 것 같다. 대신, 객체 지향 프로그래밍과 클래스, 상속 등의 부분은 심도 있게 공부하려고 보고 있다.