add(a, b) = a + b
<Method1Ref.java>
package method;
public class Method1Ref {
public static void main(String[] args) {
int sum1 = add(5, 10);
System.out.println("결과1 출력:" + sum1);
int sum2 = add(15, 20);
System.out.println("결과2 출력:" + sum2);
}
//add 메서드
public static int add(int a, int b) {
System.out.println(a + "+" + b + " 연산 수행");
int sum = a + b;
return sum;
}
}
public static int add(int a, int b)
//1: 메서드 호출
int sum1 = add(5, 10);
//2: 파라미터 변수 a=5, b=10이 전달되면서 메서드가 수행된다.
public static int add(int a=5, int b=10) {
int sum = a + b;
return sum;
}
//3: 메서드가 수행된다.
public static int add(int a=5, int b=10) {
int sum = a(5) + b(10);
return sum;
}
//4: return을 사용해서 메서드 실행의 결과인 sum을 반환한다. sum에는 값 15가 들어있으므로 값 15가
반환된다.
public static int add(int a=5, int b=10) {
int sum = 15;
return sum(15);
}
//5: 메서드 호출 결과로 메서드에서 반환한 값 15가 나온다. 이 값을 sum1에 대입했다.
int sum1 = 15
메서드를 호출할 때는 다음과 같이 메서드에 넘기는 값과 매개변수(파라미터)의 타입이 맞아야 한다. 물론 넘기는 값과
매개변수(파라미터)의 순서와 갯수도 맞아야 한다.
호출: call("hello", 20)
메서드 정의: int call(String str, int age)
- 인수라는 용어는 '인’과 '수’의 합성어로, '들어가는 수’라는 의미를 가진다. 즉, 메서드 내부로 들어가는 값을 의미한다. 인자도 같은 의미이다.
- 매개변수, parameter는 '매개’와 '변수’의 합성어로, '중간에서 전달하는 변수’라는 의미를 가진다. 즉, 메서드 호출부와 메서드 내부 사이에서 값을 전달하는 역할을 하는 변수라는 뜻이다.
public static int add(int a, int b) {
//메서드 본문, 실행 코드
}
제어자 반환타입 메서드이름(매개변수 목록) {
메서드 본문
}
<Method2.java>
package method;
public class Method2 {
public static void main(String[] args) {
printHeader();
System.out.println("프로그램이 동작합니다.");
printFooter();
}
public static void printHeader() {
System.out.println("= 프로그램을 시작합니다 =");
return; //void의 경우 생략 가능
}
public static void printFooter() {
System.out.println("= 프로그램을 종료합니다 =");
}
}
=> String str = printHeader(); 반환 타입이 void 이기 때문에 이렇게 반환 값을 받으면 컴파일 오류가 발생한다.
void 와 return 생략
반환 타입 void 의 경우에는 예외로 printFooter() 와 같이 생략해도 된다. 자바가 반환 타입이 없는 경우에는 return 을 마지막줄에 넣어준다. 참고로 return 을 만나면 해당 메서드는 종료된다.
<MethodReturn1.java>
package method;
public class MethodReturn1 {
public static void main(String[] args) {
boolean result = odd(2);
System.out.println(result);
}
public static boolean odd(int i){
if(i%2==0){
return true;
}else {
return false;
}
}
}
return 문을 만나면 그 즉시 메서드를 빠져나간다.
<MethodReturn2.java>
package method;
public class MethodReturn2 {
public static void main(String[] args) {
checkAge(10);
checkAge(20);
}
public static void checkAge(int age) {
if (age < 18) {
System.out.println(age + "살, 미성년자는 출입이 불가능합니다.");
return;
}
System.out.println(age + "살, 입장하세요.");
}
}
<MethodValue1.java>
package method;
public class MethodValue1 {
public static void main(String[] args) {
int num1 =5;
System.out.println("1. changeNum 호출 전, num1 : "+num1);
changeNum(num1);
System.out.println("4. changeNum 호출 후, num1 : "+num1);
}
public static void changeNum(int num2){
System.out.println("2. changeNym 변경 전, num2 : "+num2);
num2 *= 2;
System.out.println("3. changeNym 변경 후, num2 : "+num2);
}
}
<MethodValue2.java>
package method;
public class MethodValue2 {
public static void main(String[] args) {
int num =5;
System.out.println("1. changeNum 호출 전, num1 : "+num);
changeNum(num);
System.out.println("4. changeNum 호출 후, num1 : "+num);
}
public static void changeNum(int num){
System.out.println("2. changeNym 변경 전, num2 : "+num);
num *= 2;
System.out.println("3. changeNym 변경 후, num2 : "+num);
}
}
main() 에 정의한 변수와 메서드의 매개변수(파라미터)의 이름이 둘다 number 로 같다.
하지만 main() 의 number 와 changeNumber() 의 number 는 서로 다른 변수이다.
메서드를 사용해서 값을 변경하기
<MethodValue3.java>
package method;
public class MethodValue3 {
public static void main(String[] args) {
int num =5;
System.out.println("1. changeNum 호출 전, num1 : "+num);
num = changeNum(num);
System.out.println("2. changeNum 호출 후, num1 : "+num);
}
public static int changeNum(int num){
num *= 2;
return num;
}
}
<MethodCasting1.java>
package method;
public class MethodCasting1 {
public static void main(String[] args) {
double number = 1.5;
//printNumber(number); // double을 int형에 대입하므로 컴파일 오류
printNumber((int) number); // 명시적 형변환을 사용해 double을 int로 변환
}
public static void printNumber(int n) {
System.out.println("숫자: " + n);
}
}
int < long < double
package method;
public class MethodCasting2 {
public static void main(String[] args) {
int number = 100;
printNumber(number); // int에서 double로 자동 형변환
}
public static void printNumber(double n) {
System.out.println("숫자: " + n);
}
}
add(int a, int b)
add(int a, int b, int c)
add(double a, double b)
=> 이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것을 메서드 오버로딩(Overloading)이라 한다.
메서드의 이름이 같아도 매개변수의 타입 및 순서가 다르면 오버로딩을 할 수 있다. 참고로 반환 타입은 인정하지 않는다.
<오버로딩 실패>
int add(int a, int b)
double add(int a, int b)
<OverLoading1.java>
package method;
public class OverLoading1 {
public static void main(String[] args) {
System.out.println("1: " + add(1, 2));
System.out.println("2: " + add(1, 2, 3));
}
// 첫 번째 add 메서드: 두 정수를 받아서 합을 반환한다.
public static int add(int a, int b) {
System.out.println("1번 호출");
return a + b;
}
// 두 번째 add 메서드: 세 정수를 받아서 합을 반환한다.
// 첫 번째 메서드와 이름은 같지만, 매개변수 목록이 다르다.
public static int add(int a, int b, int c) {
System.out.println("2번 호출");
return a + b + c;
}
}
<OverLoading2.java>
package method;
public class OverLoading2 {
public static void main(String[] args) {
myMethod(1, 1.2);
myMethod(1.2, 2);
}
public static void myMethod(int a, double b) {
System.out.println("int a, double b");
}
public static void myMethod(double a, int b) {
System.out.println("double a, int b");
}
}
<OverLoading3.java>
package method;
public class OverLoading3 {
public static void main(String[] args) {
System.out.println("1: " + add(1, 2));
System.out.println("2: " + add(1.2, 1.5));
}
// 첫 번째 add 메서드: 두 정수를 받아서 합을 반환한다.
public static int add(int a, int b) {
System.out.println("1번 호출");
return a + b;
}
// 두 번째 add 메서드: 두 실수를 받아서 합을 반환한다.
// 첫 번째 메서드와 이름은 같지만, 매개변수의 유형이 다르다.
public static double add(double a, double b) {
System.out.println("2번 호출");
return a + b;
}
//첫번째 add 메서드를 지운다 해도 실행이된다.
// int 거 double 로 자동 형변환이 이루어지기 때문에!
}
<MethodEx1.java>
package method.ex;
public class MethodEx1 {
public static void main(String[] args) {
double average = avg(1,2,3);
System.out.println("평균값: " + average);
System.out.println("평균값: " + avg(15,25,35));
}
public static double avg(int a, int b, int c){
int sum = a+b+c;
double average = sum / 3.0;
return average;
}
}
<MethodEx2.java>
package method.ex;
public class MethodEx2 {
public static void main(String[] args) {
comment(3);
System.out.println("----");
comment(5);
System.out.println("----");
comment(7);
}
public static void comment(int num){
String message = "Hello, world!";
for(int i =0; i<num; i++){
System.out.println(message);
}
}
//
// public static void printMessage(String message, int times) {
// for (int i = 0; i < times; i++) {
// System.out.println(message);
// }
// }
}
<MethodEx3.java>
package method.ex;
public class MethodEx3 {
public static void main(String[] args) {
int balance = 10000;
balance = deposit(balance, 1000);
balance = withdraw(balance,2000);
System.out.println("최종 잔액: " + balance + "원");
}
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;
}
}
<MethodEx4.java>
package method.ex;
import java.util.Scanner;
public class MethodEx4 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int balance = 0;
while(true){
System.out.print("선택 : ");
int option = input.nextInt();
// if(option==1){
// System.out.print("입금액 : ");
// int depositamount = input.nextInt();
// balance = deposit(balance,depositamount);
// } else if (option ==2) {
// System.out.print("출금액 : ");
// int withdrawAmount = input.nextInt();
// balance = withdraw(balance,withdrawAmount);
// } else if (option ==3) {
// System.out.println("현재 잔액 : " +balance);
// } else if (option==4) {
// System.out.println("시스템을 종료합니다.");
// break;
// }
int amount;
switch (option){
case 1 :
System.out.print("입금액 : ");
amount = input.nextInt();
balance = deposit(balance,amount);
break;
case 2 :
System.out.print("입금액 : ");
amount = input.nextInt();
balance = withdraw(balance,amount);
break;
case 3:
System.out.println("현재 잔액: " + balance + "원");
break;
case 4:
System.out.println("시스템을 종료합니다.");
return;
default:
System.out.println("올바른 선택이 아닙니다. 다시 선택해주세요.");
}
}
}
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;
}
}
- 코드 재사용 : 메서드는 특정 기능을 캡슐화하므로 필요할 때 마다 사용가능
- 코드 가독성
- 모듈성 : 큰 프로젝트, 관리 가능한 부분으로 나눌 수 있다. 이는 코드의 가독성향상 및 디버깅을 쉽게 만든다.
- 코드유지관리
- 코드 재사용성과 확장성
- 추상화 : 프로그램의 다른 부분에서는 복잡한 내부작업에 대해 알 필요가 없다.
- 테스트와 디버깅 용이성 : 개별 메서드는 독립적으로 테스트하고 디버그 할 수 있다. 이는 신속하게 찾고 수정하는데 도움이 된다.