메소드는 코드를 재사용할 수 있게 해준다. 직접 메소드를 만드는 것을 '메소드를 정의한다'라고 하고, 만든 메소드를 실행하는 것을 '호출한다'라고 말한다.
public class makeMethod {
public static void gugudan() {
for (int i = 2; i < 10; i++) {
System.out.println(i+"단 시작!");
for (int j = 1; j < 10; j++) {
System.out.println(i+" * "+j+" = "+ i*j);
}
}
System.out.println("---구구단 게임 종료!--");
}
public static void main(String[] args) {
System.out.println("---구구단 게임 시작!---");
gugudan();
}
}
위의 코드에서 public static void gugudan() { ... }
부분이 '메소드를 정의'한 것이고, main() {}의 gugudan();
부분이 바로 '메소드를 호출'한 것이다.
메소드는 왜 사용하는 것일까? 사실 메소드를 사용하지 않고 main(){}부분에 한 번에 선언해주어도 된다. 하지만 main(){}에 한 번에 선언하게되면 중복되는 코드가 발생할 수 있으며, 코드의 가독성이 떨어지고 유지보수가 어려워진다.
main메소드는 일종의 규칙이다. 구현하고 싶은 프로그램이 있다면 반드시 main()의 중괄호 안에 기대하는 로직을 위치시켜야 한다. 이는 약속이다.
public class notMakeMethod {
public static void main(String[] args) {
System.out.println("---2단 공부하기---");
for(int j = 1; j < 10; j++) {
System.out.println("2 * "+ j +" = "+2*j);
}
System.out.println("---2단 공부 완료!---\n");
System.out.println("---3단 공부하기---");
for(int j = 1; j < 10; j++) {
System.out.println("3 * "+ j +" = "+3*j);
}
System.out.println("---3단 공부 완료!---\n");
System.out.println("---4단 공부하기---");
for(int j = 1; j < 10; j++) {
System.out.println("4 * "+ j +" = "+4*j);
}
System.out.println("---4단 공부 완료!---\n");
System.out.println(".... \n");
System.out.println("---9단 공부하기---");
for(int j = 1; j < 10; j++) {
System.out.println("9 * "+ j +" = "+9*j);
}
System.out.println("---9단 공부 완료!---\n");
}
}
위의 코드를 살펴보면, 아래의 부분이 숫자만 바뀌고 계속 반복되는 것을 알 수 있다.
System.out.println("---2단 공부하기---");
for(int j = 1; j < 10; j++) {
System.out.println("2 * "+ j +" = "+2*j);
}
이렇게 main함수에 모든 코드를 작성하게 되면 코드가 모듈화되어있지 않아 가독성도 떨어지고, 중복되는 부분도 발생하게 된다. 위의 코드를 메소드를 이용하여 정리해보자.
public class notMakeMethod {
public static void howGugudan(int i) {
System.out.println("---" + i + "단 공부하기---");
for(int j = 1; j < 10; j++) {
System.out.println(i + " * "+ j +" = "+i*j);
}
System.out.println("---" + i + "단 공부 완료!---\n");
}
public static void main(String[] args) {
howGugudan(2);
howGugudan(3);
System.out.println(".... \n");
howGugudan(9);
}
}
굉장히 길었던 위의 코드가 메소드 활용을 통해 중복되는 부분이 제거되고, 보다 간결해진 것을 확인할 수 있다.
메소드의 입력은 매개변수(parameter)를 통해 이루어진다. 매개변수는 함수 호출 시 datatype에 맞는 적절한 값을 넣어주면 된다. 다음 예제를 참고해보자.
public class inoutMethod {
public static void repeatGo(int i) {
int num = i;
System.out.println("num의 초기값은 " + i +"입니다.");
for(num=1; num < 5; num++) {
System.out.println("현재 num의 값은 " + num +"입니다.");
}
}
public static void main(String[] args) {
repeatGo(0);
}
}
위의 예제에서는 repeatGo()함수 호출 시 괄호 안에 0
을 넣었으므로 num의 초기 값은 0
이 된다.
여러개의 입력값을 전달하고 싶다면 매개변수를 여러개 사용하면 된다. 위의 예제에서 매개변수를 이용하여 반복의 시작과 끝을 정해보자.
public class inoutMethod {
public static void repeatGo(int i,int j) {
int num;
System.out.println(i +"에서 시작해서, " + (j-1) +"까지 반복합니다.");
for(num=i; num < j; num++) {
System.out.println("현재 num의 값 : " + num);
}
}
public static void main(String[] args) {
repeatGo(0,6);
}
}
메소드 내에서 사용한 return은 return 뒤에 따라 오는 값을 메소드의 결과로 반환함과 동시에 메소드를 종료시킨다. 중요한 것은 메소드 선언 시 public static 반환형 함수명(매개변수)
형식으로 작성해야 한다는 것이다.
메소드가 반환할 값을 명시하게 되면, 메소드는 반드시 해당하는 데이터 형의 값을 반환한다는 것을 보장할 수 있다. 만약 반환 값이 없다면 public static void 함수명(매개변수)
의 형태로 작성하면 된다.
public class inoutMethod {
public static int repeatGo(int i,int j) {
int num;
int total = 0;
System.out.println(i +"에서 시작해서, " + (j-1) +"까지 합산합니다.");
for(num=i; num < j; num++) {
total += num;
}
return total;
}
public static void main(String[] args) {
System.out.println(repeatGo(0,6));
}
}