[JAVA] 메서드 Method 2/2
메서드 Method 1/2 정리 내용
[JAVA] 메서드 Method 1/2
듣고 있는 인터넷 강의 메서드 Method 를 사용하는 이유프로그램의 여러 곳에서 같은 계산을 반복해야 할 때 함수를 만들어 두고필요한 입력 값을 넣어서 해당 함수를 호출하면 코드를 여러 번
helloahram.tistory.com
메서드와 형 변환
메서드를 호출할 때도 형 변환이 적용된다
🐣 인자와 매개변수가 맞지 않다면 형 변환을 해줘야 한다 🐣
아래 예시는 int 형 매개변수에 double 을 대입하면 컴파일 에러가 발생하므로 형 변환을 해준다
package method;
public class MethodCasting1 {
public static void main(String[] args) {
double number = 1.5;
printNumber(number); // 컴파일 오류 발생
printNumber((int)number); // 형 변환
}
public static void printNumber(int n){
System.out.println("숫자 " + n);
}
}
반대로 double 형 매개변수에 int 형 인수를 전달하는 것은 문제 없이 잘 동작한다
double 형이 더 큰 숫자 범위이므로 자동 형 변환이 적용되기 때문이다
메서드 오버로딩
자바는 메서드 이름 뿐 아니라 매개변수 정보를 함께 사용해서 메서드를 구분하기 때문에
이름이 같고 매개변수가 다른 메서드를 정의할 수 있다
add(int a, int b)
add(int a, int b, int c)
add(double a, double b)
이렇게 이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것을 메서드 오버로딩 Overloading 이라고 한다
여러 개의 메서드가 있을 때 먼저 본인의 타입에 최대한 맞는 메서드를 찾아서 실행하고
그래도 없으면 형 변환 가능한 타입의 메서드를 찾아서 실행한다
오버로딩 규칙
메서드의 이름이 같아도 매개변수의 타입과 순서가 다르면 오버로딩을 할 수 있다 (이름은 상관 없다)
참고로 반환 타입은 인정하지 않는다
메서드 시그니처 Method Signature
메서드 시그니처 = 메서드 이름 + 매개변수 타입 (순서)
자바에서 메서드를 구분할 수 있는 고유한 식별자나 서명, 즉, 메서드를 구분할 수 있는 기준
자바가 각각의 메서드를 고유하게 구분할 수 있어야 어떤 메서드를 호출할 지 결정할 수 있기 때문에
메서드 이름이 같아도 메서드 시그니처가 다르면 다른 메서드로 간주한다
반환 타입과 변수 이름은 시그니처에 포함되지 않는다
메서드 추출 Extract Method
/* 기존 코드 */
package method.ex;
public class MethodEx3 {
public static void main(String[] args) {
int balance = 10000;
// 입금 1000
int depositAmount = 1000;
balance += depositAmount;
System.out.println(depositAmount + "원을 입금하였습니다. 현재 잔액: " + balance+ "원");
// 출금 2000
int withdrawAmount = 2000;
if (balance >= withdrawAmount) {
balance -= withdrawAmount;
System.out.println(withdrawAmount + "원을 출금하였습니다. 현재 잔액: " + balance + "원");
} else {
System.out.println(withdrawAmount + "원을 출금하려 했으나 잔액이 부족합니다.");
}
System.out.println("최종 잔액: " + balance + "원");
}
}
기존 코드를 deposit 과 withdraw 메서드로 구분해서 작성할 수 있다
package method.ex;
public class MethodEx3 {
public static void main(String[] args) {
/* 입금 deposit 과 출금 withdraw 를 메서드로 만들기 */
int balance = 10000; // 현재 잔액 만원
/* 잔액 갱신 */
balance = deposit(balance, 1000);
balance = withdraw(balance, 12000);
balance = withdraw(balance, 2000);
System.out.println("최종 잔액 : "+balance);
}
/* 입금하는 Method */
public static int deposit(int balance, int amount) {
balance += amount;
System.out.println(amount+"원 입금, 잔액 : "+balance);
return balance;
}
/* 출금하는 Method */
public static int withdraw (int balance, int amount) {
if(balance >= amount) {
balance -= amount;
System.out.println(amount+"원 출금, 잔액 : "+balance);
}
else
System.out.println(amount+"원 출금 시도, 잔액 부족");
return balance;
}
}
이렇게 메서드로 나누면 전체 구조를 한 눈에 파악할 수 있고,
특정 메서드로 수정 범위가 한정되기 때문에 유지보수하기 좋다
이런 리팩토링을 메서드 추출 Extract Method 라고 한다
메서드를 재사용하는 목적이 아니라도, 메서드를 적절하게 사용해서 분류하면
구조적으로 읽기 쉽고 유지보수하기 좋은 코드를 만들 수 있다
그리고 메서드의 이름으로 프로그램을 더 읽기 좋게 만들 수 있다
입출금 프로그램에 사용자 입력 기능도 추가한 코드는 아래와 같다
package method.ex;
import java.util.Scanner;
public class MethodEx4 {
public static void main(String[] args) {
/* 입금 deposit 과 출금 withdraw 를 메서드로 만들기 2탄 */
/* 사용자로부터 입력 받아 입금과 출금 반복하기 */
Scanner scanner = new Scanner(System.in);
int balance = 0; // 잔고
while (true) {
System.out.println("-------------------------------------");
System.out.println("1. 입금 | 2. 출금 | 3. 잔액 확인 | 4. 종료");
System.out.println("-------------------------------------");
System.out.print("선택 : ");
int menu = scanner.nextInt();
int amount;
switch (menu) {
case 1:
System.out.print("입금액을 입력하세요 : ");
amount = scanner.nextInt();
balance = deposit(balance, amount);
break;
case 2:
System.out.print("출금액을 입력하세요 : ");
amount = scanner.nextInt();
balance = withdraw(balance, amount);
break;
case 3:
System.out.println("잔액은 " + balance + "원입니다");
break;
case 4:
System.out.println("프로그램을 종료합니다 ");
return; // return; 하면 main 문도 끝남
default:
System.out.println("올바른 선택이 아닙니다 ");
}
}
}
/* 입금하는 Method */
public static int deposit(int balance, int amount) {
balance += amount;
System.out.println(amount+"원 입금, 잔액 : "+balance);
return balance;
}
/* 출금하는 Method */
public static int withdraw (int balance, int amount) {
if(balance >= amount) {
balance -= amount;
System.out.println(amount+"원 출금, 잔액 : "+balance);
}
else
System.out.println(amount+"원 출금 시도, 잔액 부족");
return balance;
}
}
메서드 사용의 장점
코드 재사용 - 메서드는 특정 기능을 캡슐화하므로, 필요할 때마다 해당 메서드를 호출함으로써 코드를 재사용할 수 있다
코드의 가독성 - 메서드의 이름은 코드가 수행하는 작업을 명확하게 나타내므로, 코드를 읽는 사람에게 추가적인 문맥을 제공한다
모듈성 - 큰 프로그램을 관리 가능한 작은 부분으로 나눠서, 코드의 가독성을 향상시키고 디버깅을 쉽게 만든다
코드 유지 관리 - 코드의 특정 부분에서 문제가 발생하거나 업데이트가 필요한 경우 메서드만 수정하면 되므로, 전체 코드 베이스에 영향을 주지 않고 변경 사항을 적용할 수 있다
재사용성과 확장성 - 다른 프로그램이나 프로젝트에서도 재사용할 수 있으며, 새로운 기능을 추가하거나 기존 기능을 확장하는 데 유용하다
추상화 - 메서드의 복잡한 내부 작업에 대해 알 필요 없이 메서드를 사용할 수 있다
테스트와 디버깅 용이성 - 개별 메서드는 독립적으로 테스트하고 디버그할 수 있기 때문에 코드의 문제를 신속하게 찾고 수정하는 데 좋다
+ 코드를 작성할 때 복잡하게 작성하지 마라, 단순하고 명확하게 만들자