아래는 함수를 이용하지 않고 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 |