한 달간의 소감
오늘은 30일차로 공휴일이 많은 5,6월의 쉬는 날을 제외하고 수업일수만으로 딱 한 달이 되었다.
첫 2주간의 리눅스 강의와 2주간의 파이썬 AI 수업 등을 배우고, 항상 네이버클라우드 서버를 통한
바우처 사용법과 프로그래밍 언어 교육을 진행했다. 이제는 본격적으로 자바를 배우고있다.
아직 한 달 밖에 안되었지만 네이버클라우드 사용방법, 리눅스, 파이썬, 자바, 깃허브, 프로그래머스 등 여기에 오기 전에 공부했던 몇 달 간의 시간보다 더 많은 것을 배우고 있는 것 같다.
다시 또 한 달 뒤의 모습을 쓸 때 오늘을 회고하도록 해야겠다.
앞으로도 더욱 분발해야겠다 🔥
자바 CRUD 구현. 나의 목록관리 시스템 만들기
https://dev-with-gpt.tistory.com/112
오늘 수업은 지난번 프로그램에 이어서 추가로 리팩토링을 진행하고
CRUD를 진행해보았다.
[설명]
이 프로그램은 회원 관리 시스템을 구현한 것으로,
사용자로부터 회원 정보를 입력받고, 등록된 회원 정보를 출력, 조회, 업데이트 및 삭제할 수 있는 기능을 제공한다.
프로그램은 사용자가 메뉴를 선택하여 원하는 작업을 수행할 수 있도록 구성되어 있다.
회원 등록, 목록 출력, 조회, 변경, 삭제와 같은 기능들을 통해 회원 정보를 효율적으로 관리할 수 있다.
MemberHandler 클래스를 통해 회원 관리와 관련된 메소드들을 통해 유지보수에 용이하도록 설계하였다.
Prompt 클래스:
이 클래스는 사용자로부터 입력을 받기 위한 메소드인 prompt를 제공한다.
prompt 메소드는 사용자에게 메시지를 출력하고, 키보드로부터 한 줄의 입력을 받아 반환한다.
close 메소드는 Scanner 객체를 닫아 사용을 종료한다.
기존의 String type의 prompt 메소드를 활용하여 int type의 인자를 받을 수 있게 리팩토링하였다.
public static int inputInt(String title) {
return Integer.parseInt(inputString(title));
}
MemberHandler 클래스와 메소드:
MemberHandler 클래스는 회원 관리 기능을 구현하는 메소드들을 포함하는 클래스이다.
각 메소드는 회원 정보의 입력, 출력, 업데이트, 삭제 등의 기능을 수행한다.
inputMember(): 이 메소드는 새로운 회원 정보를 입력받아 회원 배열에 저장하는 기능을 수행
name, email, password, gender 등 회원의 이름, 이메일, 암호, 성별을 입력받는다
입력받은 회원 정보는 배열에 저장되고 회원 수를 추적하는 length 변수가 증가한다.
printMembers(): 현재 저장된 모든 회원 정보를 출력하는 기능을 수행
no, name, email, gender 등 회원 배열에 저장된 정보를 순회하며 각 회원의 번호, 이름, 이메일, 성별을 출력한다.
viewMember(): 회원 번호를 입력받아 해당 회원의 정보를 출력하는 기능을 수행
입력받은 회원 번호와 일치하는 회원을 찾아서 이름, 이메일, 성별 등의 정보를 출력한다.
updateMember():회원 번호를 입력받아 해당 회원의 정보를 업데이트하는 기능을 수행
입력받은 회원 번호와 일치하는 회원을 찾아서 이름, 이메일, 암호, 성별 등을 새로운 값으로 업데이트한다.
toGenderString(): 성별을 나타내는 문자를 전달받아
"남성" 또는 "여성"과 같은 문자열로 변환하여 반환하는 기능을 수행한다.
inputGender(): 사용자로부터 성별을 입력받아 해당 성별을 반환하는 기능을 수행
사용자에게 성별 선택 메뉴를 제공하고, 선택한 값에 따라 성별을 반환한다.
deleteMember(): 회원 번호를 입력받아 해당 회원을 삭제하는 기능을 수행
입력받은 회원 번호와 일치하는 회원을 찾아서 배열에서 삭제하고, 배열의 길이를 조정하여 회원 수를 갱신한다.
위의 기능들은 MemberHandler 클래스를 통해 회원 관리를 위한 다양한 작업을 수행할 수 있도록 제공한다.
이를 활용하여 회원 정보의 입력, 출력, 업데이트, 삭제 등을 처리할 수 있다.
App 클래스:
App 클래스는 회원 관리 시스템을 실행하는 메인 클래스이다.
main() 메소드: 프로그램 실행의 진입점으로, 메뉴를 출력하고 사용자로부터 메뉴 번호를 입력받아 해당하는 작업을 수행사용자가 메뉴 번호를 입력하면 해당하는 메소드를 호출하여 회원 관리 기능을 수행하며,
"6"을 입력하면 루프를 종료하고 프로그램을 종료한다.
printMenu() 메소드: 사용 가능한 메뉴 목록을 출력
회원 등록, 회원 목록 출력, 회원 조회, 회원 변경, 회원 삭제, 종료 등의 기능을 나열한다.
printTitle() 메소드: 프로그램의 제목을 출력 "나의 목록 관리 시스템"을 출력한다.
promptContinue() 메소드: 사용자에게 추가 작업을 계속할 것인지 묻는 메시지를 출력하고,
사용자의 응답에 따라 true 또는 false를 반환한다.
App 클래스는 메뉴를 출력하고 사용자의 입력에 따라 MemberHandler 클래스의 메소드들을 호출하여
회원 정보의 입력, 출력, 업데이트, 삭제 등을 처리한다.
프로그램은 사용자가 종료 메뉴를 선택할 때까지 계속해서 작업을 수행한다.
[코드]
Prompt
MemberHandler
App5
[결과]
컴파일 및 실행
(1) 회원추가 및 메뉴 재출력
4명의 회원을 추가하고 메뉴를 다시 출력하는 커맨드를 입력합니다.
(2) 회원목록
회원 목록을 출력하여 번호,이름,이메일,성별 등의 정보를 조회할 수 있습니다.
(3) 회원조회
회원번호를 지정하여 해당 번호의 회원에 대한 정보를 출력합니다.
이때 지정되지 않은 회원번호 조회를 시도하면 출력되지 않습니다.
(4) 회원변경 (기존의 회원정보를 수정)
회원에 대한 정보를 수정하여 회원정보에 추가합니다.
(5) 회원삭제 (삭제된 자리에 다음 회원이 땡겨짐)
기존 회원정보를 삭제하는 기능입니다. 이때 지정되지 않은 회원번호를 지정하면
실행되지않으며, 삭제된 회원번호를 제외하고 나머지 회원 정보는 앞으로 땡겨와집니다.
[코드블럭]
Prompt
package bitcamp.myapp0607;
import java.util.Scanner;
public class Prompt {
static Scanner scanner = new Scanner(System.in);
public static String inputString(String title) {
System.out.print(title);
return scanner.nextLine();
}
public static int inputInt(String title) {
return Integer.parseInt(inputString(title));
}
public static void close() {
scanner.close();
}
}
MemberHandler
package bitcamp.myapp0607;
import bitcamp.myapp0607.Prompt;
public class MemberHandler {
static final int MAX_SIZE = 100;
static int[] no = new int[MAX_SIZE];
static String[] name = new String[MAX_SIZE];
static String[] email = new String[MAX_SIZE];
static String[] password = new String[MAX_SIZE];
static char[] gender = new char[MAX_SIZE];
static int userId = 1;
static int length = 0;
static final char MALE = 'M';
static final char FEMALE = 'W';
public static void inputMember() {
if (!available()) {
System.out.println("더이상 입력할 수 없습니다!");
return;
}
name[length] = Prompt.inputString("이름? ");
email[length] = Prompt.inputString("이메일? ");
password[length] = Prompt.inputString("암호? ");
gender[length] = inputGender((char)0);
no[length] = userId++;
length++;
}
public static void printMembers() {
System.out.println("---------------------------------------");
System.out.println("번호, 이름, 이메일, 성별");
System.out.println("---------------------------------------");
for (int i = 0; i < length; i++) {
System.out.printf("%d, %s, %s, %s\n",
no[i], name[i], email[i],
toGenderString(gender[i]));
}
}
public static void viewMember() {
String memberNo = Prompt.inputString("번호? ");
for (int i = 0; i < length; i++) {
if (no[i] == Integer.parseInt(memberNo)) {
System.out.printf("이름: %s\n", name[i]);
System.out.printf("이메일: %s\n", email[i]);
System.out.printf("성별: %s\n", toGenderString(gender[i]));
return;
}
}
System.out.println("해당 번호의 회원이 없습니다!");
}
public static String toGenderString(char gender) {
return gender == 'M' ? "남성" : "여성";
}
public static void updateMember() {
String memberNo = Prompt.inputString("번호? ");
for (int i = 0; i < length; i++) {
if (no[i] == Integer.parseInt(memberNo)) {
System.out.printf("이름(%s)? ", name[i]);
name[i] = Prompt.inputString("");
System.out.printf("이메일(%s)? ", email[i]);
email[i] = Prompt.inputString("");
System.out.printf("새암호? ");
password[i] = Prompt.inputString("");
gender[i] = inputGender(gender[i]);
return;
}
}
System.out.println("해당 번호의 회원이 없습니다!");
}
private static char inputGender(char gender) {
String label;
if (gender == 0) {
label = "성별?\n";
} else {
label = String.format("성별(%s)?\n", toGenderString(gender));
}
loop: while (true) {
String menuNo = Prompt.inputString(label +
" 1. 남자\n" +
" 2. 여자\n" +
"> ");
switch (menuNo) {
case "1":
return MALE;
case "2":
return FEMALE;
default:
System.out.println("무효한 번호입니다.");
}
}
}
private static boolean available() {
return length < MAX_SIZE;
}
public static void deleteMember() {
int memberNo = Integer.parseInt(Prompt.inputString("번호? "));
int indexToDelete = -1;
for (int i = 0; i < length; i++) {
if (no[i] == memberNo) {
indexToDelete = i;
break;
}
}
if (indexToDelete != -1) {
for (int i = indexToDelete; i < length - 1; i++) {
no[i] = no[i + 1];
name[i] = name[i + 1];
email[i] = email[i + 1];
password[i] = password[i + 1];
gender[i] = gender[i + 1];
}
name[length - 1] = null;
email[length - 1] = null;
password[length - 1] = null;
gender[length - 1] = (char)0;
length--;
System.out.println(memberNo +"번의 회원번호를 삭제했습니다.");
} else {
System.out.println("해당 번호의 회원이 없습니다!");
}
}
}
APP
package bitcamp.myapp0607;
import bitcamp.myapp0607.MemberHandler;
import bitcamp.myapp0607.Prompt;
public class App {
public static void main(String[] args) {
printTitle();
printMenu();
while (true) {
String menuNo = Prompt.inputString("메인> ");
if (menuNo.equals("6")) {
break;
} else if (menuNo.equals("menu")) {
printMenu();
} else if (menuNo.equals("1")) {
MemberHandler.inputMember();
} else if (menuNo.equals("2")) {
MemberHandler.printMembers();
} else if (menuNo.equals("3")) {
MemberHandler.viewMember();
} else if (menuNo.equals("4")) {
MemberHandler.updateMember();
} else if (menuNo.equals("5")) {
MemberHandler.deleteMember();
} else {
System.out.println(menuNo);
}
}
Prompt.close();
}
static void printMenu() {
System.out.println("1. 회원등록");
System.out.println("2. 회원목록");
System.out.println("3. 회원조회");
System.out.println("4. 회원변경");
System.out.println("5. 회원삭제");
System.out.println("6. 종료");
}
static void printTitle() {
System.out.println("나의 목록 관리 시스템");
System.out.println("----------------------------------");
}
static boolean promptContinue() {
String response = Prompt.inputString("계속 하시겠습니까?(Y/n) ");
if (!response.equals("") && !response.equalsIgnoreCase("Y")) {
return false;
}
return true;
}
}