JAVA 함수를 이용해서 학생부 프로그램 만들기

2024. 7. 1. 11:45·JAVA

아래는 함수를 이용하지 않고 MAIN에다가 전부 입력해서 프로그램을 만들어놓은 예시이다.

import java.util.Scanner;

public class Test01 {

	public static void main(String[] args) {
		String[] datas = new String[5];
		Scanner sc=new Scanner(System.in);
		System.out.println("학생부 프로그램");

		datas[0]="티모";
		datas[1]="아리";
		datas[2]="모르가나";
		int cnt=3; 

		while(true) {
			System.out.println("=== 메 뉴 ===");
			System.out.println("1. 학생추가");
			System.out.println("2. 학생부 전체출력");
			System.out.println("3. 이름으로 검색");
			System.out.println("4. 번호로 검색");
			System.out.println("5. 이름변경");
			System.out.println("0. 프로그램 종료");
			System.out.println("===============");
			System.out.print("메뉴 입력 >> ");
			int menu=sc.nextInt();

			if(menu==0) {
				System.out.println("프로그램이 종료됩니다.");
				break;
			}
			else if(menu==1) { // 학생추가

				if(cnt >= datas.length) {
					System.out.println("더이상 데이터를 저장할수없습니다!");
					continue;
				}


				String name;
				while(true) {
					System.out.print("저장하고싶은 학생의 이름을 입력해주세요. >> ");
					name=sc.next();

					System.out.print("정말 "+name+"(으)로 하시겠습니까? (Y/N) >> ");
					String answer=sc.next();

					if(answer.equals("Y")) {

						boolean flag=false;

						for(int i=0;i<cnt;i++) {
							if(name.equals(datas[i])) {
								flag=true;
								System.out.println(name+"은(는) 이미 존재하는 이름입니다...");
							}
						}


						if(!flag) {
							break;
						}

					}
				}




				datas[cnt]=name;
				cnt++;

				System.out.println(name+"이(가) 저장되었습니다!");

			}
			else if(menu==2) { // 학생부 전체출력

				if(cnt<=0) { 
					System.out.println("보여줄 학생 데이터가 없습니다.");
					continue;
				}


				System.out.println("=== 학생 목록 ===");
				for(int i=0;i<cnt;i++) { 
					System.out.println((i+1)+"번 학생 : "+datas[i]);
				}
				System.out.println("===============");
			}
			else if(menu==3) { // 이름으로 검색

				// 검색어를 입력 >>
				//이 검색어가 맞습니까 ? xxx : 사용자가 하는 입력이 데이터에 변화를 주지 않기 때문
				System.out.print("검색어 입력 >> ");
				String searchContent = sc.next(); // searchKeyword

				
				boolean flag = false; // 검색결과가 없는 상태로 시작
				
				//학생부를 하나하나 확인하면서
				System.out.println("===================");
				for(int i = 0; i < cnt;i++) {
					
					//학생의 이름 안에 검색어가 있니 ?
					if (datas[i].contains(searchContent)) {
						System.out.println(datas[i]);
						flag = true; // 검색결과를 찾은 상태
					}
					//	   있다면, 출력
					//	   없다면, 출력x
					
					
				}
				if(!flag) { // 검색결과가 없다면
					System.out.println("검색결과가 없습니다 ...");
				}
				// 검색결과가 없다면, 없다고 알려주기
				// 1. 검색결과가 없다는 출력은 한번만! 수행하기 때문에 반복문 바깥에 있어야함
				// 2. 검색결과가 없다는 사실은 검색을 다 ~~~ 해봐야 알 수 있음
				// === >> flag 로직 대표적인 케이스


			}
			else if(menu==4) { // 번호로 검색 => PK로 검색 == selectOne(getOne)
				// Primary Key : "데이터를 '식별'"할 수 있게 해주는 값
				// ex) 주민번호, 학번, ...
				// 사용자가 지정하는 것이 아니라, 프로그램에서 부여하는 값
				// 현재 학생부 프로그램에서는 '번호' == PK

				// 경계값 검사
				if(cnt<=0) { // 학생이 한명도 저장되어있지않다면
					System.out.println("검색할 학생 데이터가 없습니다!");
					continue; // 프로그램 처음으로 돌아가기
				}


				int num;
				while(true) {
					System.out.print("검색할 학생의 번호 입력 >> ");
					num=sc.nextInt();
					// 사용자가 검색하고싶은 번호를 입력 : 유효성 검사
					if(1<=num && num<=cnt) { // 경계값 검사
						break;
					}
					System.out.println("올바른 번호를 입력해주세요!~~");
					// 제대로 입력하라고 안내문구 출력
				}


				System.out.println(num+"번 학생의 이름은 "+datas[num-1]+" 입니다.");
				// 사용자가 입력한 번호에 해당하는 학생의 이름은
				// datas[num-1] 입니다.




			}
			else if(menu==5) { // 이름변경

				// UPDATE : UPDATE 처리할 대상 데이터가 특정되어있어야함!
				// ex) 프로필 사진 변경, 닉네임 변경, ...

				// 이름을 변경할 학생의 번호 입력 >>
				// PK로 데이터를 특정한 후에 UPDATE를 진행해야함



				if(cnt<=0) {
					System.out.println("변경할 학생 데이터가 없습니다!");
					continue;
				}

				int num;
				while(true) {
					System.out.print("변경할 학생의 번호 입력 >> ");
					num=sc.nextInt();
					if(1<=num && num<=cnt) {
						break;
					}
					System.out.println("올바른 번호를 입력해주세요!~~");
				}
				// PK로 대상을 특정짓는다는 부분이 selectOne와 닮을수밖에 없다!!!!!


				// 사용자가 A를 변경하고싶어한다.
				System.out.println(num+"번 학생의 이름은 "+datas[num-1]+" 입니다.");


				// B로 이름을 변경
				// 정말 변경할지 확인
				String name;
				while(true) {
					System.out.print("변경할 이름을 입력해주세요. >> ");
					name=sc.next();

					System.out.print("정말 "+name+"(으)로 하시겠습니까? (Y/N) >> ");
					String answer=sc.next();

					if(answer.equals("Y")) {

						boolean flag=false;

						for(int i=0;i<cnt;i++) {
							if(name.equals(datas[i])) {
								flag=true;
								System.out.println(name+"은(는) 이미 존재하는 이름입니다...");
							}
						}
						
						if(!flag) {
							break;
						}
					}
				}
				// 새로운 데이터를 입력한다는 점에서 CREATE와 닮았다!~~


				// A 자리에 B 데이터 저장
				datas[num-1]=name;
			}
			else { // 유효성 검사
				System.out.println("제대로 입력해주세요~~");
			}
		}


	}

}

