Python과 SQL만 써본 주니어 분석가. '개발공부를 해보고 싶다', '개발도 공부하긴 해야하는데...'는 말만 한지 어연 1년이 넘어가는 중, 이대로는 안되겠다 싶어 냅다 JAVA 수업 수강에 카드를 긁었다. 쪼렙 중의 쪼렙이 JAVA를 배워나가는 여정을 "JAVA 쪼렙 탈출기"라는 시리즈로 남길 예정이다.
메서드 (Method)
- Class 안에서 하나의 기능을 가진 작은 프로그램을 '메서드'라고 한다.
- 메서드의 구조
지금까지 숱하게 작성해왔던 main() 메서드를 가지고 메서드의 구조를 알아보자.
public | static | void | main | (String[] args) |
접근제한자 필수요소x |
지정예약어 필수요소x |
반환타입 필수요소o |
메서드명 필수요소o |
매개변수 필수요소x |
- 반환타입
- 메서드의 실행이 종료되면서 호출부로 돌아갈 때 가져가는 값의 자료형
- 기본자료형, 참조자료형, void (*void는 반환값이 없을 때 사용)
- 메서드명 : 메서드 호출(실행)시에 사용하는 이름
- 매개변수 : 호출부에서 넘어오는 값을 보관하는 변수 (필수요소x)
'메서드 호출'이란 메서드명을 사용해서 해당 메서드를 실행하는 것을 말한다.
메서드 정의부에 매개변수가 있으면 메서드 호출시에 (괄호) 안에 해당 타입에 맞는 인자값을 보내야 한다.
메서드를 호출하기 위해서는 해당 메서드가 존재해야 하는데, 이렇게 호출할 메서드에 실행 기능을 구현하는 것을 '메서드 정의'라고 한다.
public class MethodEx01 {
public static void main(String[] args) {
hi();
}
public static void hi() {
System.out.println("안녕하세요");
}
}
[결과값]
안녕하세요
hi 메서드를 하단에 정의했고 (꼭 main 메서드보다 상단에 정의할 필요 없다.) 매개변수를 별도로 정의하지 않았기 때문에 hi()를 호출할 때 인자값을 입력하지 않은 채 결과값이 출력된 것이다. 메서드를 정의할 때 매개변수를 지정했는데 호출할 때 매개변수를 입력하지 않거나, 반대로 메서드를 정의할 때 매개변수를 지정하지 않았는데 호출할 때 매개변수를 입력하면 코드가 실행되지 않는다.
return
메서드의 실행을 종료시키는 역할을 하면서, 호출부로 값을 반환할 때 사용된다.
단 하나의 값만 return시킬 수 있다. ( return a, b 는 불가능하다. )
반환타입이 void가 아닌 이상은 return은 필수적으로 있어야한다. 반환타입에 대한 return 코드가 등장하기 전까지 해당 메서드는 에러상태로 존재한다.
public class MethodEx01 {
public static void main(String[] args) {
returnPi();
}
public static double returnPi() {
return 3.141592;
}
}
위와 같이 코드를 작성했을 경우, 해당 코드를 돌려도 출력값은 나오지 않는다.
즉, return만 해서는 콘솔에 결과값이 출력되지 않는다.
public class MethodEx01 {
public static void main(String[] args) {
System.out.println("원주율 : " + returnPi()); // 방법 1
double pi = returnPi();
System.out.println("pi : " + pi); // 방법 2
}
public static double returnPi() {
return 3.141592;
}
}
방법 1과 같이 System.out.println( ) 을 사용하거나 방법 2와 같이 변수에 값을 지정해야 출력값이 나온다.
이와 비슷하게,
public class MethodEx01 {
public static void main(String[] args) {
// case 1
String stn = "시작";
sendReceive(stn);
System.out.println(stn);
// case 2
stn = sendReceive(stn);
System.out.println(stn);
}
public static String sendReceive(String stn) {
System.out.println("받은 문자열 : " + stn);
stn = "종료";
return stn;
}
}
위 코드에서도 case 1 의 System.out.println(stn) 을 했을 때 stn = "시작" 이라는 결과가 출력된다. 이는 반환값(return)이 변수에 지정되지 않아서(=저장공간이 없다) 그렇다. main 지역과 sendReceive 지역이 다르기 때문에 sendReceive 지역에서 stn값이 달라졌다고 해도 main 지역에서 공간(변수)에 저장하지 않는 이상 main 지역에서는 stn값이 달라지지 않는다. 지역이 다르면 변수명이 동일하더라도 각기 다른 변수인 것이다.
case 2에서처럼 변수에 return값을 지정하고 나서 System.out,println(stn) 을 하면 stn = "종료" 가 출력된다.
import java.util.Scanner;
public class MethodEx02 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String menu = "Java : j, Python : p >> ";
char subject = inputChar(scan, menu);
}
public static char inputChar(Scanner scanner, String message) {
System.out.print(message);
char value = scanner.next().charAt(0);
return value;
}
}
inputChar( ) 메서드의 매개변수를 작성할 때 매개변수에 scanner를 작성해주면 inputChar 지역에서 Scanner 객체를 새롭게 생성하지 않아도 main 지역에서 생성된 Scanner 객체를 빌려와서 사용할 수 있게 된다.
return 과 break
public static void checkSubject(char subject) {
switch(subject) {
case 'j':
System.out.println("Java를 선택하셨습니다.");
return;
case 'p':
System.out.println("Python을 선택하셨습니다.");
break;
}
System.out.println("- end -");
}
메서드를 정의할 때, switch문 안에 break 대신 return을 사용하는 것도 가능하다. ( case j 와 같이 ) 하지만 몇 가지 주의해야 할 사항이 있다. 먼저 void일 때는 반환타입이 없기 때문에 return 뒤에 값을 적는 것은 불가능하다. return; 만 쓰고 코드를 마무리해야 한다.
또한, return을 쓸 경우엔 return문 특성 상 작동하면 해당 위치에서 메서드의 실행을 멈추고 호출부로 돌아가게 된다. 따라서 break; 를 사용할 때는 switch문 하위의 코드도 작동이 되지만, return은 그렇지 않다. 위 코드에서는 case p가 실행될 때는 - end - 까지 출력되지만, case j가 실행될 때는 - end - 가 출력되지 않는다.
반환타입이 있을 때의 return
public static boolean checkSubject2(char subject) {
switch(subject) {
case 'j':
System.out.println("Java를 선택하셨습니다.");
return true;
case 'p':
System.out.println("Python을 선택하셨습니다.");
return true;
}
System.out.println("- end -");
}
위 코드는 실행해보면 에러가 뜨는 것을 알 수 있다. 그 이유는 반환타입에 있다. 위 코드는 boolean이라는 반환타입이 있는 메서드를 정의한 코드인데, 반환타입이 있는 경우에는 return 이 필수적이다. 하지만 위 코드에서는 case j도 case p도 아닐 경우에 return 이 존재하지 않는다.
public static boolean checkSubject2(char subject) {
switch(subject) {
case 'j':
System.out.println("Java를 선택하셨습니다.");
return true;
case 'p':
System.out.println("Python을 선택하셨습니다.");
return true;
}
System.out.println("- end -");
return false;
}
이렇게 case j와 case p도 아닐 경우에 return값도 정의해주어야 코드가 정상적으로 작동한다.
'개발공부' 카테고리의 다른 글
JAVA쪼렙탈출기: 접근제한자 (0) | 2023.06.16 |
---|---|
JAVA쪼렙탈출기: 클래스 (Class) (0) | 2023.06.03 |
JAVA쪼렙탈출기: 배열 (Array) (0) | 2023.05.21 |
JAVA쪼렙탈출기: Random Class (0) | 2023.05.21 |
JAVA쪼렙탈출기: 반복문 (0) | 2023.05.20 |