1.  JVM 메모리 구조

1)  메서드 영역 (method area)

  • 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스파일을 분석하여 이곳에 저장한다.

2)  힙(heap)

  • 인스턴스가 생성되는 공간.

3)  호출스택(call stack 또는 execution stack)

  • 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출된 메서드를 위한 메모리가 할당되며 이 메모리는 메서드가작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용된다.
  • 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.
  • 각 메서드를 위한 메모리상의 작업공간은 서로 구별되며, 첫 번째로 호출된 메서드를 위한 작업공간이 호출스택의 맨 밑에 마련되고, 첫 번째 메서드 수행 중에 다른 메서드를 호출하면 첫 번째 메서드의 바로 위에 두 번째로 호출된 메서드를 위한 공간이 마련된다.
💡  후입선출 구조 (LIFO : Last-in, First-out)
     -  제일 상위에 위치하는 메서드가 현재 실행중인 메서드 
     -  이 메서드가 끝나야 먼저 호출된 메서드가 다시 실행하게 됨
     -  반환타입이 있는 메서드는 종료되면서 결과값을 자신을 호출한 메서드(caller)에게 반환한다
     -  caller는 넘겨받은 반환값으로 수행을 계속 진행하게 된다

public class MyMethod_08 {

	// main() -> firstMethod() -> secondMethod()
	// 메모리 구조상 secondMethod가 가장 위에 쌓이고, main이 가장 아래에 깔린다고 생각하면 됨.

	public static void main(String[] args) {
	     System.out.println("main(String[] args)이 시작되었음."); //1
	     firstMethod(); // 이 메서드를 호출함. 리턴 값이 있든 없든 이 메서드가 끝나야지 다음 줄로 넘어감.
	     System.out.println("main(String[] args)이 끝났음.");//6
	}
	
    static void firstMethod() {
    	System.out.println("firstMethod()이 시작되었음."); //2
        secondMethod(); // 이 메서드가 끝나야지 다음 줄로 넘어감.
        System.out.println("firstMethod()이 끝났음.");//5
    }
    
    static void secondMethod() {
    	System.out.println("secondMethod()이 시작되었음."); //3
    	System.out.println("secondMethod()이 끝났음."); //4
    }
}

 

 

​2.  오버로딩(overloading)

🚀  한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 말함

🚀  오버로딩의 조건  1) 메서드 이름이 같아야 한다. 2) 매개변수의 개수 또는 타입이 달라야 한다.

      ⚡️  매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.

장점
  • 메서드의 이름만 보고도 같은 기능을 하겠다는 예측을 쉽게 할 수 있다.
  • 메서드의 이름을 절약할 수 있음   ➡️  하나의 이름으로 여러개의 메서드를 정의할 수 있어 이름 짓는데 고민이 줄고, 동시에 사용되었어야 할 메서드 이름을 다른 메서드의 이름으로 사용할 수 있다.
public class MyMethod_06 {

	public static void main(String[] args) {
		
		printGreet(); // 안녕하세요
		printGreet("안녕~!"); // 안녕~!
		printGreet("한수", "잘 지내셨나요?"); // 한수님! 잘 지내셨나요?
		printGreet(3); // 안녕하세요. 3번째 보는거네요.
	}
	
	public static void printGreet() {
		System.out.println("printGreet() 메서드가 실행됩니다.");
		System.out.println("안녕하세요.");
	}
	
	public static void printGreet(String greeting) {
		// 같은 이름의 메서드가 있으나 매개변수가 없음
		System.out.println("printGreet(String greeting) 메서드가 실행됩니다.");
	    System.out.println(greeting);
	}
	
	public static void printGreet(String name, String greeting) {
		// 매개변수가 문자열인 메서드가 있으나 갯수가 다름
		System.out.println("printGreet(String name, String greeting) 메서드가 실행됩니다.");
	    System.out.println(name + "님! "+ greeting);
	}
	
    public static void printGreet(int cont) {
    	// 매개변수가 하나인 메서드가 있으나 데이터 타입이 다름
        System.out.println("printGreet(int cont) 메서드가 실행됩니다.");
        System.out.println("안녕하세요. " + cont + "번째 보는거네요.");
    }
}
 


3.  응용 문제

1)  암산 트레이닝

public class Ex_02_01 {
    static Scanner scanner= new Scanner(System.in);
   
