지난 포스트에서 메소드
를 클래스 내부에서 정의되는 함수라고 간단하게 이야기했었는데요. 오늘은 이 메소드를 조금 더 자세하게 알아보려고 합니다.
메소드(method)
는 코드 블록으로 감싸진 명령 모음입니다. 이렇게말하면 어려워보이지만 간단하게 함수로, 어떤 데이터를 받아서 해당 데이터를 처리하고 결과를 돌려주는 역할을 수행합니다. 물론 경우에 따라서 입력값이 없거나 반환값이 없는 경우도 있습니다.
주로 코드 줄 수를 줄이는데 목적이 있기에 반복되는 코드를 모아 하나의 메소드를 만들고, 해당 코드가 필요한 부분에서 메소드를 호출하는 식으로 사용합니다. 또한 코드를 모아놓았기 때문에 유지보수도 쉬워지는 장점을 갖고있습니다.
메소드는 다음 세 가지를 주의하면서 작성합니다.
위 세 가지를 주의하면서 메소드를 작성하면 메소드의 내부 코드는 몰라도 이름, 파라미터, 반환 결과만 보고도 해당 코드들을 이해하는데 큰 도움을 받을 수 있습니다.
메소드는 다음과 같이 선언합니다.
반환값_타입 메소드이름 (매개변수, ...) {
//메소드의 동작 구현
}
반환값 타입
은 결과로 반환하는 값의 타입을 적어줍니다. ex)숫자를 반환하면 int, long 등void
를 사용하고, 반환값이 있다면 메소드 마지막에 return
문을 통해서 반환값을 내보내주어야합니다.매개변수(파라미터)
는 상황에 따라 있을 수도 있고 여러개가 올 수도 있습니다.다음 코드는 int형 매개변수 두 개를 받아 덧셈을하고 int 타입값을 반환하는 메소드입니다.
int add (int num1, int num2) {
return num1 + num2;
}
메소드의 호출은 참조변수와 .
을 이용해서 호출합니다.
참조변수.메소드이름(매개변수, ...);
return
은 현재 실행 중인 메소드를 종료하고 호출했던 메소드로 돌아가는 명령을 수행합니다.
메소드는 다음 두 가지 상황에서 종료됩니다. (*오류가 아닐경우만)
- 블록 마지막까지 수행되어 블록이 끝난경우
- return 문을 수행하는 경우
return
은 반환값이 있는 경우와 없는 경우 모두 사용가능합니다. 단, 반환값이 있는 경우 메소드 선언의 타입과 반환값의 타입이 일치해야합니다.(자동형변환이 수행되는 경우도 OK!!!)
return; //반환값이 없는 경우
return 반환값; //반환값이 있는 경우
매개변수(인자, Parameter)
는 메소드에서 작업을 수행하는데 필요한 데이터를 전달받는 메소드 내부에서 사용되는 변수입니다. 메소드에 따라 매개변수가 없을 수도 여러 개일 수도 있습니다.
참고로 함수가 호출될 때 전달하는 변수 또는 값은
전달 인자(인수, Argument)
라고 부릅니다.
매개변수는 변수 형태로 받기 때문에 기본형 변수와 참조형 변수 둘 다 올 수 있는데요. 두 형태의 동작이 약간 차이가 있습니다.
먼저 기본형 매개변수는 오직 변수에 저장된 값만을 읽어냅니다. 즉 읽기 전용입니다. 참조형 매개변수는 값을 읽고 쓰고 둘 다 할 수 있습니다. 이러한 이유는 기본형은 값을 직접 저장하는 변수고 참조형은 값이 저장된 주소에 대한 정보를 가진 타입이기 때문입니다.
참조형 매개변수를 이용하면 아래와 같은 코드를 작성해서 실행해도 x[0]
를 변경하는 과정에서 오류가 발생하지 않습니다.
int[] x = {1};
int changeX (int[] x) {
x[0] = 2;
}
멤버변수 때 처럼 메소드도 또한 static
키워드의 유무에 따라 클래스메소드와 인스턴스메소드가 됩니다.
static
이 붙으면 클래스메소드, 붙지 않으면 인스턴스메소드가 됩니다. 마찬가지로 클래스메소드는 클래스가 등록될 때 생성되어 인스턴스를 하지 않고도 사용이 가능하며, 인스턴스메소드는 인스턴스화할 때 생성되어 인스턴스를 통해 접근이 가능합니다.
사용처가 비교적 명확한데요. 클래스메소드
는 인스턴스와는 인스턴스변수나 인스턴스메소드를 이용하지 않는 메소드를 정의할 때 정의하고, 인스턴스메소드
는 인스턴스변수와 관련된 작업을 하는 메소드를 정의할 때 사용하면 좋습니다.
위에서 예시 코드로 나온 add나 changeX가 static을 붙여 클래스메소드로 만들면 딱 좋은 예시입니다.
한 가지 주의할 점은 클래스메소드
에서는 인스턴스변수를 사용할 수 없다라는 것입니다. 왜냐하면 클래스 메소드는 클래스가 등록되는 시점에 등록되는데, 이 시점에서 인스턴스화를 하지 않았다면 등록되지도 않은 인스턴스변수를 가져다 사용하는 것이 되기 때문에 사용할 수 없는 것 입니다.