Eclipse 에서 getter/setter 쉽게 추가
ㄴ 워크스페이스에서 item.java 를 열고 우클릭 > Source > Generate Getters and Setters... 선택
ㄴ Select All 선택 > [Generate] 선택
getter/setter 추가
ㄴ getter/setter 는 인스턴스 필드의 값을 설정하고 꺼내는 메서드
ㄴ 보통 외부에서 직접 필드에 접근하는 것을 막았을 때 사용
Item.java
package bitcamp.report.vo;
public class Item {
private int no;
private String name;
private int price;
private String type;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
ㄴ no, name, price, type 을 private 으로 접근 제한을 해줌
=> 인스턴스 필드는 각각 개별적으로 유지해야 하는 값을 저장할 때 사용함
=> new 명령을 통해 변수를 Heap 영역에 생성
ㄴ 각각의 getter/setter 추가
getter/setter 적용
ItemHandler.java
package bitcamp.report.handler;
import bitcamp.report.vo.Item;
import bitcamp.util.Prompt;
public class itemHandler {
static final int MAX_SIZE = 100;
static Item[] items = new Item[MAX_SIZE];
static int itemId = 1;
static int length = 0;
static final String FOOD = "식료품";
static final String HOUSEHOLD_SUPPLIES = "생활용품";
static final String CLOTHES = "의류";
static final String HOME_APPLIANCES = "가전제품";
static final String LIVING = "리빙";
public static void inputItem() {
if (!available()) {
System.out.println("더이상 입력할 수 없습니다!");
return;
}
Item item = new Item();
item.setName(Prompt.inputString("물품 이름? "));
item.setPrice(Prompt.inputInt("물품 가격? "));
item.setType(inputType("0"));
item.setNo(itemId++);
// 위에서 만든 Item 인스턴스의 주소를 잃어버리지 않게 레퍼런스 배열에 담기
items[length++] = item;
}
public static void printItems() {
System.out.println("---------------------------------------------------------------------");
System.out.println("물품 번호, 물품 이름, 물품 가격, 종류");
System.out.println("---------------------------------------------------------------------");
for (int i = 0; i < length; i++) {
Item item = items[i];
System.out.printf("%d, %s, %s, %s\n", item.getNo(), item.getName(), item.getPrice(),
item.getType());
}
}
public static void viewItem() {
String itemNo = Prompt.inputString("물품 번호? ");
for (int i = 0; i < length; i++) {
Item item = items[i];
if (item.getNo() == Integer.parseInt(itemNo)) {
System.out.printf("물품 이름: %s\n", item.getName());
System.out.printf("물품 가격: %s\n", item.getPrice());
System.out.printf("물품 종류: %s\n", item.getType());
return;
}
}
System.out.println("해당 번호의 물품이 없습니다!");
}
public static void updateItem() {
String itemNo = Prompt.inputString("물품 번호? ");
for (int i = 0; i < length; i++) {
Item item = items[i];
if (item.getNo() == Integer.parseInt(itemNo)) {
System.out.printf("물품 이름(%s)? ", item.getName());
item.setName(Prompt.inputString(""));
System.out.printf("물품 가격(%s)? ", item.getPrice());
item.setPrice(Prompt.inputInt(""));
item.setType(inputType(item.getType()));
return;
}
}
System.out.println("해당 번호의 물품이 없습니다!");
}
private static String inputType(String type) {
String label;
if (type == "0") {
label = "물품 종류?\n";
} else {
label = String.format("물품 종류(%s)?\n", type);
}
while (true) {
String typeNo = Prompt.inputString(
label + " 1. 식료품\n" + " 2. 생활용품\n" + " 3. 의류\n" + " 4. 가전제품\n" + " 5. 리빙\n" + "> ");
switch (typeNo) {
case "1":
return FOOD;
case "2":
return HOUSEHOLD_SUPPLIES;
case "3":
return CLOTHES;
case "4":
return HOME_APPLIANCES;
case "5":
return LIVING;
default:
System.out.println("무효한 번호입니다.");
}
}
}
public static void deleteItem() {
// 삭제하려는 물품의 정보가 들어있는 인덱스 알아내기
int itemNo = Integer.parseInt(Prompt.inputString("물품 번호? "));
int deletedIndex = indexOf(itemNo);
if (deletedIndex == -1) {
System.out.println("해당 번호의 물품이 없습니다!");
return;
}
// 만약 삭제하려는 항목이 마지막 인덱스의 항목이라면 마지막 인덱스의 값만 0으로 초기화 시키기
// 그 밖에는 해당 인덱스부터 반복하면서 앞 인덱스의 값을 당겨오기
for (int i = deletedIndex; i < length - 1; i++) {
items[i] = items[i + 1];
}
// 배열의 맨 마지막 초기화
items[length - 1] = null;
length--;
System.out.println("삭제했습니다.");
return;
}
private static int indexOf(int itemNo) {
for (int i = 0; i < length; i++) {
Item item = items[i];
if (item.getNo() == itemNo) {
return i;
}
}
return -1;
}
public static boolean available() {
return length < MAX_SIZE;
}
}
리팩토링
모든 인스턴스가 공유하는 값은 스태틱 필드에 보관
ㄴ static int itemId = 1; 코드를 Item.java 로 이동시킴
ㄴ static int itemId = 1; 코드를 Item.java 로 이동시킨 후 private 붙여줌
=> 모든 인스턴스가 공유하는 값은 스태틱 필드에 보관
생성자 추가
ㄴ 생성자에 no 를 itemId++ 하는 기능을 추가해줌
ㄴ item.setNo(itemId++); 코드는 item.java 의 생성자에서 기능을 해주기 때문에 제거
GRASP 패턴 : Information Expert
ㄴ 상수는 스태틱 필드로 정의
ㄴ 정보를 다룰 때는 그 정보를 갖고 있는 클래스에 그 기능을 둠
ㄴ 필드도 마찬가지
ㄴ 해당 코드 Item.java 로 이동
ㄴ Item.java 로 이동시킨 코드에 모두 public 을 붙여줌
ㄴ itemHandler.java 에서 해당 필드 값 앞에 클래스 이름을 적어줌
ex) return Food => return Item.FOOD;
수정 결과
ItemHandler.java
package bitcamp.report.handler;
import bitcamp.report.vo.Item;
import bitcamp.util.Prompt;
public class itemHandler {
static final int MAX_SIZE = 100;
static Item[] items = new Item[MAX_SIZE];
static int length = 0;
public static void inputItem() {
if (!available()) {
System.out.println("더이상 입력할 수 없습니다!");
return;
}
Item item = new Item();
item.setName(Prompt.inputString("물품 이름? "));
item.setPrice(Prompt.inputInt("물품 가격? "));
item.setType(inputType("0"));
// 위에서 만든 Item 인스턴스의 주소를 잃어버리지 않게 레퍼런스 배열에 담기
items[length++] = item;
}
public static void printItems() {
System.out.println("---------------------------------------------------------------------");
System.out.println("물품 번호, 물품 이름, 물품 가격, 종류");
System.out.println("---------------------------------------------------------------------");
for (int i = 0; i < length; i++) {
Item item = items[i];
System.out.printf("%d, %s, %s, %s\n", item.getNo(), item.getName(), item.getPrice(),
item.getType());
}
}
public static void viewItem() {
String itemNo = Prompt.inputString("물품 번호? ");
for (int i = 0; i < length; i++) {
Item item = items[i];
if (item.getNo() == Integer.parseInt(itemNo)) {
System.out.printf("물품 이름: %s\n", item.getName());
System.out.printf("물품 가격: %s\n", item.getPrice());
System.out.printf("물품 종류: %s\n", item.getType());
return;
}
}
System.out.println("해당 번호의 물품이 없습니다!");
}
public static void updateItem() {
String itemNo = Prompt.inputString("물품 번호? ");
for (int i = 0; i < length; i++) {
Item item = items[i];
if (item.getNo() == Integer.parseInt(itemNo)) {
System.out.printf("물품 이름(%s)? ", item.getName());
item.setName(Prompt.inputString(""));
System.out.printf("물품 가격(%s)? ", item.getPrice());
item.setPrice(Prompt.inputInt(""));
item.setType(inputType(item.getType()));
return;
}
}
System.out.println("해당 번호의 물품이 없습니다!");
}
private static String inputType(String type) {
String label;
if (type == "0") {
label = "물품 종류?\n";
} else {
label = String.format("물품 종류(%s)?\n", type);
}
while (true) {
String typeNo = Prompt.inputString(
label + " 1. 식료품\n" + " 2. 생활용품\n" + " 3. 의류\n" + " 4. 가전제품\n" + " 5. 리빙\n" + "> ");
switch (typeNo) {
case "1":
return Item.FOOD;
case "2":
return Item.HOUSEHOLD_SUPPLIES;
case "3":
return Item.CLOTHES;
case "4":
return Item.HOME_APPLIANCES;
case "5":
return Item.LIVING;
default:
System.out.println("무효한 번호입니다.");
}
}
}
public static void deleteItem() {
// 삭제하려는 물품의 정보가 들어있는 인덱스 알아내기
int itemNo = Integer.parseInt(Prompt.inputString("물품 번호? "));
int deletedIndex = indexOf(itemNo);
if (deletedIndex == -1) {
System.out.println("해당 번호의 물품이 없습니다!");
return;
}
// 만약 삭제하려는 항목이 마지막 인덱스의 항목이라면 마지막 인덱스의 값만 0으로 초기화 시키기
// 그 밖에는 해당 인덱스부터 반복하면서 앞 인덱스의 값을 당겨오기
for (int i = deletedIndex; i < length - 1; i++) {
items[i] = items[i + 1];
}
// 배열의 맨 마지막 초기화
items[length - 1] = null;
length--;
System.out.println("삭제했습니다.");
return;
}
private static int indexOf(int itemNo) {
for (int i = 0; i < length; i++) {
Item item = items[i];
if (item.getNo() == itemNo) {
return i;
}
}
return -1;
}
public static boolean available() {
return length < MAX_SIZE;
}
}
Item.java
package bitcamp.report.vo;
public class Item {
private static int itemId = 1;
public static final String FOOD = "식료품";
public static final String HOUSEHOLD_SUPPLIES = "생활용품";
public static final String CLOTHES = "의류";
public static final String HOME_APPLIANCES = "가전제품";
public static final String LIVING = "리빙";
private int no;
private String name;
private int price;
private String type;
public Item() {
this.no = itemId++;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
'네이버클라우드 > JAVA 웹 프로그래밍' 카테고리의 다른 글
JAVA 15일차 (2023-06-13) 자바 기초 DAY13_게시판 관리 기능 추가 (0) | 2023.06.13 |
---|---|
JAVA 15일차 (2023-06-13) 자바 기초 DAY13_변수의 종류 (2) | 2023.06.13 |
JAVA 14일차 (2023-06-12) 자바 기초 DAY12_Eclipse git 사용법 (0) | 2023.06.12 |
JAVA 14일차 (2023-06-12) 자바 기초 DAY12_getter/setter 적용 (0) | 2023.06.12 |
JAVA 14일차 (2023-06-12) 자바 기초 DAY12_Eclipse 설치 및 설정 (0) | 2023.06.12 |