main메서드 내부에 메서드 선언
Java에서는 main
메서드 내부에 또 다른 메서드를 선언할 수 없습니다.
모든 메서드는 클래스 내부에서만 선언할 수 있습니다.
🔹 Java에서 메서드 선언 규칙
✅ 올바른 방법 (클래스 내부)
public class Test { public static void printNumbers() { System.out.println("Hello, World!"); } public static void main(String[] args) { printNumbers(); // 메서드 호출 가능 } }
printNumbers()
메서드는Test
클래스 내부에서 선언됨.main()
에서 메서드를 호출하여 사용 가능.
❌ 잘못된 방법 (
main
메서드 내부에 메서드 선언)public class Test { public static void main(String[] args) { public static void printNumbers() { // ❌ 오류 발생 System.out.println("Hello, World!"); } printNumbers(); } }
main
내부에서printNumbers()
를 선언하려고 하면 컴파일 오류 발생!- Java는 메서드 중첩 선언을 허용하지 않음.
💡 결론
✔ 모든 메서드는 반드시 클래스 내부에서 선언해야 하며, 다른 메서드 내부에서는 선언할 수 없습니다.
중첩 메서드
Java에서는 일반적인 의미의 "중첩 메서드(nested method)"를 허용하지 않습니다.
즉, 한 메서드 내부에서 다른 메서드를 선언할 수 없습니다.
하지만 람다식(lambda) 또는 익명 클래스(anonymous class) 를 사용하면 메서드 내부에서 함수를 정의하는 것과 비슷한 효과를 낼 수 있습니다.
❌ 잘못된 예시 (Java는 중첩 메서드를 직접 허용하지 않음)
public class Test {
public static void main(String[] args) {
public static void innerMethod() { // ❌ 오류 발생
System.out.println("Hello, World!");
}
innerMethod();
}
}
❌ 오류 이유:
innerMethod()
는main()
내부에서 선언됨 → Java에서는 메서드 중첩 선언 불가능!- 모든 메서드는 반드시 클래스 내부에서 선언되어야 함.
✅ 대안 1: 메서드를 클래스 내부에 선언 (일반적인 방법)
public class Test {
public static void innerMethod() { // ✅ 클래스 내부에서 선언
System.out.println("Hello, World!");
}
public static void main(String[] args) {
innerMethod(); // 호출 가능
}
}
✔ 해결 방법:
innerMethod()
를main()
내부가 아니라 클래스 내부에서 선언하면 문제 없음.
✅ 대안 2: 익명 클래스(Anonymous Class) 활용 (메서드 내부에서 함수처럼 정의)
public class Test {
public static void main(String[] args) {
Runnable runnable = new Runnable() { // 익명 클래스 생성
@Override
public void run() {
System.out.println("Hello from inner method!");
}
};
runnable.run(); // 실행
}
}
✔ 해결 방법:
Runnable
익명 클래스를 사용하여 메서드 내부에서 실행할 기능을 정의.- 메서드를 직접 선언하는 것은 불가능하지만, 인터페이스나 익명 클래스를 활용하면 비슷한 효과를 낼 수 있음.
✅ 대안 3: 람다식(Lambda) 사용 (Java 8 이상)
public class Test {
public static void main(String[] args) {
Runnable innerMethod = () -> System.out.println("Hello from lambda!");
innerMethod.run(); // 실행
}
}
✔ 해결 방법:
- 람다 표현식을 사용하여 메서드 내부에서 간단한 기능을 정의할 수 있음.
💡 결론
- Java는 메서드 중첩 선언을 허용하지 않음.
- 대신
- 클래스를 활용하여 클래스 내부에서 메서드를 정의하는 것이 일반적.
- 익명 클래스나 람다식을 사용하면 함수처럼 내부에서 선언하는 효과를 낼 수 있음.
🚀 추천:
- 일반적인 경우: 클래스 내부에서 메서드를 따로 선언.
- 특별한 경우(간단한 기능만 필요할 때): 람다식이나 익명 클래스를 활용.
질문: 매개변수를 명시하지 않으면 인자의 타입이나 개수에 상관없이 받을 수 있는가?
답변:
아니요, Java에서는 반드시 메서드의 매개변수를 명시해야 하며, 타입과 개수를 일치시켜야 합니다.
즉, 매개변수를 정의하지 않으면 아무런 인자도 받을 수 없습니다.
(단, 가변 인자(varargs
)나 메서드 오버로딩을 활용하면 다양한 개수를 처리할 수 있습니다.)
❌ 잘못된 예시 (매개변수 없이 모든 인자를 받으려 함)
public class Test {
public static void printValues() { // 매개변수 없음
System.out.println("Values: " + args); // ❌ 오류 발생
}
public static void main(String[] args) {
printValues(1, "Hello", 3.14); // ❌ 오류: 매개변수를 받지 않음
}
}
🚨 오류 발생:
printValues()
는 매개변수를 정의하지 않았으므로printValues(1, "Hello", 3.14);
호출 시 오류 발생.- Java에서는 메서드 호출 시 인자의 개수와 타입이 반드시 선언된 매개변수와 일치해야 함.
✅ 해결 방법 1: 가변 인자(varargs
) 사용
public class Test {
public static void printValues(Object... values) { // ✅ 가변 인자 사용
for (Object value : values) {
System.out.println(value);
}
}
public static void main(String[] args) {
printValues(1, "Hello", 3.14); // ✅ 다양한 개수와 타입의 인자 전달 가능
printValues(); // ✅ 인자를 하나도 전달하지 않아도 됨
}
}
✔ 설명:
Object... values
는 가변 인자(varargs) 기능을 사용하여 매개변수 개수에 상관없이 받을 수 있음.- 내부적으로 배열(
Object[]
)로 변환되어 사용 가능.
✅ 해결 방법 2: 메서드 오버로딩 (Overloading) 사용
public class Test {
public static void printValues(int num) { // int 타입 인자 1개 받음
System.out.println("Integer: " + num);
}
public static void printValues(String text) { // String 타입 인자 1개 받음
System.out.println("String: " + text);
}
public static void printValues(double num) { // double 타입 인자 1개 받음
System.out.println("Double: " + num);
}
public static void main(String[] args) {
printValues(1); // Integer 버전 호출
printValues("Hello"); // String 버전 호출
printValues(3.14); // Double 버전 호출
}
}
✔ 설명:
- 메서드 오버로딩을 사용하면 다양한 타입과 개수의 매개변수를 처리할 수 있음.
- 단, 정해진 타입과 개수만 가능하고, 모든 개수를 다룰 수는 없음.
✅ 해결 방법 3: Object[]
배열로 받기
public class Test {
public static void printValues(Object[] values) { // ✅ 배열을 사용하여 다양한 타입의 인자 처리
for (Object value : values) {
System.out.println(value);
}
}
public static void main(String[] args) {
Object[] values = {1, "Hello", 3.14};
printValues(values); // ✅ 배열을 통해 여러 개의 인자를 전달
}
}
✔ 설명:
Object[]
배열을 사용하면 다양한 타입의 값을 받을 수 있음.- 하지만 가변 인자(
Object...
)보다 불편하므로 잘 쓰이지 않음.
🚀 최종 결론
✔ Java에서는 매개변수를 명시하지 않으면 인자를 받을 수 없음.
✔ 다양한 개수와 타입을 받으려면 다음 방법을 사용해야 함:
- 가변 인자(
varargs
) → 가장 유연한 방법 (Object... values
) - 메서드 오버로딩 → 특정 타입별로 따로 처리 가능
- 배열(
Object[]
) 사용 → 여러 개의 인자를 묶어서 전달 가능하지만 불편함
🚀 추천: 대부분의 경우, 가변 인자(Object... values
)가 가장 편리!
'자바' 카테고리의 다른 글
매개변수가 없는 메서드와 매개변수가 없는 생성자 비교를 통한 생성자 이해 (0) | 2025.02.08 |
---|---|
final 키워드 특징 (0) | 2025.02.08 |
null이란? (0) | 2025.02.08 |
가변인자와 배열인자 (0) | 2025.02.08 |
동기 처리와 비동기 처리 (1) | 2025.02.07 |