자바 static 메소드 | 자바 입문강좌 15

자바 static 메소드

static 변수는 클래스와 인스턴스가 공유하는 변수라고 했습니다. 비슷하게 static 메소드도 있습니다.

마찬가지로 인스턴스를 생성하지 않아도 static 메소드를 사용할 수 있습니다. 인스턴스가 없으니 클래스이름을 사용합니다.

public class Main {
    public static void main(String[] args) {
        myStatic.showInfo();
        myStatic.count++;
        myStatic.showInfo();
    }
}
class myStatic{
    static int count = 0;
    public static void showInfo(){
        System.out.println("count is :" + count);
    }
}

그런데 static 메소드는 익숙해보이죠? 바로 public static void main() 함수에 들어갔습니다.

자바의 main 함수는 특별한 위치를 가지고 있으나 static 메소드의 성질을 지녔다는 부분은 눈여겨 볼만합니다. main 함수도 역시 인스턴스를 만들어서 사용하는게 아니죠. 그래서 static 으로 명시한 것 입니다.

자바 static 메소드
자바 static 메소드

static void main 의 뜻(이제서야)

만약 static 을 제외하고 main 을 실행시키려고 하면 아래와 같은 메시지가 나옵니다. 딱 정해진대로만 사용할 수 있다고 합니다.

C언어도 main이 간단한데 자바에서 왜 이렇게 길게 쓰는지 몰랐다면 이제 알 수 있습니다. 인스턴스 없이 사용할 수 있기 때문입니다.

Error: Main method is not static in class com.kay.Main, please define the main method as:
   public static void main(String[] args)

private static 변수와 사용

static 변수가 private 일때의 사용방식이기도 합니다.

private static 변수라면 getter 와 setter 를 사용해야 합니다. 인스턴스를 생성하지 않아도 클래스에서 사용할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        System.out.println(myStatic.getCount());
        myStatic.setCount(10);
        System.out.println(myStatic.getCount());
        
        myStatic m1 = new myStatic();
        m1.setCount(20);
        System.out.println(m1.getCount());
    }
}
class myStatic{
    public static int getCount() {
        return count;
    }
    public static void setCount(int count) {
        myStatic.count = count;
    }
    private static int count = 0;
}

인스턴스 변수

클래스 메서드 내부에서 인스턴스 변수를 사용할 수 없습니다. 이게 이제 좀 헷갈립니다.

public class Main {
    public static void main(String[] args) {
        myStatic.showName();
    }
}
class myStatic{
    private static int count = 0;
    String name;

    public static void showName(){
        System.out.println(this.name); // 사용할 수 없다. 오류발생
    }
}

위의 코드에서 String name 은 멤버 변수입니다. 멤버변수는 인스턴스가 생성되어야 사용할 수 있습니다. static 메소드는 클래스가 선언하는 시점 즉, 프로그램이 메모리에 로드되는 시점에 사용가능하게 되지만 인스턴스는 컴파일러가 언제 실행시킬지 알 수 없기 때문에 멤버변수의 사용은 불가합니다.

클래스 메소드에서 사용할 수 있는 변수는 지역변수(local variable)와 클래스변수(static 변수) 입니다.

요약

자바 static 메소드에 대해 알아봤습니다. 아이디어는 심플합니다. static 변수와 static 메모드를 클래스와 인스턴스의 관계에서 구분할 수 있다면 충분합니다.

외부참조문서

자바 static 메서드와 변수 | 자바 강좌 5-8

자바 static 메소드 / Static methods vs Instance methods in Java – GeeksforGeeks

Leave a Comment