우당탕탕 개발일지

7일차_과제 본문

비트캠프/과제

7일차_과제

ujin302 2024. 7. 12. 10:46
반응형

1. [문제] 클럽 회원관리 프로그램 작성

1. 여기는 폐쇄적인 모임으로 회원은 총 5명으로 한다.

2. 회원의 정보는 이름, 나이, 핸드폰, 주소로 설정한다.
3. 회원 가입, 출력, 수정, 삭제하는 각각의 메소드을 작성한다.

 

4. 회원가입시 데이터를 Scanner를 통해 입력을 받은 다음 setter로 데이터를 전달한다.
   회원가입시 MemberDTO가 하나씩 생성된다. 
   회원가입시 배열의 크기만큼 데이터가 다 입력되면 "5명의 정원이 꽉 찼습니다." 라고 메세지를 출력한다.

 

5. 출력시 데이터가 없으면 아무 내용도 출력되지 않는다.
6. 수정할 때는 먼저 핸드폰 번호를 입력받아서 검색하다.
   만약 검색한 핸드폰 번호가 없으면 "찾는 회원이 없습니다" 라는 메세지를 출력한다.
   핸드폰 번호가 있으면 수정 할 항목을 입력받아서 기존의 데이터를 수정해야 한다.

 

7. 삭제할 때는 먼저 핸드폰 번호를 입력받아서 검색하다.
   만약 검색한 핸드폰 번호가 없으면 "찾는 회원이 없습니다" 라는 메세지를 출력한다.    
   개발자는 MemberDTO를 삭제할 수 없다. 
   -> JVM이 알아서 삭제한다. 
   -> 삭제 시, 배열의 값을 null로 지정한다. 

 

[실행결과]

menu()
*************
   1. 가입
   2. 출력
   3. 수정
   4. 탈퇴
   5. 끝내기
*************
  번호 : 

[1번 경우]
insert()
5명의 정원이 꽉 찼습니다. //5명이 꽉 차면 

또는

이름 입력 :
나이 입력 :
핸드폰 입력 :
주소 입력 :

회원 가입이 되었습니다.


[2번 경우]
list()
이름      나이      핸드폰      주소

[3번 경우]
update()
핸드폰 번호 입력 : 010-123-1234
홍길동      25      xxx      xxx

수정 할 이름 입력 : 
수정 할 나이 입력 : 
수정 할 핸드폰 입력 : 
수정 할 주소 입력 : 

회원의 정보를 수정하였습니다.

또는

핸드폰 번호 입력 : 010-123-1235
찾는 회원이 없습니다

[4번 경우]
delete()
핸드폰 번호 입력 : 
회원의 정보를 삭제하였습니다.

또는

핸드폰 번호 입력 : 
찾는 회원이 없습니다

 

 

2. MemberMain.java

: 실행할 함수 호출 

package homework;

public class MemberMain {

	public static void main(String[] args) {
		// 1. MemberService 객체 생성 
		MemberService service = new MemberService();
		service.menu();
	}
}

 

 

3. MemberDTO

: 필요한 Data 설정 

package homework;

public class MemberDTO {
	private String name; // 이름 
	private int age; // 나이 
	private String phoneNumber; // 핸드폰 번호
	private String address; // 주소 
	
	public void setData(String name, int age, String phoneNumber, String address) {
		this.name = name;
		this.age = age;
		this.address = address;
		this.phoneNumber = phoneNumber;
	}
	
	public String getName() {
		return name;
	}
	
	public int getAge() {
		return age;
	}
	
	public String getPhoneNumber() {
		return phoneNumber;
	}
    
	public String getAddress() {
		return address;
	}
}

 

 

4. MemberService.java

: 실질적인 구동하는 함수 모음

package homework;

import java.util.Scanner;

public class MemberService {
	private final int MEMBERMAXCOUNT = 5;
	private int currentCount = 0; // 현재 가입되어 있는 회원 수 
	private MemberDTO[] memberDTO = new MemberDTO[MEMBERMAXCOUNT]; // 인원 : 5명
	private Scanner sc = new Scanner(System.in);
	
