메서드 (method) — 형태에 따른 정의 & 호출
▶▶ 메서드(method)
– 동작(작업)의 최소 단위, 작업을 수행하는 코드들의 모음.
ex ) '밥먹다'의 기능을 메서드로 표현 (밥을 떠서 입에 넣고 씹기 등)
– 메서드는 반드시 호출되어야만 실행할 수 있음.
→ 호출하는 메서드 = caller / 호출 당하는 메서드 = worker
– 메서드 호출 시 메서드에 전달하는 값 전달인자(Argument=args)라고 하며,
이 전달 인자를 전달받아 저장하는 변수를 매개변수(Parameter)라고 함.
– 메서드가 호출되면 작업을 수행한 후에 반드시 호출한 위치로 돌아감.
→ 이 때, 호출한 곳으로 전달하는 값을 리턴값(Return Value)이라 함.
– 리턴타입을 명시한 메서드는 반드시 return문을 사용하여 데이터를 리턴해야 함.
→ 단, 리턴타입이 void인 메서드는 return문을 생략해도 되고, 리턴값 없이 return문만 기술할 수 있음.
→ 메서드 내에서 return문을 만나면 즉시 메서드를 종료하고 돌아감.
→ if문 등의 조건식을 사용하여 return문을 실행할 경우,
반드시 어떤 경우에도 return문이 실행되도록 조건식을 작성해야 함.
– main() 메서드는 자바에서 유일하게 호출하지 않아도 프로그램 실행 시점에서 자동으로 호출되는 메서드.
→ main() 메서드를 자바 프로그램의 시작점(Starting Point)이라고 함.
– 메서드 호출 시 매개변수와 일치하는 타입 및 갯수의 데이터 전달 필수, 메서드 호출 형태로 정의 형태가 일치해야 함.
▶ 메서드 정의 문법
[접근 제한자] 리턴타입 메서드명 ( [매개변수선언...] ) {
메서드 호출 시 수행할 코드들;
[return [리턴값];]
}
– [ ] 대괄호(브라켓)안에 들어가는건 있어도 되고 없어도 되는 것. (생략 가능)
▶ 메서드 호출 문법
– 리턴값이 있는지 없는지에 따라 문법이 달라짐.
– 메서드를 호출할 때는 리턴값이 있는지 없는지 체크하기.
1. 리턴값이 없는 경우
메서드명( );
– 파라미터가 있다면 괄호 안에 적어주면 됨.
2. 리턴값이 있는 경우
1 ) 리턴되는 데이터를 변수에 저장할 경우
데이터타입 변수명 = 메서드명( );
2 ) 리턴되는 데이터를 출력하거나 직접 연산에 사용하는 경우
System.out.println( 메서드명( ) );
▶ 메서드 형태 — 5가지
1. 파라미터도 없고, 리턴값도 없는 메서드
2. 파라미터는 없고, 리턴값만 있는 메서드
3. 파라미터만 있고, 리턴값은 없는 메서드
4. 파라미터도 있고, 리턴값도 있는 메서드
5. 파라미터가 2개 이상인 메서드
▸ 메서드 형태에 따른 (worker 메서드) 호출 방법
– main 메서드 밖에 메서드를 정의하고, 호출할 때는 main 메서드 안에서 함.
1. 파라미터도 없고, 리턴값도 없는 메서드
– 파라미터(인자값(argument)을 받는 변수)도 없고, 리턴값(돌려받을 값)도 없는 메서드
– 메서드 파라미터가 없으므로 선언부 소괄호() 안에 아무것도 명시하지 않음.
– 리턴값이 없으므로 리턴타입 부분에 특수한 데이터타입인 void 타입을 명시.
(void = 리턴값이 없다는 의미)
EX1 )
— sister_1 메서드 정의
public static void sister_1() {
System.out.println("동생 : 오빠가 불 끄라고 해서 불을 껐다!");
}
→ 메서드가 종료되면 메서드를 호출한 곳으로 흐름이 이동 (되돌아감)
→ 블럭부분까지 실행을 다 하고 나서 다시 위의 sister_1()로 돌아감.
— sister_1 메서드 호출
System.out.println("동생아 불 좀 끄고 가라!");
sister_1(); // 메서드 호출
System.out.println("동생이 불을 끄고 갔다.");
// System.out.println(sister_1());
→ 매개변수 파라미터가 없으므로 소괄호에 전달할 데이터도 없음.
→ 주의! 리턴값이 없는 메서드는 출력문에서 호출하거나 변수에 대입 불가능! 주석처리함.
✓ 실행 결과
동생아 불 좀 끄고 가라!
동생 : 오빠가 불 끄라고 해서 불을 껐다!
동생이 불을 끄고 갔다.
2. 파라미터는 없고, 리턴값만 있는 메서드
– 메서드 파라미터가 없으므로 선언부 소괄호()안에 아무것도 명시하지 않음.
– 리턴값이 있으므로 리턴할 데이터와 일치하는 데이터타입을 리턴타입 부분에 명시
EX2 )
— sister_2 메서드 정의
public static String sister_2() {
System.out.println("동생 : 오빠가 물을 떠오라고 시켜서 물을 떠다줬다");
// return "물"; // 1) 리터럴을 직접 리턴하는 방법
String item = "물"; // 2) 변수에 저장하여 리턴하는 방법
return item;
}
→ return type이 String이므로 블록안에 return이 있어야 하며, 이는 String type이여야 함!
→ return값은 리터럴을 직접 리턴하는 방법이 있고, 리턴값을 변수에 저장한 후 변수를 직접 리턴하는 방법이 있음.
— sister_2 메서드 호출
System.out.println("동생아! 물 좀 떠와라!");
String result = sister_2();
System.out.println("동생이 가져다 준 것 : " + result); // 방법1 ) 변수에 저장 후 출력
// System.out.println("동생이 가져다 준 것 : " + sister_2()); // 방법2 ) 리턴값 직접 사용
→ 메서드가 실행되며 리턴값('물')을 가져왔는데 리턴값을 어떻게 하란 말이 없음. 그럼 걍 버림.
→ 리턴값이 있는 메서드 호출 후, 변수에 저장하거나 출력문에 사용 가능.
방법1 ) sister_2() 메서드 호출 후, 리턴값('물')을 전달 받아 String타입 변수result에 저장 후 출력함.
방법2 ) 리턴값을 변수에 저장하지 않고 메서드 호출과 동시에 리턴값을 바로 출력함.
✓ 실행 결과
동생아! 물 좀 떠와라!
동생 : 오빠가 물을 떠오라고 시켜서 물을 떠다줬다
동생이 가져다 준 것 : 물
Q1 ) 구구단 2단~9단까지 출력하는 gugudan() 메서드를 정의하고 호출하시오.
A1 )
public static void gugudan() {
for(int i=2; i<10; i++) {
System.out.printf(" < %d단 > \n", i);
for(int j=1; j<10; j++) {
System.out.printf("%d * %d = %d \n", i, j, i*j);
}
System.out.println();
}
}
gugudan();
→ 파라미터가 없으므로 메서드 선언부 소괄호()안에 아무것도 명시하지 않음.
→ 리턴값이 없으므로 리턴타입에 void타입 명시.
✓ 실행 결과
< 2단 >
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
< 3단 >
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
< 4단 >
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
4 * 6 = 24
4 * 7 = 28
4 * 8 = 32
4 * 9 = 36
< 5단 >
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
< 6단 >
6 * 1 = 6
6 * 2 = 12
6 * 3 = 18
6 * 4 = 24
6 * 5 = 30
6 * 6 = 36
6 * 7 = 42
6 * 8 = 48
6 * 9 = 54
< 7단 >
7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63
< 8단 >
8 * 1 = 8
8 * 2 = 16
8 * 3 = 24
8 * 4 = 32
8 * 5 = 40
8 * 6 = 48
8 * 7 = 56
8 * 8 = 64
8 * 9 = 72
< 9단 >
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
Q2 ) 1~10까지 정수의 합(55)을 계산하여 리턴하는 sum()메서드를 정의하고 호출하시오.
A2 )
public static int sum() {
int total = 0;
for(int i=1; i<=10; i++) {
total += i;
}
return total;
}
int total = sum();
System.out.println("1~10까지 정수의 합 = "+ total);
→ 리턴값이 있으므로 리턴할 데이터와 일치하는 'int' 리턴타입 부분에 명시함.
→ 메서드 호출과 동시에 리턴값을 변수 total에 저장하고 출력문을 통해 출력함.
✓ 실행 결과
1~10까지 정수의 합 = 55
Q3 ) 오늘의 날씨 getWeather() 호출했을 때 '흐림'이 출력되도록 작성하시오.
A3 )
public static String getWeather() {
// 방법1
// return "흐림";
// 방법2
String today = "흐림";
return today;
}
// 방법1
// System.out.println("오늘의 날씨 : " + getWeather());
// 방법2
String todayWeather = getWeather();
System.out.println("오늘의 날씨 : " + todayWeather);
→ 리턴타입이 String이므로 방법1처럼 직접 문자열을 리턴하거나, 방법2처럼 변수에 저장하여 변수를 리턴해줌.
→ 함수 호출 시 방법1처럼 호출과 동시에 리턴값을 바로 출력하거나, 방법2처럼 변수에 리턴값을 저장한 뒤 출력 가능.
✓ 실행 결과
오늘의 날씨 : 흐림
3. 파라미터만 있고, 리턴값은 없는 메서드
– 파라미터가 있으므로 메서드 선언부 소괄호( )안에 외부로부터 호출 시 전달 받는 데이터를 저장할 변수(매개변수) 선언.
– 리턴값은 없으므로 리턴타입 부분을 void로 지정.
EX3 )
— sister_3 메서드 정의
public static void sister_3(int money) {
System.out.println("동생 : 오빠가 준 돈 = " + money + "원");
money -= 500;
if(money > 0) {
return; // return문을 만나면 해당 메서드를 바로 빠져 나감.
}
System.out.println("동생 : 새우깡 사먹고 "+money+"원이 남았다.");
}
→ 파라미터로 선언된 int형 변수 money에 메서드 호출 시 전달된 값이 저장됨.
ex ) sister_3(3000) 호출 시 int money = 3000과 동일한 코드로 취급.
→ 현재 메서드 내에서 money변수를 자유롭게 사용 가능하지만 메서드를 벗어나면(블럭) 존재하지 않는 변수로 취급됨.
→ 돈의 개념은 보통 양수이기 때문에 if문으로 구분해줌.
→ 현재 수행중인 메서드를 종료하고 빠져나가기 위해서는 특정 조건일 때 return문이 실행되도록 해야 함.
→ 리턴타입이 int형이면 그냥 return 0;이라고 써서 타입만 맞춰줘도 됨.
어차피 내가 위에서 안쓰면 버려지는 값이므로 숫자는 중요한게 아님.
— sister_3 메서드 호출
System.out.println("동생아! 돈 줄테니 과자를 사먹어라!");
//sister_3(3000);
// 방법1) 메서드 파라미터에 리터럴 값을 직접 전달하기
int myMoney = 3000;
sister_3(myMoney);
// 방법2) 변수를 사용하여 값을 지정한 뒤 파라미터에 전달하기
→ 메서드 호출 시, 전달할 데이터는 메서드명 뒤의 소괄호 내에 기술함.
→ if문의 조건식이 참이 되어 return문을 만나 메서드를 빠져나왔기에 맨 밑의 출력문은 출력 되지 않음.
✓ 실행 결과
동생아! 돈 줄테니 과자를 사먹어라!
동생 : 오빠가 준 돈 = 3000원
4. 파라미터도 있고, 리턴값도 있는 메서드
– 2번 유형과 3번 유형이 합쳐진 형태.
EX4 )
— sister_4 메서드 정의
public static String sister_4(int money) {
System.out.println("동생 : 오빠가 준 돈 = " + money + "원");
money -= 500;
System.out.println("동생 : 새우깡 사고 " + money + "원이 남았다.");
return "새우깡"; // 문자열 "새우깡"을 리턴
}
→ return값에는 변수 또는 리터럴 값 하나만 쓸 수 있음.
— sister_4 메서드 호출
System.out.println("동생아! 3000원 줄 테니, 내 과자도 사줘라~");
String snack = sister_4(3000);
System.out.println("동생이 사다준 것 : " + snack);
→ 메서드 호출함과 동시에 리턴값을 변수 snack에 저장함.
✓ 실행 결과
동생아! 3000원 줄 테니, 내 과자도 사줘라~
동생 : 오빠가 준 돈 = 3000원
동생 : 새우깡 사고 2500원이 남았다.
동생이 사다준 것 : 새우깡
Q4 ) 정수를 1개 전달하면 해당 정수에 대해 홀수인지 짝수인지 판별하여 출력하는
checkNumber() 메서드를 호출하시오.
A4 )
public static void checkNumber(int num) {
if(num%2==1) {
System.out.println(num + " : 홀수");
}else {
System.out.println(num + " : 짝수");
}
}
checkNumber(7);
→ 값을 전달해야하므로 파라미터는 있고 따로 리턴해서 쓸 값이 없으므로 리턴값은 없는 메서드임.
✓ 실행 결과
7 : 홀수
Q5 ) 정수 1개를 전달하면, 해당 정수에 대해 홀수인지 짝수인지 판별하고,
판별 결과 문자열을 리턴하는 checkNumber2() 메서드를 호출하시오.
A5 )
public static String checkNumber2(int num) {
if(num%2==1) {
return "홀수";
}else if(num%2==0) {
return "짝수";
}
return ""; // null스트링 값도 줄 수 있음
}
String result = checkNumber2(2);
System.out.println("판별 결과 : " + result);
→ null스트링 값을 줘도 빠져나올수 있음
→ if문과 else if문 내에서 직접 리턴하지 않고 리턴 데이터를 별도의 변수에 저장한 뒤, if문 종료 후 return 수행.
✓ 실행 결과
판별 결과 : 짝수
5. 파라미터가 2개 이상인 메서드
– 전달되는 데이터가 int, String 형태이므로, 파라미터 선언 순서도 int, String 순서로 선언해야 함.
EX5 )
— sister_5 메서드 정의
public static String sister_5(int money, String snack) {
System.out.println("오빠가 준 돈 : " + money + "원");
System.out.println("오빠가 준 과자 : " + snack);
System.out.println(snack + "을 쿠쿠다스로 교환했다!");
snack = "쿠쿠다스";
return snack;
}
— sister_5 메서드 호출
System.out.println("동생아! 새우깡이랑 1000원을 줄 테니 쿠쿠다스로 바꿔와라!");
//sister_5(1000, "새우깡"); // 방법1 ) 직접 값을 넣어 호출
int myMoney = 1000;
String snack = "새우깡";
//sister_5(myMoney, snack); // 방법2 ) 변수를 따로 만들어서 호출
String mySnack = sister_5(1000, "새우깡"); // 방법3 ) 호출과 동시에 리턴값 변수에 저장
System.out.println("동생이 바꾸다 준 것 : " + mySnack);
✓ 실행 결과
동생아! 새우깡이랑 1000원을 줄 테니 쿠쿠다스로 바꿔와라!
오빠가 준 돈 : 1000원
오빠가 준 과자 : 새우깡
새우깡을 쿠쿠다스로 교환했다!
동생이 바꾸다 준 것 : 쿠쿠다스
Q6 ) 정수 2개를 전달하면 두 정수의 합을 리턴하는 메서드 'sum'을 호출하고, 리턴값을 출력하시오.
ex ) 10, 20 전달 시 10+20 결과인 '30' 을 리턴함
A6 )
public static int sum(int num1, int num2) {
int sum = num1 + num2;
return sum;
// 메서드명이랑 변수명이랑 똑같아도 상관없음
}
int sum = sum(10, 20);
System.out.println("두 수를 더 한 값은 : " + sum);
✓ 실행 결과
두 수를 더 한 값은 : 30
Q7 ) 연산자 역할인 문자 1개와 정수 2개를 전달하면,
두 정수에 대한 어떤 연산을 수행한 후 결과값을 리턴하는 메서드(operation)를 호출하고
리턴되는 값을 출력하시오.
ex ) '+', 10, 20 전달 시 10 + 20 결과인 30 리턴 / '-', 10, 20 전달 시 10 - 20 결과인 -10 리턴
A7 )
— operation 메서드 정의
방법1)
public static int operation(char op, int num1, int num2) {
if(op == '+') {
return num1 + num2;
}else if(op == '-') {
return num1 - num2;
}else {
System.out.println("사용 가능한 연산자를 사용해주세요.");
return 0;
}
}
→ 연산자를 문자데이터(char)로 취급하고 조건식을 걸어 연산자로 사용함.
→ 다른 연산기호를 사용했을 땐 연산이 불가능하므로 리턴타입에 알맞게 그냥 '0'을 리턴함.
어차피 내가 리턴값을 사용하지 않으면 버려지는 값이므로 형식만 맞춤.
방법2) return문 하나만 사용
public static int operation(char op, int num1, int num2) {
int result = 0;
if(op == '+') {
result = num1 + num2;
}else if(op == '-') {
result = num1 - num2;
}else {
System.out.println("사용 가능한 연산자를 사용해주세요.");
result = 0;
}
return result;
}
→ result 변수를 생성, 조건식을 거쳐 나온 연산의 값을 변수에 저장하고, 조건식 마무리 후 변수에 저장된 값을 리턴함.
— operation 메서드 호출
int result = operation('*', 10, 20);
if(result != 0) {
System.out.println("연산의 결과는 : " + result);
}else {
System.out.println("연산이 불가능 합니다.");
}
→ 정의하지 않은 연산을 쓸 경우 return값으로 0을 돌려주게 설정했는데
사실상 연산의 결과가 0이진 않으므로, 디테일하게 설정하고 싶다면 if-else문을 사용하여 이렇게 나타낼 수 있음.