05. 메서드
메서드는 "이름이 붙은 코드 한 묶음" 입니다. 같은 일을 여러 번 해야 할 때 메서드로 분리하면 가독성과 재사용성이 동시에 좋아집니다. 이 단원에서는 메서드의 선언법, 오버로딩, `static` 의 의미, 가변 인자(`...`) 를 다룹니다.
이 강의에서 배우는 것
- 1메서드 선언 형식(접근 제한자·반환형·이름·매개변수)을 안다
- 2오버로딩과 오버라이딩의 차이를 안다 (오버라이딩은 08편)
- 3`static` 메서드와 인스턴스 메서드의 차이를 이해한다
- 4가변 인자 `String...` 의 동작을 본다
소개
메서드는 "이름이 붙은 코드 한 묶음" 입니다. 같은 일을 여러 번 해야 할 때 메서드로 분리하면 가독성과 재사용성이 동시에 좋아집니다. 이 단원에서는 메서드의 선언법, 오버로딩, `static` 의 의미, 가변 인자(`...`) 를 다룹니다.
핵심 개념
1) 메서드 선언
public static int add(int a, int b) {
return a + b;
}- 접근 제한자: `public` / `private` / (기본)package-private / `protected`
- 반환형: 없으면 `void`
- 매개변수: 0 개 이상
- 본문: 중괄호 `{ ... }`
2) 오버로딩
static int max(int a, int b) { return a > b ? a : b; }
static double max(double a, double b) { return a > b ? a : b; }같은 이름, **다른 매개변수 시그니처** 를 갖는 여러 메서드를 만들 수 있습니다.
3) `static` 메서드
class MathUtil {
static int square(int x) { return x * x; }
}
MathUtil.square(5); // 인스턴스 없이 호출`static` 은 **클래스 자체** 에 속하는 메서드입니다. 객체를 만들지 않고 `클래스명.메서드()` 로 호출합니다.
4) 가변 인자 (`...`)
static int sumAll(int... nums) {
int s = 0;
for (int n : nums) s += n;
return s;
}
sumAll(1, 2, 3, 4); // 10
sumAll(); // 0내부적으로 배열로 처리되며, 시그니처에서 **맨 끝에 한 개만** 둘 수 있습니다.
핵심 예제
예제 1 — `MethodBasics.java` : 선언과 호출
public class MethodBasics {
public static void main(String[] args) {
int s = add(3, 4);
System.out.println("3 + 4 = " + s);
greet("지수");
}
/** 두 정수의 합. */
static int add(int a, int b) {
return a + b;
}
/** 인사 출력. */
static void greet(String name) {
System.out.println("Hello, " + name + "!");
}
}**실행 결과**
3 + 4 = 7
Hello, 지수!**메모:** `main` 도 결국 `static` 메서드라는 사실이 보입니다.
예제 2 — `Overloading.java` : 같은 이름, 다른 시그니처
public class Overloading {
public static void main(String[] args) {
System.out.println(max(3, 7));
System.out.println(max(3.5, 2.1));
System.out.println(max("apple", "banana"));
}
static int max(int a, int b) { return a > b ? a : b; }
static double max(double a, double b) { return a > b ? a : b; }
static String max(String a, String b) { return a.compareTo(b) > 0 ? a : b; }
}**실행 결과**
7
3.5
banana**메모:** 반환형만 다르고 매개변수가 같다면 **오버로딩이 안 됩니다**.
예제 3 — `StaticVsInstance.java` : 클래스 vs 인스턴스
public class StaticVsInstance {
static int staticCount; // 클래스 1개 공유
int instanceCount; // 인스턴스마다 분리
void increment() {
staticCount++;
instanceCount++;
}
public static void main(String[] args) {
StaticVsInstance a = new StaticVsInstance();
StaticVsInstance b = new StaticVsInstance();
a.increment(); a.increment();
b.increment();
System.out.println("a.instance=" + a.instanceCount);
System.out.println("b.instance=" + b.instanceCount);
System.out.println("static=" + StaticVsInstance.staticCount);
}
}**실행 결과**
a.instance=2
b.instance=1
static=3**메모:** `static` 필드는 **클래스 전체에 1개**, 인스턴스 필드는 **객체마다 별도** 입니다.
예제 4 — `Varargs.java` : 가변 인자
public class Varargs {
public static void main(String[] args) {
System.out.println(sumAll());
System.out.println(sumAll(1, 2, 3));
System.out.println(sumAll(10, 20, 30, 40));
}
/** 가변 개수의 정수를 모두 합산. */
static int sumAll(int... nums) {
int s = 0;
for (int n : nums) s += n;
return s;
}
}**실행 결과**
0
6
100**메모:** `int...` 는 내부적으로 `int[]` 와 동일하게 동작합니다.
전체 예제 코드 (src/)
src/MethodBasics.java
public class MethodBasics {
public static void main(String[] args) {
int s = add(3, 4);
System.out.println("3 + 4 = " + s);
greet("지수");
}
/** 두 정수의 합. */
static int add(int a, int b) {
return a + b;
}
/** 인사 출력. */
static void greet(String name) {
System.out.println("Hello, " + name + "!");
}
}
src/Overloading.java
public class Overloading {
public static void main(String[] args) {
System.out.println(max(3, 7));
System.out.println(max(3.5, 2.1));
System.out.println(max("apple", "banana"));
}
static int max(int a, int b) { return a > b ? a : b; }
static double max(double a, double b) { return a > b ? a : b; }
static String max(String a, String b) { return a.compareTo(b) > 0 ? a : b; }
}
src/StaticVsInstance.java
public class StaticVsInstance {
static int staticCount;
int instanceCount;
void increment() {
staticCount++;
instanceCount++;
}
public static void main(String[] args) {
StaticVsInstance a = new StaticVsInstance();
StaticVsInstance b = new StaticVsInstance();
a.increment(); a.increment();
b.increment();
System.out.println("a.instance=" + a.instanceCount);
System.out.println("b.instance=" + b.instanceCount);
System.out.println("static=" + StaticVsInstance.staticCount);
}
}
src/Varargs.java
public class Varargs {
public static void main(String[] args) {
System.out.println(sumAll());
System.out.println(sumAll(1, 2, 3));
System.out.println(sumAll(10, 20, 30, 40));
}
/** 가변 개수의 정수를 모두 합산. */
static int sumAll(int... nums) {
int s = 0;
for (int n : nums) s += n;
return s;
}
}
자주 하는 실수
- 반환형이 `void` 인데 `return value;` 작성
- 매개변수에 같은 이름을 두 번 사용
- `static` 메서드 안에서 인스턴스 필드 직접 접근 (불가)
- 오버로딩과 오버라이딩 혼동 — 오버라이딩은 상속(08편)
- 가변 인자를 메서드 시그니처 중간에 두기
정리
- 메서드는 코드 재사용의 기본 단위
- 같은 이름·다른 시그니처는 **오버로딩**
- `static` 은 클래스 소속, 인스턴스 없이 호출
- 가변 인자는 마지막 자리에 한 개만
과제
# 과제 - 05. 메서드
## 문제 1 — 소수 판별 메서드
- 파일명: `Homework01.java`
- 핵심 개념: 메서드 선언, 반환값
요구사항
- `static boolean isPrime(int n)` 메서드를 만들어 1 미만이면 false, 그 외엔 약수 검사로 소수 판별합니다.
- main 에서 2 ~ 10 의 결과를 출력합니다.
예상 출력
2 -> true
3 -> true
4 -> false
5 -> true
6 -> false
7 -> true
8 -> false
9 -> false
10 -> false## 문제 2 — 평균 (오버로딩 + 가변 인자)
- 파일명: `Homework02.java`
- 핵심 개념: 오버로딩, 가변 인자
요구사항
- `static double avg(int... nums)` 와 `static double avg(double... nums)` 두 개를 작성합니다.
- 빈 입력이면 0 을 반환합니다.
예상 출력
int avg(1,2,3,4) = 2.5
double avg(1.5, 2.5) = 2.0
empty = 0.0## 정답 확인 직접 풀어 본 후 [`answer/`](./answer/) 폴더의 정답과 비교해 보세요.
정답 코드 (homework/answer/)
answer/Homework01.java
/** 소수 판별. */
public class Homework01 {
public static void main(String[] args) {
for (int n = 2; n <= 10; n++) {
System.out.println(n + " -> " + isPrime(n));
}
}
static boolean isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
}
answer/Homework02.java
/** 평균: 오버로딩 + 가변 인자. */
public class Homework02 {
public static void main(String[] args) {
System.out.println("int avg(1,2,3,4) = " + avg(1, 2, 3, 4));
System.out.println("double avg(1.5, 2.5) = " + avg(1.5, 2.5));
System.out.println("empty = " + avg());
}
static double avg(int... nums) {
if (nums.length == 0) return 0;
int s = 0;
for (int n : nums) s += n;
return (double) s / nums.length;
}
static double avg(double... nums) {
if (nums.length == 0) return 0;
double s = 0;
for (double n : nums) s += n;
return s / nums.length;
}
}
직접 해 보기
cd 01_기초/05_메서드/src
javac Overloading.java
java Overloading다음 단원
[06_클래스와_객체](../../02_객체지향/06_클래스와_객체/) — 객체지향의 첫 걸음, `class` 정의와 객체 생성을 배웁니다.