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
'Programming Language > JAVA' 카테고리의 다른 글
[Java] 생성자 Constructor (0) | 2024.08.10 |
---|---|
[Java] 객체 지향 프로그래밍 (OOP) · 객체와 클래스 · 필드 (0) | 2024.08.10 |
[Java] 메소드 (method) 선언과 구현 · 호출 · 종류 (0) | 2024.08.09 |
[Java] Array | 배열의 활용 · 2차원 배열 (0) | 2024.08.09 |
[Java] Array | 배열 선언과 생성 · 배열 길이와 인덱스 · 배열 초기화 · 배열 출력 (0) | 2024.08.09 |