티스토리 뷰

제목그대로다.

'클래스 본문(필드 선언부)에는 실행문 못씀!!' 

( 여기서말하는 실행문이란, "초기화문"이 아닌, 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 매서드에서는 실행문과 초기화문 모두 가능하다. ( 뭐, 혜택이라고 생각했었는데, 결국은 매서드 내부에서 정의되는 거니까, 똑같은거 같다 ).

 

따라서, 다음 내용만 기억하면 되겠다.

즉, 일반 클래스 필드 선언부에는 "초기화문"만 가능하고, "실행문"은 불가능하다.

 

그럼 이만.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함