	// 1. menu
	public void menu() {
		boolean isGo = true;
		
		while(isGo) {
			System.out.print("*************\n" + 
					"   1. 가입\n" + 
					"   2. 출력\n" + 
					"   3. 수정\n" + 
					"   4. 탈퇴\n" + 
					"   5. 끝내기\n" + 
					"*************\n" +
					"   번호 : ");
			int munuNum = sc.nextInt(); // 메뉴 번호 입력 
			
			switch (munuNum) {
			case 1:
				insert();
				break;
				
			case 2:
				list();
				break;
						
			case 3:
				update();
				break;
				
			case 4:
				delete();
				break;
				
			case 5:
				// 프로그램 끝내기 
				System.out.println("프로그램을 종료합니다.");
				isGo = false;
				break;
		
			default:
				System.out.println("1~5의 번호를 선택해주세요.");
				break;
			}
		}
	}
	
	// 2. insert (가입) >> 방법 1 
	public void insert() {		
		String name, phoneNumber, address;
		int age; 
		boolean isNotOver = true; // 중복 값 확인 
		
		while(isNotOver) {
			// 회원 가입 
			if(currentCount == MEMBERMAXCOUNT) {
				// 1. 5명 꽉 찾을 경우 
				System.out.println("5명의 정원이 꽉 찼습니다.");
				break;
			}else {
				// 2. 회원 정보 입력 
				System.out.print("이름 입력 : ");
				name = sc.next();
				
				System.out.print("나이 입력 : ");
				age = sc.nextInt();
				
				System.out.print("전화번호 입력 : ");
				phoneNumber = sc.next();
				phoneNumber.replace(" ", ""); // 빈값 제거 
				
				System.out.print("주소 입력 : ");
				address = sc.next();
				
				
				// 3. 전화번호 중복 확인 
				for(int i=0; i<currentCount; i++) {
					if(memberDTO[i].getPhoneNumber().equals(phoneNumber)) {
						// 3-1. 전화번호 중복
						System.out.println("입력한 전화번호(" 
										+ phoneNumber
										+ ")가 이미 존재합니다. \n"
										+ "다른 전화번호를 작성해주세요.\n");
						
						isNotOver = true;
						break;
					}else if(i == currentCount-1) {
						// 3-2. 전화번호 중복 없음
						isNotOver = false;
					}
				}
				
				// 4. 중복 없을 경우, 회원 정보 저장 
				if(currentCount == 0 || !isNotOver) {
					// 4-1. 회원 정보 저장 
					memberDTO[currentCount] = new MemberDTO();
					memberDTO[currentCount].setData(name, age, phoneNumber, address);
					System.out.println("회원 가입이 되었습니다.\n");
					
					// 4-2. 현재 인원 +1
					currentCount++;
					break;
				}
				
			}
		}
	}
	
	// 2. insert (가입) >> 방법 2
	public void insert_1() {
		int memberCount = 0;
		String name, phoneNumber, address;
		int age; 
		
		// [1] 현재 가입되어 있는 회원 수 확인 및 회원가입 진행 
		for(int i=0; i<MEMBERMAXCOUNT; i++) {
			if(memberDTO[i] == null) {
				// 1. 현재 가입 회원 수 확인 및 객체 생성 
				memberCount = i; 
				memberDTO[i] = new MemberDTO();
				
				// 2. 회원 정보 입력 
				System.out.print("이름 입력 : ");
				name = sc.next();
				
				System.out.print("나이 입력 : ");
				age = sc.nextInt();
				
				System.out.print("전화번호 입력 : ");
				phoneNumber = sc.next();
				
				System.out.print("주소 입력 : ");
				address = sc.next();
				
				memberDTO[i].setData(name, age, phoneNumber, address);
				// 3. 중복 체크
				System.out.println("회원 가입이 되었습니다.");
				
				// 1번 호출에 1번의 인원만 회원 가입 진행함으로 한명 가입 완료하면 break로 for문 빠져나가기 
				break;
			}
		}
		
		// [2] 정원이 꽉 찾을 경우
		if(memberCount == MEMBERMAXCOUNT) {
			System.out.println("5명의 정원이 꽉 찼습니다.\n");
		}
	}
	
