본문 바로가기

Programming/Java

[Java] static

  1. static: 정적이다. -> 클래스에 고정된 멤버로 클래스 멤버라 부름.
  2. 클래스에 고정된 멤버 -> 클래스 로더가 클래스를 로딩하면 메모리에 할당시켜 클래스 로딩이 끝나면 바로 사용 가능
  3. 전역적으로 쉽게 재사용하는 멤버나, 변하지 않는 변수/메서드를 사용할 쓰임 -> 만들어놓고 클래스 호출이나 객체 생성을 따로 필요없이 바로바로 사용 가능
  4. 메모리 자원을 할당해놓고 사용 -> 너무 많이 사용하면 메모리를 많이 차지하게 되어 프로그램이 무거워짐.

static 필드 사용 예시로, 

 

class Number {
    static int num1 = 0;  // 클래스 필드
    int num2 = 0; // 인스턴스 필드
}
public class Main {
    public static void main(String[] args) {
        Number number1 = new Number();  // 첫 번째 Number
        Number number2 = new Number();  // 두 번째 Number

        number1.num1++;  // 클래스 필드 num1을 +1 증가시킴
        number1.num2++;  // 인스턴스 필드 num2를 +1 증가시킴  -> 두번째 Number 클래스 객체인 number2로 접근 시 결과 반영 X

        System.out.println("두번째 Number의 인스턴스 필드 num1 :" + number2.num1);
        System.out.println("두번째 Number의 인스턴스 필드 num2 :" + number2.num2);
    }
}

 

첫 번째 Number의 인스턴스 필드 num1 :1
두 번째 Number의 인스턴스 필드 num2 :0

 

number1.num2++;로 number1 인스턴스로 접근해서 num2를 직접 +1 시켰으면서 number1.num2를 했을 때 static을 안 썼는데? 왜 +가 됐지? 라는 멍청했던 실수때문에 정리해봤다. 

 

static 메소드 사용 예시로는,

 

class Test {
    static void test1() {  // 클래스 메소드
        System.out.println("test static");
    }
    void test2() {
        System.out.println("test static");
    }
}
public class Main {
    public static void main(String[] args) {
        System.out.println("static(클래스) 메소드 test1() 호출");
        Test.test1();  // 인스턴스를 생성하지 않고 호출 가능
        System.out.println();

        Test test = new Test();  // 인스턴스 생성
        System.out.println("인스턴스 메소드 test2() 호출");
        test.test2();  // 인스턴스를 생성해야만 호출 가능
    }
}

 

static(클래스) 메소드 test1() 호출
test static

인스턴스 메소드 test2() 호출
test static