javaboiii의 JAVA/JAVA 예제

JAVA - [함수] 학생부 프로그램 함수화

javaboiii 2024. 7. 1. 13:23

JAVA

함수 활용 : 코드 재사용성 
함수 기능에 대한 설명
static : 정말 필요한 순산이 아니라면 사용 x
이유) 무거움, 메모리가 무거움

static == 객체와 무관하게, 프로그램에 종속되어있다


 

### 함수 제작 순서 ###

1.void 기능명() + 간단한 주석

2. main에서 코드 뜯어오기

3. return 잇나 살펴보기

4. 메서드 시그니쳐 변경

5. 주석 제대로 설명 작성하기

 


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

 

학생부 예제 참고

https://javaboiii.tistory.com/10


샘플 데이터 생성 함수

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

 

중복되고 재상용성이 높은 함수

// 중복되고 재상용성이 높은 코드들 함수화

public static boolean isFull(int cnt, String[] datas) {
    // 더 이상 학생 데이터를 저잘할 수 없을 때
    if(cnt >= datas.length) { // 학생 5명보다 더 추가한다면
        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;
}

public static boolean isRight(int num, int cnt) {
// selecOne함수의 경계값 검사
    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.println("검색할 번호 입력 >>>");
        num = sc.nextInt();
        if(isRight(num,cnt)) {
            break;
        }

    }
    System.out.println(num+"번 학생은 "+datas[num-1]+"입니다");
    return num;
}

 

isRight 와 selectOne을 나눈이유

isRight는 "입력한 수가 정상인지 체크"기능

selectOne 은 "학생 검색" 기능 이기때문

 

### 서로 비슷한 기능인데, 완벽히 동일하지는 않을 때 ###

1. 함수를 호출하고, 내부에서 1/2 번튼식으로 조정 ) 징크스 Q  -> 혼자서 작성할 때
2. 같은 부분까지만 함수로 두고, 다른 부분은 함수화 X) 독뎀, 이펙트

 

 

public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    String[] datas = new String[5];

    int cnt = sample(datas);

    while(true) {

        int menu = printMenu();

        if(menu==0) {
            System.out.println("프로그램이 종료됩니다.");
            break;
        }
        else if(menu==1) {
            if(isFull(cnt, datas)) {
                continue;
            }
            String name = datas[cnt]=inputName(cnt, datas); // 학생 추가
            cnt++; // 총학생수 증가

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

        }
        else if(menu==2) {
            // 학생부 전체출력
            if(isEmpty(cnt)) {
                continue;
            }
            printStudents(datas, cnt);
        }
        else if(menu==3) { // 이름으로 검색
            System.out.println("검색어 입력 >>");
            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; // 검색 결과를 찾은 상태
                }
            }
            if(!flag) { // 검색 결과가 없다면
                System.out.println("검색결과가 없습니다");
            }
            System.out.println("===============");
        }
        else if(menu==4) { // 번호로 검색 => PK로 검색 == selectOne(getOne)
            selectOne(datas, cnt);
        }
        else if(menu==5) {
            if(isEmpty(cnt)) { //학생부 목록의 학생이 없다면
                continue;
            }
            int num = selectOne(datas, cnt);

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

 

아무것도 없을 때, 함수부터 제작하는 방법
 >> 

1. input, output을 고려해보고
2. 그에 맞는 메서드 시그니쳐 선언(정의)
3. 기능 구현
4. 변경사항 적용하기

 

 

알듯 말듯 함 아오

 

 

'javaboiii의 JAVA > JAVA 예제' 카테고리의 다른 글

JAVA - ArrayList, Map 예제  (0) 2024.07.15
JAVA - 인터페이스 예제  (0) 2024.07.12
JAVA - 함수 예제  (0) 2024.07.01
JAVA - [제어문] 학생부 프로그램  (0) 2024.06.28
JAVA - 이중for문(중첩 반복문) 예제  (0) 2024.06.27