[Java/자바] 메서드(Method)란 ?

메서드 ( Method )

메서드란 특정 작업을 수행하는 문장들을 하나로 묶은 것으로 수학의 함수와 비슷합니다.

대표적으로 절댓값을 구하는 메서드 Math.abs(-3)을 실행하면 3의 결과를 반환합니다.

 

메서드를 사용하는 이유

 

1. 높은 재사용성 ( reusability )

이미 자바 API에서 제공하는 메서드들을 사용하면서 코딩의 편리함을 느끼실 겁니다.

이렇게 메서드를 한번 만들어 놓으면 몇 번이고 호출할 수 있으며, 다른 프로그램에서도 사용이 가능합니다.

 

2. 중복된 코드의 제거

프로그램을 작성하다 보면, 같은 내용의 문장들이 중복되곤 합니다.

이렇게 반복되는 문장들을 묶어 하나의 메서드로 작성해 놓으면, 중복을 제거하고 메서드를 호출함으로써 대체할 수 있습니다.

public static void main(String args[]) {
 ...
	for (int i = 0; i<10; i++) 
    	numArr[i] = (int) (Math.random()*10);
        
    for (int i = 0; i<10; i++) 
    	System.out.printf("%d", numArr[i]);
        System.out println();
        
        ....
        
    for (int i = 0; i<10; i++) 
    	System.out.printf("%d", numArr[i]);
        System.out println();

}

 

위 코드를 보면 아래와 사진과 같이 같은 내용의 for 구문이 반복됩니다.

만약 이 부분의 수정이 필요하다면 두 곳을 모두 수정해야 합니다.

 

이와 같은 중복을 메서드를 사용하면 아래와 같이 중복된 코드를 제거할 수 있으며 소스코드도 짧아지게 됩니다.

만약 수정이 필요하다면 메서드만 수정하면 되기 때문에 관리가 쉽다는 장점이 있습니다.

static void printArr(int[] numArr) {
    for (int i = 0; i<10; i++) 
    	System.out.printf("%d", numArr[i]);
        System.out println();
}

public static void main(String args[]) {
 ...
	for (int i = 0; i<10; i++) 
    	numArr[i] = (int) (Math.random()*10);

    printArr(numArr); // printArr 함수 호출. 
        ....
    printArr(numArr); // printArr 함수 호출. 

}

 

3. 프로그램의 구조화

큰 규모의 프로그램을 만들 시 엄청난 양의 코드들을 문장들을 작업 단위로 나눠서 여러 개의 메서드에 담아 프로그램을 단순화시켜야 합니다.

 

예를 들어 아래 코드와 같이작업 단위를 나눠 메서드를 나눠 사용하면 가독성도 좋아집니다.

public static void main(String args[]) {
	int[] numArr = new int[10];
    
    initArr(numArr); // 배열을 초기화하는 함수
    printArr(numArr); // 배열을 출력하는 함수
    sortArr(numArr); // 배열을 정렬하는 함수
    printArr(numArr); // 배열을 출력하는 함수
}

 


메서드의 선언과 구현

메서드는 크게 '선언부(header)'와 '구현부(body)'로 이루어져 있습니다.

메서드를 정의한다는 것은 선언부와 구현부를 작성하는 것을 뜻하며 다음과 같은 형식으로 메서드를 정의할 수 있습니다.

반환타입 메서드이름(타입 변수명, 타입 변수명, ... )  /* 선언부 */
{
	// 메서드 호출시 수행될 코드                     /* 구현부 */
}

 

int addTest(int a, int b)
{
	int result = a + b;
    return result;
}

return의 반환 값의 타입과 메서드의 반환 타입은 일치하거나 자동 형변환 가능한 것이어야 합니다.

( 위 코드의 addTest 메서드의 반환타입은 int형, result도 int형이므로 반환타입 일치 )

 

여기서 만약 메서드의 반환 타입이 void일 경우 return을 생략합니다.
void HelloWorld()
{
	System.out.println("Hellow World!");
}

 


기본형 매개변수와 참조형 매개변수

기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. ( Read Only )
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. ( Read & Write )

 

  • 기본형 매개변수 코드
class Data { int x; } // Data 클래스

class PrimitiveParamEx {
	public static void main(String[] args) {
		Data d = new Data(); // Data 클래스를 이용해 d 객체 생성
		d.x = 10;
		System.out.println("main() : x = " + d.x);

		change(d.x); // change메서드의 매게변수 x의 값이 변경되어 원본에 영향x
		System.out.println("After change(d.x)");
		System.out.println("main() : x = " + d.x); // 원본에 영향은 없이 x=10이 출력된다.
	}

	static void change(int x) {  // 기본형 매개변수. ( 변수에 저장된 값을 읽기면 할 수 있다. 변경 x)
		x = 1000;
		System.out.println("change() : x = " + x); // change 메서드의 x 값이 1000으로 저장
	}
}

출력 결과

d.x의 값이 변경된 것이 아니라, change메서드의 매개변수 x의 값이 변경되어 원본에는 아무런 영향을 미치지 않았습니다.

이처럼 기본형 매개변수는 변수에 저장된 값만 읽을 수만 있을 뿐 변경할 수는 없습니다.

 

 

  • 참조형 매개변수 코드
class Data { int x; }

public class ReferenceParamEx {

	public static void main(String[] args) {
		Data d = new Data();
		d.x = 10;
		System.out.println("main() : x = " + d.x);

		change(d);
		System.out.println("After change(d)");
		System.out.println("main() : x = " + d.x);

	}

	// static을 붙이면 객체 생성 생략 가능, void는 return 생략 가능
	static void change(Data d) { // 참조형 매개변수 (Data 클래스를 참조)
		d.x = 1000;
		System.out.println("change() : x = " + d.x); // d 객체의 x 값을 1000으로 변경
	}

}

출력 결과

기본형 매개변수와 달리 change메서드를 호출한 후에도 d.x의 값이 1000으로 변경되었습니다.

그 이유는 change 메서드가 참조형이기 때문에 값이 아니라 "값이 저장된 주소"를 change메서드에 넘겨주었기 때문입니다.

 

 


참고자료 : 자바의 정석3