Back-End

[JAVA] 기초 공부 7(MVC, 오버로딩)

Minch13r 2025. 1. 9. 15:17

2025.1.9 자바 오버로딩과 MVC에 대해 공부하겠다.

 

함수가 비슷하거나 똑같은 기능이 존재할 때, 함수명이 서로 다르면 사용이 매우 불편하다. 비슷하거나 똑같은 기능의 함수가 있다면 함수명을 동일하게 사용이 가능하다. 이를 오버로딩(Overloading) 혹은 함수명 중복정의 허용이라고 한다. 단, 오버로딩은 메서드 시그니처가 달라야 한다.

 

오버로딩의 대표적인 예시 System.out.println()이 있다. double 형태 int 등등 다양하게 있다.

 

[ MVC 패턴 ]

mvc 패턴? → model, view, controller

“개발 패턴”

MODEL VIEW CONTROLLER

DBMS Front Service
DB 웹페이지 Backend

mvc는 이렇게 개발하라는 일종의 메뉴얼. 근본이 되는 매우 중요한 패턴. 전문성 향상을 위해 파트를 나눴는데 이게 model, view, controller 이렇게 세개이다.

웹퍼블리싱과 웹디자인은 버튼의 위치나 이런거를 넣는거고 백엔드는 버튼이 어떤 기능을 하는지 정하는 것.

사용자 → View → Controleer → Model → DB(서버)

 

[ View ]

사용자와 상호작용하는 파트

UI / UX

유효성 검사(백엔드로 안 넘기는거임)

ex) 생년월일 선택하는데 2026년생은 아예 선택 x

메뉴 입력, 학생 전체 출력, 학생 번호 입력, 학생 정보 출력, 학생 이름 입력, 학생 추가 완료 안내

문제

4번 기능 추가하기.

번호를 입력받아 해당학생의 이름 변경하기.

5번 기능 추가하기.

학생의 이름을 입력받아

해당학생의 정보를 출력하는 프로그램이다.

 

비밀번호 변경 > 이전 비밀번호를 저장해두고 새로 변경할 때 이전 비밀번호랑 겹쳐 안돼 하기에는 보안 수준이 떨어져서 허용해준다.

 

같은 값 변경 방지

  1. 변경하는 화면내에서 “같은 값”에 해당하는 값을 기억 ex) 해시 값으로 저장
  2. 변경을 시도할때마다 같은 값인지 서버 측에 물어보는 방법 ⇒ 비밀번호 변경

 

여러 간단하고 비슷한 출력함수가 있을 때

public static void printInfo(String msg){
	System.out.println(msg);
}
	
	// printInfo("학생 추가 완료!");
	// printInfo("중복되는 이름입니다!");

 

이와 같이 바꿔서 진행할 수 있음

 

코드의 의도는 MVC 중에서 V 즉, View를 나타내는 용도이다. 함수는 일종의 백엔드 api 같은 역할이고. 프론트가 백엔드의 api를 받아와서 보여주는 용도이다.

예시)

백엔드 : 이 버튼은 랜덤으로 섞어주는 기능을 합니다.

프론트 : 랜덤으로 섞어주는 기능을 하는 버튼을 사용자에게 예쁘게 보여주겠습니다.

 

둘이 이런 식으로 나눌 수 있다고 보면 된다.

 

MODEL은 함수가 5개밖에 안 나옴, CRUD

CUD 3개

R selectAll 혹은 selectOne 2개

selectAll은 내가 원하는거 모두 다 선택하는 것.

ex) 외모지상주의 보여줘

public static int[] selectAll(){
	return datas;
	}

selectOne은 내가 원하는 것 중 하나만 선택하는 것.

ex) 외모지상주의 49화 보여줘

public static int[] selectOne(){
	return data;
	}

Insert(Create)

public static boolean insert(){
	datas[i] = data;
	return true;
	if(이상한 문제가 발생했다면){}
		reutrn false;
		}
	}

update

public static boolean update(){
	datas[i] = data;
	return true;
	if(이상한 문제가 발생했다면){}
		reutrn false;
		}
	}

// DB의 selectAll()

public static String[] selectAll(){
	return stuList; 
}
// DB의 selectOne()


public static String[] selectOne(){
	return stuList[num-1]; 
}

 

