강좌 Course 1. Part 2. ch8 요약
객체가 가지고 있는 동작이나 기능을 칭한다. 주로 반복적인 동일작업을 편의 및 유지보수를 위해 메서드로 만들어 사용한다. 객체지향프로그램은 메서드를 통해 객체끼리 상호작용하며, API가 제공해주는 메서드, 그리고 사용자가 직접 정의하여 사용하는 메서드 두 종류로 분류할 수 있다.
메서드를 사용하려면, 먼저 메서드를 정의한 뒤 호출을 해야 한다.
함수를 선언할 때는 접근제한자, 결과로 반환될 자료형, 함수 이름, 입력받을 값(=매개변수 혹은 파라미터라고도 한다) 등이 필요하다. 이러한 요소들을 선언한 부분이 정의부이며, 구현부인 {} 안에는 실제로 입력받은 값을 가지고 실행할 내용이 들어간다.
접근제한자 리턴타입 메소드명(인수1, 인수2, ...){
실행할 내용;
return 반환값;
}
// 예시
public int add(int x, int y){
int z = x + y;
return z;
}
// 메서드 호출
int a = 5;
int b = 7;
int s = add(a,b);
return은 메서드를 종료하고, 메서드를 실행하여 얻은 결과를 메서드 밖으로 반환하는 역할을 한다. 메서드가 아무런 결과값을 반환하지 않을 때, 리턴 타입은 void 이다.
메서드의 결과 값은 하나로 반환되며, 메서드를 호출할 때 메서드의 이름이 변수 역할을 한다.
매개변수를 받지 않더라도 괄호는 필수이다. 매개변수에는 직접 값을 넘겨줄 수 있고(예시로 적어둔 코드가 그 예이다.), 배열 등의 레퍼런스를 전달할 수도 있다. 이를 Call By Reference라고 하며, 자바는 대부분의 경우 이 방식으로 메서드를 실행하게 된다.
// 예시
public int addArray(int[] x){
int result = 0;
forEach(int i:x){
result+=i;
}
return result;
}
int[] num={1,2,3,4};
System.out.println(addArray(num));
메서드 오버로딩은 하나의 클래스 안에 동일한 이름의 메서드를 여러 개 사용할 수 있게 하는 것을 말한다. 같은 이름으로 여러 동작을 실행할 수 있어 편리하나, 필요로 하는 매개변수의 개수나, 매개변수의 타입이 달라야 한다는 조건을 가지고 있다.
// 예시
public int add(int x, int y){
int result = x+y;
return result;
}
public float add(float x, float y){
float result = x+y;
return result;
}
public int add(int x, int y, int z){
int result = x+y+z;
return result;
}
이러한 오버로딩이 가능한 이유는 컴파일 시점에(=작성하는 시점에서) 호출될 메서드가 결정되기 때문이다. 메서드들은 이름이 같더라도 컴파일할 때 자바 내부에서 이름을 개별로 구분하여 관리한다. 위의 add라는 이름의 세 메서드의 경우, 첫번째는 add_int_int, 두번째는 add_float_float, 세번째는 add_int_int_int와 같은 식이다.
이를 정적 바인딩이라고 하는데, 이 방법을 사용하면 호출될 때 맞는 메서드를 찾는다고 시간이 낭비되지 않고, 실행속도에 영향이 가지도 않는다.
반대로 Override는 동적바인딩을 사용하며, 이는 실행속도에 영향을 미친다.