다른 부분은 스스로 구현을 다 해냈지만 menu에 3번, 4번을 스스로 구현해내지 못했고, flag 변수를 사용하는 것을 생각해내지 못했다.

 

위 코드처럼 구현해내도 상관은 없지만, 함수를 사용하지 않게 되면 코드를 재사용할 수 없다는 단점을 가진다.

 

아래는 JAVA 함수를 이용해서 위 코드와 동일하게 동작하는 코드이다.

import java.util.Scanner;

public class Test01 {

	public static int sample(String[] datas) {
		// 학생부 배열에 샘플 데이터를 저장해주고,
		// 몇명이 저장되었는지 반환해주는 함수
		datas[0]="티모";
		datas[1]="아리";
		datas[2]="모르가나"; // 배열은 call by reference ▶ 반환 x
		int cnt=3; // 원시타입 ▶ 반환 o
		return cnt;
	}

	public static int printMenu() {
		// 메뉴를 출력해주고,
		// 사용자로부터 메뉴번호로 입력받은 값을 반환해주는 함수
		Scanner sc=new Scanner(System.in);
		System.out.println("=== 메 뉴 ===");
		System.out.println("1. 학생추가");
		System.out.println("2. 학생부 전체출력");
		System.out.println("3. 이름으로 검색");
		System.out.println("4. 번호로 검색");
		System.out.println("5. 이름변경");
		System.out.println("0. 프로그램 종료");
		System.out.println("===============");
		System.out.print("메뉴 입력 >> ");
		int menu=sc.nextInt();
		return menu;
	}

	public static boolean isFull(int cnt,String[] datas) {
		// 더 이상 학생 데이터를 저장할 수 없을때
		if(cnt >= datas.length) {
			System.out.println("더이상 데이터를 저장할수없습니다!");
			return true;
		}
		return false;
	}
	public static boolean isEmpty(int cnt) {
		// 아직 저장된 학생 데이터가 전혀 없을때
		if(cnt<=0) { 
			System.out.println("저장된 학생 데이터가 없습니다.");
			return true;
		}
		return false;
	}