현재 main 함수에 배열 안에 숫자를 우리가 직접 확인할 수 있어서 코드를 이렇게 적기는 했지만 데이터는 데이터베이스에 들어가 있고 우리가 데이터베이스 내용물을 직접 확인하고 우리가 가져올 수 없다. 인형뽑기와 같은 역할을 하는 Model을 통해서 통 안에 있는 내가 원하는 인형들을 가져오는 것이다.

 


학생부 프로그램 View 형식으로 봤을 때

인자를 다 빼버린다. 인자는 Model을 통해서 가져오면 되기 때문이다. 이 경우는 View만 있을 때다. View는 보통 사용자가 입력하거나 사용자가 보는 것 외에는 없기 때문이다.

package day008.class05;

import java.util.Random;
import java.util.Scanner;

public class Student {
    // model 함수가 다 짜져있다는 가정 하에 View 진행
    public static void printMenu() { // 메뉴 보여주는 함수
        System.out.println("===== 학생부 프로그램 =====");
        System.out.println("1. 전체출력");
        System.out.println("2. 1등 출력");
        System.out.println("3. 정보추가");
        System.out.println("4. 정보변경");
        System.out.println("0. 프로그램 종료");
        System.out.println("========================");
        System.out.print(">> ");
    }

    // 전체출력
    public static void printList() {
        if(cnt <= 0) {
            System.out.println("출력할 데이터가 없습니다.");
            return;
        }
        for(int i=0; i<cnt; i++) {
            System.out.println((i+1) + "번 학생의 점수 : " + stuList[i] + "점");
        }
        System.out.println();
    }

    // 1등 출력
    public static void printTop() {
        if(cnt <= 0) {
            System.out.println("출력할 데이터가 없습니다");
            return;
        }
        int max = stuList[0];
        int maxIndex = 0;
        for(int i=1; i<cnt; i++) {
            if(max < stuList[i]) {
                max = stuList[i];
                maxIndex = i;
            }
        }
        System.out.println("1등은 " + (maxIndex + 1) + "번 학생, " + max + "점 입니다.");
    }

    // 점수 입력
    public static int inputScore(Scanner sc) {
        int score;
        while(true) {
            System.out.print("추가할 학생의 점수 입력 : ");
            score = sc.nextInt();
            if(score >= 0 && score <= 100) {
                break;
            }
            System.out.println("0~100점 사이만 입력 가능합니다!");
        }
        return score;
    }

    // 학생 추가
    public static boolean addStudent(Scanner sc) {
        if(cnt >= LEN) {
            System.out.println("학생부에 저장공간이 부족합니다.");
            System.out.println("관리자에게 문의바랍니다.");
            return false;
        }

        int score = inputScore(sc);
        stuList[cnt] = score;
        System.out.println("학생 정보 추가 완료!");
        return true;
    }

    // 정보변경할 학생 번호 입력 함수
    public static int inputStudentNumber(Scanner sc) {
        int num;
        while(true) {
            System.out.print("정보변경할 학생의 번호 입력 : ");
            num = sc.nextInt();
            if(num >= 1 && num <= cnt) {
                break;
            }
            System.out.println("해당 번호의 학생은 존재하지 않습니다!");
        }
        return num;
    }

    // 학생 점수 변경하는 함수
    public static void modifyScore(Scanner sc, Random rand) {
        if(cnt <= 0) {
            System.out.println("변경할 데이터가 없습니다");
            return;
        }

        int num = inputStudentNumber(sc);
        int score;
        while(true) {
            score = rand.nextInt(101);
            if (score != stuList[num-1]) {
                break;
            }
        }
        stuList[num-1] = score;
        System.out.println(num + "번 학생의 점수가 " + score + "점으로 변경되었습니다.");
    }

    public static void printExit(){
        System.out.println("프로그램을 종료합니다");
    }

    public static void printErr(){
        System.out.println("잘못된 메뉴를 선택하셨습니다.");
    }

    // main 함수
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Random rand = new Random();

        final int LEN = 3;
        int[] stuList = new int[LEN];
        int cnt = 0;

        while(true) {
            printMenu(); // 메뉴 출력
            int action = sc.nextInt();

            if(action == 0) { // 종료
                printExit(); // 종료 함수
                break;
            }
            else if(action == 1) {
                printList(stuList, cnt);
            }
            else if(action == 2) {
                printTop(stuList, cnt);
            }
            else if(action == 3) {
                if(addStudent(stuList, cnt, LEN, sc)) {
                    cnt++;
                }
            }
            else if(action == 4) {
                modifyScore(stuList, cnt, sc, rand);
            }
            else {
                printErr();
            }
        }
    }
}