	// 3. list (출력)
	public void list() {
		System.out.println("이름\t나이\t핸드폰\t주소");
		
		for(int i=0; i<currentCount; i++) {
			System.out.println(memberDTO[i].getName() + "\t"
							+ memberDTO[i].getAge() + "\t"
							+ memberDTO[i].getPhoneNumber() + "\t"
							+ memberDTO[i].getAddress());
		}
	}
	
	// 4. update (수정)
	public void update() {
		// 1. 전화번호 입력
		System.out.print("전화번호 입력(Ex. 010-0000-0000) : ");
		String phoneNumber = sc.next();
		boolean isFind = false; 
		
		// 2. 현재 회원 인원 : 0
		if(currentCount == 0) {
			System.out.println("가입되어 있는 회원이 없습니다. ");
		}
		
		// 3. 전화번호 찾기 
		for(int i=0; i<currentCount; i++) {
			if(memberDTO[i].getPhoneNumber().equals(phoneNumber)) {
				// 3-1. 회원 정보 존재 O
				isFind = true; 
				
				// 3-2. 회원 정보 수정
				String name, address;
				int age; 
				
				System.out.print("수정 할 이름 입력 : ");
				name = sc.next();
				
				System.out.print("수정 할 나이 입력 : ");
				age = sc.nextInt();
				
				System.out.print("수정 할 전화번호 입력 : ");
				phoneNumber = sc.next();
				
				System.out.print("수정 할 주소 입력 : ");
				address = sc.next();
				
				memberDTO[i].setData(name, age, phoneNumber, address);
				
				System.out.println("회원의 정보를 수정하였습니다.");
				break;
			}
		}
		
		// 4. 회원 정보 존재 X
		if(!isFind) {
			System.out.println("찾는 회원이 없습니다.");
		}
	}
	
	// 5. delete (탈퇴)
	public void delete() {
		// 1. 핸드폰 번호 입력 
		System.out.print("전화번호 입력 : ");
		String phoneNumber = sc.next();
		
		// 2. 회원 정보 찾기 
		for(int i=0; i<currentCount; i++) {
			if(memberDTO[i].getPhoneNumber().equals(phoneNumber)) {
				// 2-1. 배열 재설정 
				for(int j=i; j<currentCount-1; j++) {
					// i가 5일 경우, 설정할 값이 없음 
					memberDTO[j] = memberDTO[j+1];
				}
				
				// 2-2. 마지막 회원 == null 
				if(currentCount == i+1) {
					memberDTO[currentCount-1] = null;
				}
				
				// 2-3. 현재 인원 설정 
				currentCount --;
			}
		}
	}
	
}

 

필드 변수 설명

1. MEMBERMAXCOUNT : 회원 가능 최대 인원

2. currentCount : 현재 가입되어 있는 회원 수

3. memberDTO : 현재 가입되어 있는 회원 정보 데이터 모음

 

menu() : 메뉴 출력 및 입력 

사용자가 5번 메뉴를 선택하기 전까지 계속 메뉴를 출력하여야 하기에 while 문 사용

isGo 변수를 사용하여 while문을 제어

 

사용자 입력 값에 따라 알맞는 함수를 호출한다. 

1~5가 아닌 다른 문자가 입력되었을 경우에는 다시 선택하도록 한다. 

 

5번을 선택할 경우, isGo = false가 되어 프로그램이 종료된다. 

 

insert() : 회원정보 저장

변수

회원 정보 변수

name

phoneNumber

address 

age

 

중복 값 확인 변수

isNotOver 

: False가 되면 회원 정보 중복이 아님으로 아래의 while문 빠져나감. 

중복되었을 경우 계속 회원정보를 받는다. 

while문 - if문 

