본문 바로가기

Java SE Tutorials/Methods

Java Methods

Java 프로그래밍, 메소드 ( Methods )


소프트웨어의 존재 목적은 정보처리 (Information Processing)이다. Java 언어로 소프트웨어를 작성한다는 것도 정보를 처리하기 위한 것이므로 개발자가 작성하는 코드에는 정보와 처리의 표현이 있을 수 밖에 없다.

정보가 코드 중에서 변수로 표현된다면 처리한다는 개념은 메소드로 표현된다고 할 수 있다. 변수 안에 저장된 데이터를 메소드가 처리(가공)하여 소프트웨어의 목적을 달성하는 것이다. 

메소드를 간단히 설명하자면, 코드 블럭에 이름을 붙이고 필요할 때마다 그 이름을 호출하여 블럭 안에 정의된 코드를 한번에 모두 실행하려는 것이다.


메소드의 선언 ( Defining Methods )


메소드 시그니처(Method Signature)

메소드 이름과 파라미터 리스트를 합쳐서 메소드 시그니처라고 하며 자바 언어에서 메소드를 선언할 때는 한 개의 클래스안에 메소드 시그니처가 중복되어 선언되면 안된다. 메소드 이름은 중복될 수 있지만 파라미터 리스트까지 중복되면 컴파일러 오류가 발생한다

위의 예에서 메소드 시그니처는 addition(int a, int b) 이다


메소드 이름 정하기

메소드는 코드블럭에 이름을 붙인 것이므로 코드블럭 전체를 대표할 수 있는 기능의 이름을 사용하는 것이 상식이다. 화면에 메시지를 출력하는 기능의 메소드가 있다면 printMessage 라는 이름을 사용하면 될 것이다. 

메소드 이름은 첫자를 소문자로하고 동사로 시작하는 것이 관례이고 뒤에 또 다른 단어가 결합되는 경우에는 첫자를 대문자로 하여 가독성을 고려하는 것이 관례이다. 다음은 코딩 관례에 따른 메소드 이름의 예이다

getValue, getTotalPrice, setTotalPrice, createInstance, getCurrentTime

drawImage, hidePanel


메소드의 선언 및 호출

public class Tutorials 
{
	public static void main(String[] args) 
	{
		// 메소드 호출
		printMessage();
	}
	
	// 메소드 선언
	static void printMessage()
	{
		System.out.println("이용자님 환영합니다");
	}
}


파라미터를 가진 메소드의 선언 및 호출

public class Tutorials 
{
	public static void main(String[] args) 
	{
		// 메소드 호출 및 아규먼트(Argument)전달
		printMessage("환영합니다");
	}
	
	// 파라미터를 가진 메소드 선언(호출부의 아규먼트가 파라미터에 할당됨)
	static void printMessage(String msg)// 파라미터의 선언
	{
		System.out.printf("이용자님 %s %n", msg);
	}
}


리턴타입을 가진 메소드의 선언 및 호출

public class Tutorials 
{
	public static void main(String[] args) 
	{
		// 값을 리턴하는 메소드 호출 및 아규먼트(Argument)전달
		// 값을 리턴하는 메소드를 호출하면 호출부는 하나의 표현식이고 표현식은 리턴 값으로 대치된다
		String retMsg = createMessage("환영합니다");
		System.out.println(retMsg);
	}
	
	// 리턴타입을 가진 메소드 선언(바디에 반드시 return [선언된 리턴타입의 데이터] 문장이 요구됨)
	static String createMessage(String msg)// 파라미터의 선언
	{
		return "이용자님 " + msg; // 메소드 호출측으로 리턴된다
	}
}


다수개의 파라미터를 가진 메소드의 선언

public class Tutorials 
{
	public static void main(String[] args) 
	{
		// 다수개의 파라미터를 가진 메소드 호출
		printPower(2,3);
	}
	
	// 다수개의 파라미터를 가진 메소드의 선언
	static void printPower(int a, int b)
	{
		int res = 1;
		for(int i=0;i<b;i++) {
			res *= a;
		}
		System.out.printf("%d^%d = %d %n", a, b, res);
	}
}


메소드의 리턴타입과 파라미터에 배열을 사용하는 예 ( Swap 알고리듬도 사용됨 )

public class Tutorials 
{
	public static void main(String[] args) 
	{
		// 배열을 아규먼트와 리턴타입에 선언한 메소드를 호출하는 예
		int[] resArr = invert(new int[]{1,2,3,4,5});
		System.out.println(Arrays.toString(resArr));
	}
	
	// 배열을 리턴타입과 파라미터에 사용한 메소드의 예
	static int[] invert(int[] srcArr)
	{
		int[] resArr = Arrays.copyOfRange(srcArr, 0, srcArr.length);
		int tmp = 0;
		for(int i=0,j=resArr.length-1;i<resArr.length/2;i++,j--){
			tmp = resArr[i];
			resArr[i] = resArr[j];
			resArr[j] = tmp;
		}
		return resArr;
	}
}


가변인자(Varargs)를 사용하는 메소드의 예

가변인자를 선언한 메소드 내부에서는 가변인자를 배열과 동일하게 사용하면 되며 가변인자에 전달하는 아규먼트는 배열이 아니라 임의의 갯수의 아규먼트를 전달하면 된다. 가변인자 메소드를 호출하는 측면에서는 배열을 사용하는 것보다 약간 간편해진다

public class Tutorials 
{
	public static void main(String[] args) 
	{
		// 가변인자에 임의의 갯수의 아규먼트를 전달하는 예
		int[] resArr = invert(1,2,3,4,5); // 임의의 갯수의 아규먼트를 사용함
		System.out.println(Arrays.toString(resArr));
	}
	
	// 가변인자(Variable Argument를 사용하는 메소드의 예
	static int[] invert(int... srcArr)
	{
		int[] resArr = Arrays.copyOfRange(srcArr, 0, srcArr.length);
		int tmp = 0;
		for(int i=0,j=resArr.length-1;i<resArr.length/2;i++,j--){
			tmp = resArr[i];
			resArr[i] = resArr[j];
			resArr[j] = tmp;
		}
		return resArr;
	}
}