1. 메서드의 정의 & 용법

 현재까지 자바를 공부하면서 다른 언어들과는 다른 규칙들이 있는 것을 알 수 있었습니다. 모든 코드는 클래스라는 파일 안에 작성되고 실질적으로 이루어지는 내용은 main함수 안에 작성해야 이뤄지는 것을 알 수 있었습니다. 메서드란 쉽게 말해서 C언어에서 함수라고 불리는 부분을 메서드라고 부를 수 있습니다. 하지만 C언어에서와 마찬가지로 한 메서드 안에 많은 양의 코드를 작성하는 것은 비효율적이고 복잡하기 때문에 이를 단순화하기 main메서드 외의 다른 메서드를 만들어 사용합니다. 우선 메서드의 형태를 알아보도록 하겠습니다.

 

 - 접근_제한자 [ 지정 예약어 ] 반환형 메서드명( 매개_변수 ) [ throws 예외_클래스들 ]

   {

     내용;

   }

 

 위의 메서드 형식을 자세하게 알 필요는 없습니다. 물론 다양한 요소들이 바뀔 수 있지만 이는 추후에 여러 예제를 보고 더 공부하게 되면 자연스레 알게 되는 것이므로 아래의 형식만을 살펴보도록 하겠습니다.

 

 - public static 반환형 메서드명 ( 매개_변수들 ) [ throws 예외_클래스들 ] 

   { 

     내용;

   }

 

 앞서 보았던 형식과는 크게 다른 것은 없지만 접근 제한자를 public 으로 사용하고 지정 예약어를 static으로 고정한다는 것이 약간 다릅니다. 여기서 알고 넘어가야 할 것은 static 메서드는 static 메서드에서만 사용이 가능하다는 것입니다. 이는 main메서드는 static으로 선언되어 있으므로 main메서드에서 다른 메서드를 호출하여 사용하려면 어쩔 수 없이 static으로 선언되어야 합니다.

 

 1] 반환형

  반환형이란 메서드가 내용을 실행하고 되돌려주는 값을 의미합니다. 때문에 main메서드나 다른 메서드에서 해당 메서드를 호출했다면 내용을 실행하고 다시 자신을 호출했던 메서드에게 결과값을 돌려주어야 합니다. 이때 반환형에는 void를 포함한 여러 자료형이 올 수 있지만 void를 사용했다면 아무것도 돌려주지 않아도 된다는 의미이고, 자료형으로 선언했다면 결과값을 각 자료형에 맞게 반환해주면 됩니다.

 

 2] 메서드명

  메서드명이라는 것은 일련의 이름이기 때문에 main메서드를 제외한 메서드의 이름은 사용자가 임의로 지정할 수 있습니다. 

 

 3] 매개 변수

  매개 변수라는 것은 메서드가 실행될 때 안의 내용을 수행하기 위해 필요로 하는 값을 호출과 동시에 넘겨주는 것입니다. 이는 사용자가 메서드를 어떻게 작성하느냐에 따라 필요할 수도, 필요하지 않을 수도 있습니다.

 

 4] 에외 클래스

  앞서 입력과 출력을 처리할 때에는 '예외처리'라는 것을 해주어야 한다는 것을 배웠습니다. 이는 main메서드에서만 해당되는 것이 아니기 때문에 다른 메서드에서도 필요시 입력해주어야 합니다.

 

 이제 예제를 통해 실질적으로 어떻게 사용되는지에 대해 알아보도록 하겠습니다.

public class Round07_Ex01 {

	public static void x() {
		for(int i=0; i<5; i++) 
			System.out.print("*");
		return;   // 반환형이 void인 경우에는 생략 가능
	}
	
	public static void main(String[] args) {
		
		x();
		System.out.println("\nHello");
		x();
		System.out.println("\nJava");
		x();
		System.out.println("\n!");
		x();
		return;   // main메소드에도 원래는 이 구문이 있어야 하지만 자동 생략
	
	}

}

 위의 코드의 결과를 살펴보면 아래와 같습니다.

 위처럼 메서드를 사용했을 때의 결과를 알 수 있습니다. 만약 이러한 결과가 나오기 위한 코드를 작성할 때 메서드를 사용하지 않고 main메서드 안에서만 해결하려 했다면 for문을 각 문장사이마다 출력해야 하는 번거로움이 있었을 것입니다. 이렇게 메서드를 사용하는 것을 수학에서의 치환과정과 같다고 볼 수 있습니다.

 

 위의 코드를 보면 메서드 x()와 main()의 반환형은 void인 것을 알 수 있는데 이때는 return;을 써주지 않아도 정상적으로 작동하는 것을 확인할 수 있습니다.

 