while문 안에서 작업해야하는 것은 5명이 꽉 찾을 경우에 대한 대비와

그렇지 않을 경우 회원가입 진행하는 것이다.

 

if문의 조건을 보면 현재 인원수가 5일 경우에는 더이상 회원가입을 받지 않고 그에 따른 문구를 출력한다.

그렇지 않을 경우에는 회원가입을 진행한다. 

 

 

회원가입 진행

회원가입 진행 시, 동일한 전화번호가 존재하면 다시 입력받도록 구현했다. 

 

먼저 회원 정보를 입력받는다.

회원 정보 중, 전화번호가 중복되는지 확인한다. 

 

memberDTO 배열 각 원소의 전화번호와 입력받은 전화번호가 동일한 값이 있는지 확인한다. 

존재할 경우 이미 존재한다는 문구를 출력하고 다시 입력받기 위해 isNotOver의 값은 변경하지 않는다. 

 

전화번호가 중복되지 않고 배열의 모든 원소들을 다 살펴보았을 때, isNotOver의 값을 false로 설정하여 while문을 빠져나가도록 설정한다. 

 

회원정보 저장

현재 회원 인원 수가 0 일 경우 최초이기 때문에 회원정보를 저장한다. 

또한 isNotOver이 false일 경우에는 중복되지 않았다는 의미로 회원정보를 저장한다. 

회원 정보 저장 후, 현재 인원 수를 +1한다. 

 

isNotOver이 true지만 현재 인원수가 0일 경우 while문을 계속 실행함으로 break를 사용하여 빠져나간다. 

 

list() : 회원정보 출력

현재 회원가입 되어 있는 모든 정보를 출력한다. 

 

update() : 회원정보 수정

회원정보 수정은 크게 4가지로 나뉜다. 

1. 전화번호 입력

2. 현재 회원이 0일경우

3. 전화번호 존재 O

4. 전화번호 존재 X

 

전화번호 입력 및 현재 회원 0명

먼저 1,2번의 경우이다. 

phoneNumber에 전화번호를 입력받는다. 

isFind 함수를 false로 초기화한다.  

전화번호 존재 유무를 판단하는 변수이다. 전화번호 존재할 경우 true값을 저장한다. 

 

현재인원이 0명일 경우 "가입되어 있는 회원이 없습니다." 문구를 출력한다. 

그리고 3,4번을 수행하지 않는다.  

 

전화번호 찾기 : 전화번호 존재 O 

memberDTO 배열 각 원소의 전화번호가 입력받은 전화번호와 동일한지 찾는다

동일할 경우 isFind 값을 true로 변경한다. 

 

수정할 회원 정보를 입력 받아 회원 정보 수정을 진행한다. 

그 후, break로 for문을 빠져나간다. 

예를 들어 현재 인원이 4명인데 수정할 회원정보가 memberDTO[0]이라면 그 이후의 1~3인덱스는 확인할 필요가 없기 때문에 break로 for문을 빠져나간다. 

 

 

전화번호 존재 X

전화번호가 존재하지 않을 경우, "찾는 회원이 없습니다." 문구를 출력한다. 

 

delete() : 회원 탈퇴 

전화번호를 입력받는다. 

해당 전화번호가 memberDTO 배열 각 원소의 전화번호와 동일한지 확인한다. 

동일하다면 뒤에 있는 원소를 한칸씩 땡겨온다. 마지막 원소는 null값을 저장한다. 

 

예를 들면 현재 인원이 5명이고 입력받은 전화번호가 동일한 배열은 memberDTO[2]이라고 가정하겠다.

memberDTO[2] = memberDTP[3]

memberDTO[3] = memberDTP[4]

memberDTO[4] = null 값을 저장한다. 

 

현재 인원 -1를 한다. 

반응형

'비트캠프 > 과제' 카테고리의 다른 글

10일차_과제  (0) 2024.07.16
9일차_과제  (0) 2024.07.16
6일차_과제  (0) 2024.07.10
5일차_과제  (0) 2024.07.09
4일차_과제  (2) 2024.07.09