Java 메서드란 무엇인가
Java에서 메서드(Method)는 특정 기능을 수행하기 위해 모인 일련의 문장들의 집합입니다. 프로그래밍에서 메서드는 다음과 같은 특징을 가집니다.
- 특정 문제를 해결하기 위한 절차를 논리적으로 결합한 단위입니다.
- 클래스 내부에 존재하며 객체의 동작을 정의합니다.
- 한 번 작성하면 프로그램 내 어디서든 호출하여 재사용할 수 있습니다.
메서드 설계 시에는 원자성(Atomicity)을 유지하는 것이 중요합니다. 즉, 하나의 메서드는 하나의 기능만 수행하도록 설계해야 유지보수와 확장이 용이합니다.
public class MethodBasic {
public static void main(String[] args) {
// 메서드 호출을 통한 결과값 수신
int result = calculateTotal(15, 25);
System.out.println("합계: " + result);
}
// 두 정수의 합을 구하는 메서드
public static int calculateTotal(int num1, int num2) {
return num1 + num2;
}
}
메서드 정의 방법
Java의 메서드는 다른 언어의 함수와 유사하며, 일반적으로 다음과 같은 구성 요소를 포함합니다.
- 제어자(Modifier): 메서드의 접근 권한이나 특성(public, static 등)을 정의합니다.
- 반환 타입(Return Type): 메서드가 실행 후 돌려주는 데이터의 타입입니다. 결과값이 없다면
void를 사용합니다. - 메서드 이름: 메서드를 식별하기 위한 명칭입니다.
- 매개변수 목록(Parameter List): 외부에서 전달받는 데이터의 타입과 이름을 지정합니다. 데이터가 필요 없다면 비워둘 수 있습니다.
- 메서드 본문(Method Body): 실제 로직이 실행되는 코드 블록입니다.
제어자 반환타입 메서드명(매개변수타입 매개변수이름) {
// 실행 로직
...
return 결과값; // void가 아닐 경우 필수
}
메서드 호출과 흐름
메서드는 호출 방식에 따라 값으로 취급되거나 독립적인 문장으로 실행됩니다.
- 반환값이 있는 경우: 변수에 할당하거나 연산식의 일부로 사용됩니다.
- 반환값이
void인 경우: 하나의 실행 문장으로 사용됩니다.
public class Comparison {
public static void main(String[] args) {
int largerValue = getGreaterValue(45, 32);
System.out.println("더 큰 값은: " + largerValue);
}
public static int getGreaterValue(int x, int y) {
if (x == y) {
return 0; // 값이 같으면 0 반환 및 종료
}
return (x > y) ? x : y;
}
}
메서드 오버로딩(Method Overloading)
오버로딩은 한 클래스 내에서 동일한 이름을 가진 메서드를 여러 개 정의하는 기능입니다. 이를 통해 유사한 기능을 다양한 입력 타입에 대응시킬 수 있습니다.
오버로딩 성립 규칙:
- 메서드 이름이 반드시 같아야 합니다.
- 매개변수의 개수, 타입, 또는 순서가 달라야 합니다.
- 반환 타입만 다른 것은 오버로딩으로 인정되지 않습니다.
public class OverloadEx {
public static void main(String[] args) {
System.out.println(fetchMax(10, 20));
System.out.println(fetchMax(15.5, 12.3));
}
// 정수형 비교
public static int fetchMax(int a, int b) {
return (a > b) ? a : b;
}
// 실수형 비교
public static double fetchMax(double a, double b) {
return (a > b) ? a : b;
}
}
가변 인자(Variable Arguments)
JDK 1.5부터 도입된 가변 인자를 사용하면 개수가 정해지지 않은 매개변수를 유연하게 전달받을 수 있습니다. 타입 뒤에 생략 부호(...)를 붙여 선언하며, 내부적으로는 배열로 처리됩니다.
- 가변 인자는 메서드의 마지막 파라미터로만 사용할 수 있습니다.
- 메서드당 하나만 선언 가능합니다.
public class VarArgsEx {
public static void main(String[] args) {
printElements(1, 3, 5, 7, 9);
}
public static void printElements(int... numbers) {
for (int n : numbers) {
System.out.print(n + " ");
}
}
}
재귀 메서드(Recursion)
재귀는 메서드가 자기 자신을 다시 호출하는 기법입니다. 복잡한 문제를 단순화하여 표현할 수 있다는 장점이 있지만, 스택 오버플로우를 방지하기 위해 종료 조건이 명확해야 합니다.
- 재귀 종료 조건: 더 이상 자신을 호출하지 않고 값을 반환하는 조건입니다.
- 재귀 단계: 문제를 작은 단위로 나누어 자신을 호출하는 부분입니다.
public class RecursiveEx {
public static void main(String[] args) {
int factResult = getFactorial(5);
System.out.println("5 팩토리얼: " + factResult);
}
public static int getFactorial(int n) {
if (n <= 1) {
return 1; // 종료 조건
}
return n * getFactorial(n - 1); // 재귀 호출
}
}