	public static String inputName(int cnt,String[] datas) {
		// 사용자가 이름을 입력하면 그 이름 값을 반환하는 함수
		Scanner sc=new Scanner(System.in);
		String name;
		while(true) {
			System.out.print("변경할 이름을 입력해주세요. >> ");
			name=sc.next();

			System.out.print("정말 "+name+"(으)로 하시겠습니까? (Y/N) >> ");
			String answer=sc.next();

			if(answer.equals("Y")) {

				boolean flag=false;

				for(int i=0;i<cnt;i++) {
					if(name.equals(datas[i])) {
						flag=true;
						System.out.println(name+"은(는) 이미 존재하는 이름입니다...");
					}
				}


				if(!flag) {
					break;
				}

			}
		}
		return name;

	}

	// 학생부 전체 출력 담당하는 기능의 함수
	// input, output 먼저 생각해보기!!!!!!!!!!
	// input : 학생부 데이터, 현재 저장된 학생의 수
	// output : x
	public static void printStudents(String[] datas,int cnt) {
		System.out.println("=== 학생 목록 ===");
		for(int i=0;i<cnt;i++) {
			System.out.println((i+1)+"번 학생 "+datas[i]);
		}
		System.out.println("====================");
	}

	public static boolean isRight(int num,int cnt) {
		if(1<=num && num<=cnt) {
			return true;
		}
		return false;
	}

	// 학생 번호로 검색
	// input : 학생부 데이터, 현재 저장된 학생의 수
	// output : x (대체적으로 출력(select,read,R)기능은 output이 없음)
	public static int selectOne(String[] datas,int cnt) {
		Scanner sc=new Scanner(System.in);
		int num;
		while(true) {
			System.out.print("검색할 번호 입력 >> ");
			num=sc.nextInt();
			if(isRight(num,cnt)) {
				break;
			}
		}      
		System.out.println(num+"번 학생은 "+datas[num-1]+"입니다.");
		return num;
	}


	public static void main(String[] args) {
		String[] datas = new String[5];
		Scanner sc=new Scanner(System.in);
		System.out.println("학생부 프로그램");

		int cnt=sample(datas);

		while(true) {
			int menu=printMenu();
			if(menu==0) {
				System.out.println("프로그램이 종료됩니다.");
				break;
			}
			else if(menu==1) { // 학생추가

				/*
            if(cnt >= datas.length) {
               System.out.println("더이상 데이터를 저장할수없습니다!");
               continue;
            }
				 */
				if(isFull(cnt,datas)) {
					continue;
				}



				String name=inputName(cnt, datas);
				datas[cnt]=name;
				cnt++;

				System.out.println(name+"이(가) 저장되었습니다!");

			}
			else if(menu==2) { // 학생부 전체출력

				/*
            if(cnt<=0) { 
               System.out.println("보여줄 학생 데이터가 없습니다.");
               continue;
            }
				 */
				if(isEmpty(cnt)) { 
					continue;
				}

				printStudents(datas,cnt);
			}
			else if(menu==3) { // 이름으로 검색

				// 검색어를 입력 >> 
				// 이 검색어가 맞습니까? xxx : 사용자가 하는 입력이 데이터에 변화를주지않기때문
				System.out.print("검색어 입력 >> ");
				String searchContent=sc.next(); // searchKeyword

				boolean flag=false; // 검색결과가 없는 상태로 시작

				// 학생부를 하나하나 확인하면서
				System.out.println("===============");
				for(int i=0;i<cnt;i++) {
					// 학생의 이름안에 검색어가 있니? ==> 티모 == 모 xxxxx 티모안에 모가 있니? o
					if(datas[i].contains(searchContent)) { // 티모안에 모가 있니?
						System.out.println(datas[i]);
						flag=true; // 검색결과를 찾은 상태
					}
					// 있다면, 출력
					// 없다면, 출력 x
				}

				if(!flag) { // 검색결과가 없다면
					System.out.println("검색결과가 없습니다...");
				}
				// 검색결과가 없다면, 없다고 알려주기
				// 1. 검색결과가 없다는 출력은 한번만! 수행하기때문에 반복문 바깥에있어야함
				// 2. 검색결과가 없다는 사실은 검색을 다~~~ 해봐야알수있음
				// ===>> flag 로직 대표적인 케이스 !!!

				System.out.println("===============");


			}
			else if(menu==4) { // 번호로 검색 => PK로 검색 == selectOne(getOne)
				// Primary Key : "데이터를 '식별'"할 수 있게 해주는 값
				// ex) 주민번호, 학번, ...
				// 사용자가 지정하는 것이 아니라, 프로그램에서 부여하는 값
				// 현재 학생부 프로그램에서는 '번호' == PK

				if(isEmpty(cnt)) { 
					continue;
				}

				selectOne(datas,cnt);

			}
			else if(menu==5) { // 이름변경

				// UPDATE : UPDATE 처리할 대상 데이터가 특정되어있어야함!
				// ex) 프로필 사진 변경, 닉네임 변경, ...

				// 이름을 변경할 학생의 번호 입력 >>
				// PK로 데이터를 특정한 후에 UPDATE를 진행해야함


				if(isEmpty(cnt)) { 
					continue;
				}


				int num=selectOne(datas,cnt);



				datas[num-1]=inputName(cnt, datas);
			}
			else { // 유효성 검사
				System.out.println("제대로 입력해주세요~~");
			}
		}


	}

}

