메소드 사용의 장점
- 코드 재사용 - 특정 기능을 캡슐화 하므로, 재작성 필요없이 메소드를 호출함으로써 코드 재사용 가능
- 코드 가독성
- 모듈성
- 코드 유지 관리
- 재사용과 확장성
- 추상화
- 테스트와 디버깅의 용이성
메소드 예시)
public static int add(int a, int b) {
System.out.println(a + "+" + b + " 연산 수행");
int sum = a + b;
return sum;
}
메소드는 2가지로 크게 분류 할 수 있다.
1.메소드 선언
public static int add(int a, int b)
접근제어자 ▶ public static
반환 타입 ▶ int
메소드이름 ▶ add
매개변수(파라미터) ▶ (int a, int b)
반환할 타입이 없다면 void를 사용한다. cf) void print(String str)
입력값이 필요 없는 메소드는 매개변수를 지정하지 않아도 된다. cf) add()
2. 메소드 본문
{
System.out.println(a + "+" + b + " 연산 수행");
int sum = a + b;
return sum;
}
메소드의 실행 결과를 반환하려면 return문을 사용하여야 한다
메소드를 호출 할 때는 메소드에서 넘기는 값과 매개변수 타입이 일치해야한다(순서와 갯수 모두)
호출: call("hello", 20)
메서드 정의: int call(String str, int age)
반환타입
반환타입이 있으면 반.드.시 return을 사용해서 값을 반환해야한다
p.s)조건문과 함께 쓸 때 주의해야함
package mathod;
public class mathod1 {
public static void checkAge(int age){
if(age<18){
System.out.println(age+"살, 미성년자는 출입이 불가능합니다.");
return;
}
System.out.println(age+"살, 입장하세요.");
}
public static void main(String[] args) {
checkAge(10);
checkAge(18);
}
}
메소드 호출과 값 전달
" 자바는 항상 변수의 값을 복사해서 대입한다 "
예시)
package mathod;
public class mathod1 {
public static void changeNumber(int num2) {
System.out.println("2. changeNumber 변경 전, num2: " + num2);
num2 = num2 * 2;
System.out.println("3. changeNumber 변경 후, num2: " + num2);
}
public static void main(String[] args) {
int num1 = 5;
System.out.println("1. changeNumber 호출 전, num1: " + num1);
changeNumber(num1);
System.out.println("4. changeNumber 호출 후, num1: " + num1);
}
}
---------------------------------------
1. changeNumber 호출 전, num1: 5
2. changeNumber 변경 전, num2: 5
3. changeNumber 변경 후, num2: 10
4. changeNumber 호출 후, num1: 5
응용) 메소드를 활용해서 값 변환하기
package mathod;
public class mathod1 {
public static int changeNumber(int num2) {
num2 = num2 * 2;
return num2;
}
public static void main(String[] args) {
int num1 = 5;
System.out.println("changeNumber 호출 전, num1: " + num1); // 출력: 5
num1 = changeNumber(num1);
System.out.println("changeNumber 호출 후, num1: " + num1); // 출력: 10
}
}
--------------------------------
changeNumber 호출 전, num1: 5
changeNumber 호출 후, num1: 10
강제 형변환
package mathod;
public class mathod1 {
public static void printNumber (int n){ // 형변환 된 값을 대입
System.out.println("숫자: " + n);
}
public static void main(String[] args) {
double number = 1.5;
//printNumber(number); double을 int에 대입하므로 컴파일 오류
printNumber((int) number); // 강제 형변환
}
}
자동 형변환
package mathod;
public class mathod1 {
public static void printNumber (double n){
System.out.println("숫자: " + n);
}
public static void main(String[] args) {
int number = 100;
printNumber(number); // int에서 double로 자동형변환
}
}
메소드 오버로딩
이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것을 메서드 오버로딩(Overloading)이라 한다
오버로딩 성공 예시)
add(int a, int b)
add(int a, int b, int c)
add(double a, double b)
메서드의 이름이 같아도 매개변수의 타입 및 순서가 다르면 오버로딩을 할 수 있다
참고로 반환 타입은 인정하지 않는다
오버로딩 실패 예시)
int add(int a, int b)
double add(int a, int b)
Why?
메서드 이름과 매개변수의 타입이 같다! / 반환 타입은 인정X
메소드 예시)
메소드를 활용한 평균값 리펙토링하기
문)
package mathod;
public class mathod1 {
public static void main(String[] args) {
int a = 1;
int b = 2;
int c = 3;
int sum = a + b + c;
double average = sum / 3.0;
System.out.println("평균값: " + average);
int x = 15;
int y = 25;
int z = 35;
sum = x + y + z;
average = sum / 3.0;
System.out.println("평균값: " + average);
}
}
답)
package mathod;
public class mathod1 {
public static double average(int a, int b, int c) {
int sum = a + b + c;
return sum / 3.0;
}
public static void main(String[] args) {
int a = 1;
int b = 2;
int c = 3;
int sum = a + b + c;
double average = sum / 3.0;
System.out.println("평균값: " + average);
int x = 15;
int y = 25;
int z = 35;
sum = x + y + z;
average = sum / 3.0;
System.out.println("평균값: " + average);
}
}
more simple)
package mathod;
public class mathod1 {
public static double average(int a, int b, int c) {
int sum = a + b + c;
return sum / 3.0;
}
public static void main(String[] args) {
int a = 1;
int b = 2;
int c = 3;
System.out.println("평균값: " + average(a,b,c));
int x = 15;
int y = 25;
int z = 35;
System.out.println("평균값: " + average(x,y,z));
}
}
best simple)
package mathod;
public class mathod1 {
public static double average(int a, int b, int c) {
int sum = a + b + c;
return sum / 3.0;
}
public static void main(String[] args) {
System.out.println("평균값: " + average(1,2,3));
System.out.println("평균값: " + average(15,25,35));
}
}
메소드를 활용한 반복 출력 리펙토링
문)
package mathod;
public class Method1 {
public static void main(String[] args) {
String message = "Hello, world!";
for (int i = 0; i < 3; i++) {
System.out.println(message);
}
for (int i = 0; i < 5; i++) {
System.out.println(message);
}
for (int i = 0; i < 7; i++) {
System.out.println(message);
}
}
}
답)
package mathod;
public class mathod1 {
public static void printMessage(String message, int times) {
for (int i = 0; i < times; i++) {
System.out.println(message);
}
}
public static void main(String[] args) {
String message = "Hello, world!";
printMessage(message,3);
printMessage(message,5);
printMessage(message,7);
}
}
입출금 리펙토링
문)
package mathod;
public class mathod1 {
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 + "원");
}
}
답)
package mathod;
public class mathod1 {
public static int deposit(int balance,int amount){
balance+=amount;
System.out.println(amount+"원을 입금하였습니다. 현재 잔액: " + balance + "원");
return balance;
}
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;
}
public static void main(String[] args) {
int balance = 10000;
// 입금 1000
balance = deposit(balance, 1000);
// 출금 2000
balance = withdraw(balance, 2000);
System.out.println("최종 잔액: " + balance + "원");
}
}
은행계좌 입출금 리펙토링
예시)
---------------------------------
1.입금 | 2.출금 | 3.잔액 확인 | 4.종료
---------------------------------
선택: 1
입금액을 입력하세요: 10000
10000원을 입금하였습니다. 현재 잔액: 10000원
---------------------------------
1.입금 | 2.출금 | 3.잔액 확인 | 4.종료
---------------------------------
선택: 2
출금액을 입력하세요: 8000
8000원을 출금하였습니다. 현재 잔액: 2000원
---------------------------------
1.입금 | 2.출금 | 3.잔액 확인 | 4.종료
---------------------------------
선택: 2
출금액을 입력하세요: 3000
3000원을 출금하려 했으나 잔액이 부족합니다.
---------------------------------
1.입금 | 2.출금 | 3.잔액 확인 | 4.종료
---------------------------------
선택: 3
현재 잔액: 2000원
---------------------------------
1.입금 | 2.출금 | 3.잔액 확인 | 4.종료
---------------------------------
선택: 4
시스템을 종료합니다.
리펙토링)
package mathod;
import java.util.Scanner;
public class method2 {
public static void main(String[] args) {
int balance = 0;
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("---------------------------------:");
System.out.println("1.입금 | 2.출금 | 3.잔액확인 |4.종료");
System.out.println("---------------------------------:");
System.out.println("선택 :");
int choice = sc.nextInt();
int amount;
switch (choice) {
case 1:
System.out.print("입금액을 입력하세요: ");
amount = sc.nextInt();
balance = deposit(balance, amount);
break;
case 2:
System.out.print("출금액을 입력하세요: ");
amount = sc.nextInt();
balance = withdraw(balance, amount);
break;
case 3:
System.out.println("현재 잔액: " + balance + "원");
break;
case 4:
System.out.println("시스템을 종료합니다.");
return;
default:
System.out.println("잘못 입력했습니다.");
break;
}
}
}
public static int deposit(int balance, int amount) {
balance += amount;
System.out.println(amount + "원을 입금하였습니다. 현재 잔액: " + balance + "원");
return balance;
}
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;
}
}