메서드는 클래스의 행위를 표현하는 것으로 클래스 내의 함수로 볼 수 있다. 지금까지 공부했던 필드 변수들이 물체라면 그 물체들의 행동을 만들어주는 것이 메서드이다. 메서드는 입력값(매개변수=parameter)가 있고 그 입력값을 받아서 무언가의 결과를 반환해낸다. 그 유명한 input이 있으면 output이 있다. 메서드란 클래스의 기능으로써 무조건 클래스 안에 선언해야한다.
Call by value
class Test{
public int increase(int n){
n++;
return n;
}
public static void main(String[] args){
int val1 = 1;
Test test = new Test();
int val2 = test.increase(val1);
System.out.println("val1 = "+val1+", val2 = "+val2);
}
}
다음과 같은 코드에서 val1을 매개변수 int n으로 전달하여 값을 증가시키고 반환하였다. 그리고 결과 값을 확인해보면 val1=1, val2=2 가 나오는데 그 이유는 매개변수로 사용된 val1을 복사한 int n의 값을 증가시켜서 반환하여 val2의 값이 되었기 때문이다. 이렇게 매개변수의 값만을 사용하는 방식을 Call by value라고 한다.
메서드에서 매개변수를 받아서 값만 사용하고 전달 받은 매개변수의 값에는 영향을 미치지 않는 방식이다. 또한 대부분 매개변수로 기본 자료형을 받는다.
Call by reference
class Test2{
public void increase(int[] n){
for(int i=0; i<n.length; i++){
n[i]++;
}
}
public static void main(String[] args){
Test2 test = new Test2();
int[] val = {1,2,3};
test.increase(val);
for(int n : val){
System.out.println("result > "+n);
}
}
}
위의 Call by value와는 다르게 이번 코드에서는 실제 배열의 값들이 증가되어서 출력되어진다. 그 이유는 매개변수로 사용된 참조변수의 주소값을 그대로 매개변수에게 복사되어 참조변수가 기억하고 있는 객체값이 직접적으로 변경되는 것이다. 실제 객체의 값과 매개변수의 인자 값이 가지는 주소값이 같기 때문에 이를 Call by reference라고 한다.
메서드에서 매개변수를 실인자로 사용할 경우를 의미한다. 매개변수는 대부분 일반 객체 또는 배열들을 사용한다.
Varargs (가변 인자)
class Test3{
public void argTest(String... n){
for(String s : n){
System.out.println("s > "+s);
}
}
public static void main(String[] args){
Test3 test = new Test3();
test.argTest("varargs","test","3개");
test.argTest("varargs","test","하나더","4개");
}
}
다음과 같이 매개변수의 자료형에 ...을 붙여서 선언해주면 같은 자료형으로는 몇개든 넣어도 메서드를 호출할 수 있도록 사용할 수 있다.
Varargs란 지금까지 예제들은 매개변수의 갯수가 정해져있었고 매개변수의 갯수를 일치하게 넣어주지 않는다면 오류가 발생했다. 하지만 가변 인자를 사용하면 어떤 때에는 2개의 매개변수를 사용하고 또 어떤 때에는 3개의 매개변수를 사용하여 메서드를 호출할 수 있다.
오버로딩이라는 것은 하나의 클래스 내에서 같은 이름을 가지는 메서드가 여러개 정의되는 것을 말한다. 이것이 가능한 것은 컴파일할 때 컴파일러에 의해 각 메서드들이 구별되며 기준은 인자가 되기 때문이다. 오버로딩의 목적은 일관된 작업이며 그것으로 프로그램의 신뢰가 높아지게 된다. 그 예로 자주 사용하게 되는 (기본 자료형).valueOf() 메서드가 있는데 valueOf(매개변수)의 매개변수는 각 다른 기본 자료형들이 모두 들어간다.
class Test4{
public static void main(String[] args){
int val1 = 100;
Long val2 = 200L;
String val3 = "300";
System.out.println(String.valueOf(val1));
System.out.println(String.valueOf(val2));
System.out.println(Integer.valueOf(val3)+1);
}
}
위의 코드를 실행해보면 int 타입의 val1과 Long 타입의 val2가 모두 String으로 변경되어진 걸 확인할 수 있다. 이처럼 메서드의 이름은 동일하지만 매개변수의 타입이나 갯수등을 변경하여 사용하는 것을 오버로딩이라한다.