함수를 사용함으로써, 코드 재사용성이 용이해짐을 볼 수 있다.

 

 

 

과제로는 첫 코드를 함수를 이용해서 구현하는 것이었는데, 함수의 input과 output 개념 숙지가 덜 됐어서 그런지 내 스스로는 100% 해내지는 못했다. 무엇보다도, main 코드의 제어문 부분을 함수로 옮기는 것이 어려웠다.

 

 


※ 코드에 제어문(continue, break, return, ... ) 이 존재할 때
    >> 제어문은 main()에 위치해야만 함! ( 이번에 과제하면서 알게된 사실 )
    >> if문과 함께 사용될 가능성이 매우 높음
    >> isXxx(), hasXxx()와 같은 boolean 반환 메서드로 변경


### 서로 비슷한 기능인데, 완벽히 동일하지는 않을 때 ###
1. 함수를 호출하고, 내부에서 1/2 버튼식으로 조정
2. 같은 부분까지만 함수로 두고, 다른 부분은 함수화 x
 
CREATE 저장
UPDATE 저장  2번으로 하면 좋을듯 !

호출되는 공간이 다르기때문에 2번이 유리할 듯 하다 ! ( 이번 코드는..)


이미 존재하는 코드를 함수화 시키는 방법
>> 연습을 충분히해야함! ( 나는 아직 연습이 많이 부족한 상태였기 때문에, 많이 어려웠다.)

아무것도 없을 때, 함수부터 제작하는 방법
1. input, output을 고려해보고 (이 단계가 나에겐 좀 어려웠다. 경험 부족)
2. 그에 맞는 메서드 시그니쳐 선언(정의)
3. 기능 구현
4. 변경사항 적용하기


1. 코드 먼저 작성하고 >> 함수화
2. 함수 먼저 작성하고 >> main()에 적용

'JAVA' 카테고리의 다른 글

JAVA 메서드 오버로딩  (0) 2024.07.02
객체지향 vs 절차지향 , 생성자에 대해서  (0) 2024.07.01
JAVA 함수  (0) 2024.06.28
반복문과 배열 예제 풀이  (0) 2024.06.27
디버깅표를 이용한 이중for문 - 별찍기  (0) 2024.06.27
'JAVA' 카테고리의 다른 글
  • JAVA 메서드 오버로딩
  • 객체지향 vs 절차지향 , 생성자에 대해서
  • JAVA 함수
  • 반복문과 배열 예제 풀이
yn98
yn98
좌우명 : 여전할 것 인가, 역전할 것 인가? 백엔드 개발자가 되고싶은 역전하고 있는 개발자 꿈나무의 블로그입니다. 개발을 하면서 공부한 것들을 기록합니다. 24.06 ~
  • yn98
    개발 꿈나무
    yn98
  • 전체
    오늘
    어제
    • 분류 전체보기 (131)
      • Python (3)
      • 공부 (7)
      • DB (7)
      • JAVA (24)
      • JSP (9)
      • jQuery (2)
      • HTML (3)
      • Spring (20)
      • 웹 (4)
      • C (1)
      • Git (2)
      • 에러일기 (19)
      • 프로젝트 (6)
      • 책 (21)
        • 멘토씨리즈 자바 (14)
        • 2024 수제비 정보처리기사 (7)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
    • Notion
  • 공지사항

  • 인기 글

  • 태그

    recoverabledataaccessexception
    티스토리챌린지
    정보처리기사 실기
    @Component
    DispatcherServlet
    어노테이션
    수제비
    @service
    aop
    @repository
    오블완
    MVC
    스프링 프레임워크
    상속
    오버로딩
    객체지향
    codeup 4891 : 행복
    2-layered 아키텍처
    Di
    이벤트 스케줄러
    생성자
    정보처리기사
    jsp
    java
    ViewResolver
    정처기 실기
    정처기
    Spring
    html
    멘토씨리즈 자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
yn98
JAVA 함수를 이용해서 학생부 프로그램 만들기

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.