    static boolean confirmRetry() {
    	int numb;
    	do {
    		System.out.print("다시 한 번? <Yes-1/No-0> : ");
    		numb = scanner.nextInt();
    	} while(numb != 0 && numb != 1);
    	return numb == 1;
    }

	public static void main(String[] args) {
		Random random = new Random();
		
		System.out.println("암산 트레이닝!!");
	    do {
	    	int x = random.nextInt(90)+10;
	    	int y = random.nextInt(90)+10;
	    	int z = random.nextInt(90)+10;
	    	
	    	while (true) {
	    		System.out.print(x + " + " + y + " + " + z + " = ");
	    		int k = scanner.nextInt();
	    		if (k == x + y + z) { // 정답
	    			break;
	    		}	
	    		else if ( k > x + y + z ) {
	    			System.out.println("down");
	    		}
	    		else {
	    			System.out.println("up");
	    		}
	    		System.out.println("틀렸습니다!!");
	    	}
	    } while(confirmRetry());
	}
}

 2)  학생 조사

public class Ex_02_02 {

	static Scanner scanner = new Scanner(System.in);
	static boolean run = true; 
    static int studentNum = 0; 
    static int[] scores = null;
	
	public static void main(String[] args) {
		
        while (run) {
            System.out.println("-----------------------------------------------------");
            System.out.println("1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료");
            System.out.println("-----------------------------------------------------");
            System.out.print("선택> ");
            int selectNo = scanner.nextInt();
          
            if (selectNo == 1) {
            	inputStudentNum();
            } else if (selectNo == 2) {
            	inputScores();
            } else if (selectNo == 3) {
                printScores();
            } else if (selectNo == 4) {
                printAnalysis();
            } else if (selectNo == 5) {
                setRun();
            }
        }
        System.out.println("프로그램 종료");
	}
	
	public static void inputStudentNum() {
		System.out.print("학생수> ");
        studentNum = scanner.nextInt();
        scores = new int[studentNum];
        System.out.println(Arrays.toString(scores));
	}
	
	public static void inputScores() {
		for(int i = 0; i < scores.length; i++) {
        	System.out.print("scores["+i+"] : ");
        	scores[i] = scanner.nextInt();
		}
	}
	
	public static void printScores() {
		for(int i = 0; i < scores.length; i++) {
            System.out.println("score["+i+"] : " + scores[i]);
    	}
	}
	
	public static void printAnalysis() {
		int max = 0;
    	int sum = 0;
    	double avg = 0;
    	
    	for(int i = 0; i < scores.length; i++) {
    		max = (max < scores[i]) ? scores[i] : max;
    		sum += scores[i];
			}
		    avg = (double) sum / studentNum;
		    System.out.println("최고 점수: " + max);
    		System.out.println("평균 점수: " + avg);
	}
	
	public static void setRun() {
		run = false;
	}
}
 

 3)  login & logout

  • login() 메서드와 logout() 메서드를 선언
  • login() 메서드를 호출할 때는 매개값으로 id와 passwd를 제공하고, logout() 메서드는 id만 매개값으로 제공
  • login() 메서드는 매개값 id가 "admin", 매개값 password가 "1234"일 경우에만 true로 리턴하고 그외의 값일 경우에는 false를 리턴 
  • logout() 메서드는 "admin 아이디가 로그아웃 되었습니다."가 출력
public class Ex_02_04 {
	
	static Scanner scanner = new Scanner(System.in);
	
	public static boolean login(String id, String password) {
		System.out.print("아이디를 입력해 주세요. >> ");
        String inputId = scanner.nextLine();
        
        
        System.out.print("비밀번호를 입력해 주세요. >> ");
        String inputPw = scanner.nextLine();
        
        return inputId.equals("admin") && inputPw.equals("1234");
	}
	
	public static void logout(String id) {
		System.out.println(id + "가 로그아웃 되었습니다.");
	}

	public static void main(String[] args) {

        boolean result = login("",""); // true대신 login()호출;
         if (result) {
             System.out.println("로그인 되었습니다.");
             logout("admin");
             //logout() 호출;
         }
         else {
             System.out.println("id 또는 password가 올바르지 않습니다.");
         }
         
	}
}
 

 

*  내용 참고 : 학원강의 및 자바의정석 3rd

+ Recent posts