2. 메서드의 종류

 메서드는 어떤 방식으로 호출되느냐에 따라 크게 3가지로 나눌 수 있습니다. 앞서 봤던 코드처럼 단순한 이름을 호출함으로써 실행되는 'Call By Name', 이름에 매개변수가 추가되어 데이터를 처리하는 'Call By Value', 객체의 주소를 이용해 내용 데이터를 변화시키는 'Call By Reference'가 있습니다. 'Call By Reference'는 알아야 할 요소가 많으므로 추후에 배우도록 하겠습니다.

 

 'Call By Name'은 이름을 통해 메서드를 호출하는 방식으로, public static void aaa() 와 같이 매개 변수 없이 이름만으로 호출이 가능한 메서드가 'Call By Name'에 해당됩니다.

 

 'Call By Value'는 메서드의 매개 변수를 이용하는 방식으로 각 매개 변수는 개수, 자료형에 대한 제한이 없고 클래스형이 사용되어도 무관합니다.

 

3. 반환형

 반환형이라는 것은 해당 메서드가 실행이 완료된 후 반환하는 값을 말합니다. 대표적인 예로 2개의 수를 입력받아 더 큰 수를 반환하는 메서드가 있습니다. 이렇게 결과값의 반환이 필요한 메서드에서는 return이라는 에약어를 통해 결과값을 리턴합니다.

 

 이제 이러한 모든 것들을 섞어놓은 예제를 보도록 하겠습니다.

import java.io.IOException;
import java.util.Scanner;

public class Round07_Ex02 {
	
	public static int aaa() throws IOException {  // 둘 중 큰 수를 출력하는 함수
		
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 수 : ");
		int a = sc.nextInt();
		System.out.print("두번째 수 : ");
		int b = sc.nextInt();
		
		if(a>b) 
			return a;
		return b;

	}
	
	public static void bbb() throws IOException {  // 두 수 사이의 합을 구하는 함수
		
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 수 : ");
		int a = sc.nextInt();
		System.out.print("두번째 수 : ");
		int b = sc.nextInt();
		
		int tot = 0;
		if(a>b) {
			int tmp = a;
			a = b;
			b = tmp;
		}
		
		for(int i=a; i<=b; i++) 
			tot+=i;
		
		System.out.println(a+" - "+b+"사이의 합 : "+tot);
		
	}
	
	public static String ccc(int x, int y, int z) {  // 세 수를 내림차순으로 정렬하는 함수
		if(y>=x&&y>=z) {
			int tmp = x;
			x = y;
			y = tmp;
		} else if(z>=x&&z>=y) {
			int tmp = x;
			x = z;
			z = tmp;
		}
		
		if(z>=y) {
			int tmp = y;
			y = z;
			z = tmp;
		}
		
		String abc = x+">="+y+">="+z;
		return abc;
	}

	public static void main(String[] args) throws IOException {  // 메인 함수
		
		Scanner sc = new Scanner(System.in);
		int x = 0;
		
		while(true) {
			System.out.print("1.최대수  2.사이합  3.수나열  4.종료 : ");
			x = sc.nextInt();
			if(x == 1) {
				int k = aaa();  // 1이 입력되면 aaa함수 호출
				System.out.println("둘 중 최대수는 "+k+"입니다");
			} else if(x == 2)
				bbb();  // 2가 입력되면 bbb함수 호출
			else if(x == 3) {
				System.out.print("첫번째 수 : ");
				int first = sc.nextInt();
				System.out.print("두번째 수 : ");
				int second = sc.nextInt();
				System.out.print("세번째 수 : ");
				int third = sc.nextInt();
				String str = ccc(first, second, third);  // 3이 입력되면 세 수를 입력받고 ccc함수를 호출하면서 매개변수로 전달
				System.out.println("내림차순은 : "+str);
			} else if(x == 4)
				break;  // 4가 입력되면 탈출
			else
				System.out.println("잘못 입력하셨습니다");
			
			System.out.println();
		}
		
	}

}

 위의 코드는 1~4부터 까지의 숫자 중 하나를 입력받아 각 숫자에 맞는 메서드를 실행하는 프로그램입니다. aaa는 더 큰 수를 출력하는 메서드이고, bbb는 두 수 사이의 합을, ccc는 세 수를 내림차순으로 정렬하는 메서드입니다. 이러한 메서드를 통해 코드를 더 효율적이고 간단하게 생성할 수 있습니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 배열  (0) 2019.04.25
자바 메서드 - 문제  (0) 2019.04.22
자바 제어문 - 문제  (0) 2019.04.19
제어문 - 2 ( for, while, do-while )  (0) 2019.04.17
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17

+ Recent posts