1. 메서드란?
메서드는 객체가 수행할 수 있는 행동이다. 객체지향에서는 객체는 메서드를 통해서만 외부와 상호작용한다.
class Person {
void speak() {
System.out.println("말한다");
}
}
- 필드 -> 상태
- 메서드 -> 행동
2. 메서드의 구조
[접근제어자] [기타제어자] 반환타입 메서드명(매개변수) {
실행 코드
}
public static int add(int a, int b) {
return a + b;
}
- 접근제어자: 외부 접근 범위
- 변환 타입 : 결과 값의 타입
- 메서드명 : 역할을 드러내는 이름
- 매개변수 : 입력값
- 메서드 바디 : 실제 로직
3. 메서드 시그니처
메서드 이름 + 매개변수 타입/순서
❌ 포함되지 않는 것
- 반환 값
- 접근 제어자
4. 메서드 호출과 스택 메모리
void foo() {
bar();
}
void bar() {
int x = 10;
}
호출 시 JVM의 동작
- foo() 호출 -> Stack 메모리 할당
- bar() 호출 -> 새로운 Stack 메모리 할당
- bar() 종료 -> Stack 메모리 해제
- foo()로 복귀
-> foo() 종료 시 Stack 메모리 자동 해제
5. Call by Value
Java는 항상 Call by Value이다.
void change(int x) {
x = 10;
}
int a = 5;
change(a);
System.out.println(a); // 5
값 자체가 복사되는 것이다.
6. 오버로딩(Overloading)
같은 이름의 메서드를 다른 시그니처 여러 개로 정의하는 것
int add(int a, int b)
double add(double a, double b)
오버로딩이 가능할 때
- 매개변수 개수 다를 때
- 매개변수 타입 다를 때
- 매개변수 순서 다를 때
오버로딩 불가능할 때
- 반환 타입만 다를 때
- 접근 제어자만 다를 때
📌오버로딩은 편의성 기능이지, 책임 분산 도구가 아니다.
7. 가변 인자(varargs)
void sum(int... nums) {
for (int n : nums) {
System.out.println(n);
}
}
- 내부적으로 배열처럼 동작함
- 인자 개수를 유연하게 받을 수 있음
모호성
void test(int a, int... b)
void test(int... a) // ❌ 모호성 발생 가능
- 가변인자는 마지막 파라미터에만 사용해야 함
- 오버로딩과 섞이면 위험할 수 있다
8. static 메서드 vs 인스턴스 메서드
| 구분 | static 메서드 | 인스턴스 메서드 |
| this 사용 | X | O |
| 접근 가능 | static 멤버만 | static + 인스턴스 |
| 컨텍스트 | 클래스 | 객체 |
| 객체 필요 | X | O |
9. 요약
- 메서드는 객체의 행동이다
- 메서드 시그니처는 이름 + 매개변수로 결정된다
- Java는 항상 Call by Value다
- 오버로딩은 시그니처가 다를 때만 가능
- 가변인자는 편리하지만 잘 고려해야함
'Java & Spring > Java' 카테고리의 다른 글
| 상속(Inheritance)이란 (0) | 2026.01.06 |
|---|---|
| 생성자&this,this() (0) | 2026.01.06 |
| Static (2) | 2026.01.05 |
| 객체의 상태와 변수의 생명주기 (0) | 2026.01.05 |
| 객체 지향 기본 (0) | 2026.01.05 |