티스토리 뷰
제목그대로다.
'클래스 본문(필드 선언부)에는 실행문 못씀!!'
( 여기서말하는 실행문이란, "초기화문"이 아닌, if, for, System.out.println 등과 같은 "실행문"을 말함)
이후 예제는 추후에 정리예정(2025/08/24).
----------------------
오늘(2025/09/05)이 그 '추후'가 될 줄은 몰랐다.
방금 올린 콘솔에 로딩 중 출력하기 예제를 만들다가, 에러가 나서 고민하다가
'클래스 본문(필드 선언부)에는 실행문 못씀!!' 이 말이 떠올랐다.
일단 두개의 예제를 보자.
차이는 main 매서드냐 아니냐이고, 코드는 똑같다.
(main 매서드에서 바로 실행) ↓
public class main {
public static void main(String[] args) {
String[] animation = {"|", "/", "-", "\\"};
int totalSeconds = 5; // 로딩을 5초 동안 진행
int interval = 100; // 0.1초마다 업데이트
int loops = totalSeconds * 1000 / interval; // 총 반복 횟수
try {
System.out.print("로딩 중... ");
for (int i = 0; i < loops; i++) {
System.out.print("\b" + animation[i % animation.length]); // \b(backspace - 바로 앞의 문자를 하나 지움)로 이전 문자 지우고, 애니메이션 출력
Thread.sleep(interval); // 잠시 대기
}
System.out.print("\b"); // 마지막 애니메이션 문자 지우기
System.out.println("완료! ✅"); // 완료 메시지 출력
} catch (InterruptedException e) {
System.err.println("로딩 중 오류가 발생했습니다: " + e.getMessage());
}
}
}
( 일반 public class 에 입력) ↓
package utils;
public class printLoadingString {
String[] animation = {"|", "/", "-", "\\"};
int totalSeconds = 5; // 로딩을 5초 동안 진행
int interval = 100; // 0.1초마다 업데이트
int loops = totalSeconds * 1000 / interval; // 총 반복 횟수
try {
System.out.print("로딩 중... ");
for (int i = 0; i < loops; i++) {
System.out.print("\b" + animation[i % animation.length]); // \b(backspace - 바로 앞의 문자를 하나 지움)로 이전 문자 지우고, 애니메이션 출력
Thread.sleep(interval); // 잠시 대기
}
System.out.print("\b"); // 마지막 애니메이션 문자 지우기
System.out.println("완료! ✅"); // 완료 메시지 출력
} catch (InterruptedException e) {
System.err.println("로딩 중 오류가 발생했습니다: " + e.getMessage());
}
}
일단 결론 부터 말하자면,

main 매서드가 아닌 일반 public class에 입력하였을 경우, 에러 폭탄이 난다.
그렇다면 해결책은 뭘까?
간단하다.
▶ 필드 선언부에서 실행문을 안쓰면 된다 ㅋㅋ
일단 고쳐보자 ↓
package utils;
public class PrintLoadingString {
public void PrintLoadingString() {
String[] animation = {"|", "/", "-", "\\"};
int totalSeconds = 5; // 로딩을 5초 동안 진행
int interval = 100; // 0.1초마다 업데이트
int loops = totalSeconds * 1000 / interval; // 총 반복 횟수
try {
System.out.print("로딩 중... ");
for (int i = 0; i < loops; i++) {
System.out.print("\b" + animation[i % animation.length]); // \b(backspace - 바로 앞의 문자를 하나 지움)로 이전 문자 지우고, 애니메이션 출력
Thread.sleep(interval); // 잠시 대기
}
System.out.print("\b"); // 마지막 애니메이션 문자 지우기
System.out.println("완료! ✅"); // 완료 메시지 출력
} catch (InterruptedException e) {
System.err.println("로딩 중 오류가 발생했습니다: " + e.getMessage());
}
}
}
간단하게 말하자면, printLoadingString 매서드를 실행시켰을때, 이 코드가 작동하도록 하였다.

이렇게 하니, 역시나 에러도 해결되었다 ㅋㅋ
( 메서드에 있는 경고문(Method 'PrintLoadingString()' is never used)은 이 매서드 안사용했다고 말하는거다 )
하지만, 또 이런 생각이 들었다.
왜 main 매서드에서드는 필드 선언부에 실행문을 넣을 수 있을까?
단순히 main 매서드만의 혜택인건가?
▼
찾아보니 그렇다 ㅋㅋ main 매서드만의 혜택이다.
실행문에는 두가지가 있다. 초기화문과 말 그대로 실행문. ( 초기화문이란, " int num = 1; " 같은 걸 말함 )
즉, 일반 클래스 필드 선언부에는 초기화문 만 가능하고, 실행문은 불가능하다.
반면, main 매서드에서는 실행문과 초기화문 모두 가능하다. ( 뭐, 혜택이라고 생각했었는데, 결국은 매서드 내부에서 정의되는 거니까, 똑같은거 같다 ).
따라서, 다음 내용만 기억하면 되겠다.
즉, 일반 클래스 필드 선언부에는 "초기화문"만 가능하고, "실행문"은 불가능하다.
그럼 이만.
'Java' 카테고리의 다른 글
| 자바 - 자바 코드를 실행할 때, jvm, javac는 각각 뭘까? (0) | 2025.09.08 |
|---|---|
| 자바 - Exception - Checked, Unchecked 각각 의미 다시 제대로 정리하기 (1) | 2025.09.07 |
| 자바 - 콘솔에 로딩 중 구현하기 ( cmd에서 |/-\ 같은거!! ) (0) | 2025.09.05 |
| 자바 - Arrays.asList, List.of 매서드의 각각 의미와 기능, 차이 (0) | 2025.09.04 |
| 자바 - 스코프 (1) | 2025.08.31 |