Java 메소드는 아래와 같은 형태로 선언합니다.
반환형 메소드명([arguments]) {
[body]
}
void: 반환값이 없음을 의미return: 메소드 내부에서 결과를 반환할 때 사용static을 붙이면 객체 생성 없이 클래스 이름으로 바로 메소드를 호출할 수 있습니다.
예시 코드:
public class MethodLab {
static void add(int a, int b) {
System.out.println(a + b);
}
public static void main(String[] args) {
MethodLab.add(10, 20);
add(10, 20); // 같은 클래스 안에서는 클래스명 생략 가능
}
}
예시 코드2
package step02;
class Person2 {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class MethodLab2 {
static Person2 getPerson2() {
return new Person2();
}
static void setPerson2(Person2 p) {
p.setName("가오리");
System.out.println(p.name);
}
public static void main(String[] args) {
Person2 p1 = MethodLab2.getPerson2();
MethodLab2.setPerson2(p1);
Person2 p2 = new Person2();
MethodLab2.setPerson2(p2);
System.out.println("p2 객체 생성 시 이름 : " + p2.name);
p2.setName("가올가올");
System.out.println("p2 이름 수정 후 : " + p2.name);
setPerson2(p2);
System.out.println("p2 setPerson2 후 : " + p2.name);
}
}

static은 클래스에 귀속된 멤버에 붙이며, 객체 생성 없이 접근할 수 있습니다.
| 상황 | static 사용 여부 | 예시 코드 |
|---|---|---|
| 모든 값에 대해 동일한 동작 수행 | O | Math.abs(-5) |
| 객체별 다른 상태가 필요한 동작 수행 | X (인스턴스 메소드) | data.length() |
객체 상태에 의존하지 않는 기능
int absValue = Math.abs(-10);
공유해야 하는 값
public class Counter {
static int totalCount = 0;
}
객체 생성 비용 감소
double result = Math.pow(2, 3);
객체의 상태에 의존하는 기능은 static으로 선언할 수 없습니다.
String data = "Hello";
int len = data.length();
char c = data.charAt(2);
클래스 로딩 시 1회만 실행됩니다.
static {
System.out.println("class loaded");
}
외부에서 생성자 호출을 막고 단일 인스턴스를 제공합니다.
private static Model model = new Model();
private Model(){}
public static Model getModel() {
return model;
}
Lombok은 반복적인 코드를 컴파일 시 자동 생성합니다.
모든 필드의 Getter 메소드 자동 생성
@Getter
public class Person {
String name;
int age;
}
모든 필드의 Setter 메소드 자동 생성
@Setter
public class Person {
String name;
int age;
}
모든 필드를 초기화하는 생성자 자동 생성
@AllArgsConstructor
public class Person {
String name;
int age;
}
기본 생성자(매개변수 없는 생성자) 자동 생성
@NoArgsConstructor
public class Person {
String name;
int age;
}
final 또는 @NonNull 필드만 초기화하는 생성자 생성
@RequiredArgsConstructor
public class Person {
private final String name;
private final int age;
private String address;
}
| 옵션 | 설명 |
|---|---|
staticName | 정적 팩토리 메소드 생성 |
access | 생성자의 접근 제한자 지정 (PUBLIC, PRIVATE 등) |
onConstructor | 생성자의 접근 제어자 설정 |
force | final 필드를 강제로 기본값(null, 0)으로 초기화 |
staticName: 정적 팩토리 메소드 생성
모든 생성자 어노테이션에 사용 가능
@AllArgsConstructor에 사용 시
@AllArgaConstructor(staticName = "of")
public class Person {
private String name;
private int age;
private String address;
public static Person of(String name, int age, String address){
new Person(name, age, address);
}
}
access: 접근 제한자 지정
PUBLIC : 기본값이며, 모든 클래스에서 생성자에 접근 가능PROTECTED : 같은 패키지의 클래스와 상속받은 클래스에서 생성자에 접근 가능PACKAGE : 같은 패키지의 클래스에서 생성자에 접근 가능PRIVATE : 해당 클래스 내부에서만 생성자에 접근 가능NONE과 MODULE 접근 제어자가 있지만 일반적으로 사용 안함onConstructor : 생성자의 접근 제어자 설정. 기본값은 public
force : final 필드가 선언된 경우 컴파일 타임에 기본값을 0/null/false`로 설정
@NoArgsConstructor 어노테이션에서만 사용 가능public class Person {
private final String name = null;
private final int age = 0;
private String address;
}| 구분 | 설명 |
|---|---|
| static 메소드 | 클래스 로딩 시 생성, 객체 없이 호출 가능 |
| 인스턴스 메소드 | 객체 상태에 의존, 반드시 인스턴스 생성 후 호출 |
| Lombok Getter/Setter | 반복되는 접근자 메소드 자동 생성 |
| Lombok 생성자 어노테이션 | 다양한 생성자 자동 생성 및 초기화 옵션 지원 |
| Singleton 패턴 | static 필드 + private 생성자로 단일 인스턴스 보장 |
📚 참고자료