Java - static(정적) 변수와 메소드

mil nil·2022년 11월 30일
0

static

  • Java에서 static 키워드를 사용하는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미한다.
  • static으로 선언된 메서드나 변수는 자바 버추얼 머신에서 인스턴스 객체의 생성 없이 호출(사용)을 할 수 있다.
  • 자바 프로그램을 실행하면 static으로 지정된 메서드를 찾아서 먼저 메모리에 할당시킨다.
  • static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있지만 GC(Garbarge Collector)의 관리 영역 밖에 존재한다.
  • 따라서 프로그램 종료 시까지 메모리가 할당된 채로 존재하기 때문에 static을 너무 많이 사용하는 것도 성능상 좋지 않다.

static 변수의 장점 - 메모리 절약

static을 사용하면 고정된 메모리 위치를 객체 생성 이전에 할당하게 된다.

static을 사용하지 않고 객체를 생성하는 경우 객체 생성시마다 메모리를 할당 해줘야 한다.

class World {
    String myWorld = "MyWorld";
}
public class Main {
    public static void main(String[]args){
        //World 객체를 2번 생성, 생성할 때마다 메모리를 할당해야 함
        World world1 = new World();
        World world2 = new World();
    }
}

static을 사용하는 경우 객체 생성이 몇 번 이더라도 static 영역에서의 메모리 할당은 한 번만 진행되게 된다. 따라서 메모리 공간을 아낄 수 있는 이점이 있다.

class World {
    final static String myWorld = "MyWorld";
}
public class Main {
    public static void main(String[]args){
        //World 객체를 2번 생성, 메모리는 static 영역에서 한 번만 할당
        World world1 = new World();
        World world2 = new World();
    }
}

final 키워드는 한 번 설정되면 그 값을 변경할 수 없다.

static 변수의 장점 - 공유(더 중요)

아래와 같은 코드를 실행하게 되면

class World {
    int Year = 0;
    World() {
        this.Year++;
        System.out.println(this.Year);
    }
}
public class Main {
    public static void main(String[]args){
        //World 객체를 2번 생성, 각각의 메모리를 가지고 있음
        World year1 = new World();
        World year2 = new World();
    }
}

아래와 같은 값을 가진다. 두 객체가 서로 다른 메모리에 할당되어 있기 때문이다.

1
1

하지만 static을 사용하면 값을 같은 메모리에서 공유하게 되므로

class World {
    static int Year = 0;
    World() {
        Year++; // count는 더이상 객체변수가 아니므로 this를 제거
        System.out.println(Year); // this 제거
    }
}
public class Main {
    public static void main(String[]args){
        //World 객체를 2번 생성, 각각의 메모리를 가지고 있음
        World year1 = new World();
        World year2 = new World();
    }
}

아래처럼 +된 값을 가지게 된다.

1
2

static 변수는 메모리 절약 보다는 주로 공유의 목적으로 사용한다.

static 메소드

static 메소드 안에는 객체 변수의 접근이 불가능하다. 그 이유는 메모리의 static 변수나 메소드는 동적으로 메모리를 할당하는 시점보다 먼저 메모리에 잡히게 된다. 따라서 자신보다 나중에 메모리에 할당되는 멤버 변수나 메소드는 언제 할당되었는지 알 수 없어 할당이 불가능하다.

class World {
    static int year = 0;
    int month = 0;
    World() {
    }

    public static int getYear() {
        //retrun month; 객체 변수는 호출이 불가능함
        return ++year;
    }

    public int getMonth() {
        this.month++;
        return month;
    }
}

public class Main {
    public static void main(String[]args){
        World month1 = new World();
        World month2 = new World();

        System.out.println(month1.getMonth());
        System.out.println(month2.getMonth());
        System.out.println(World.getYear()); // static 메소드는 객체 생성 없이 클래스를 이용하여 호출
        System.out.println(World.getYear());
        System.out.println(World.getYear());

    }
}

실행 결과

1
1
1
2
3

static 블럭을 사용한 예시를 통해 더 확실히 알 수 있다.

class World {
    static int year = 2022;
    World() {
    }

    public static int getYear() {
        //retrun month; 객체 변수는 호출이 불가능함
        return ++year;
    }

    public static String STATIC_MESSAGE = "The New Year Coming soon";

    static {
        System.out.println("Good Bye");
        System.out.println(year + "년");
    }
}

public class Main {
    public static void main(String[]args){
        String staticMessage = World.STATIC_MESSAGE;
        
        System.out.println("Hello");
        System.out.println(World.getYear() + "년");
        System.out.println(staticMessage);
    }
}

실행 결과

Good Bye
2022Hello
2023The New Year Coming soon

static의 경우 가장 먼저 할당되고 작동되는 것을 알 수 있다.

profile
자바 배우는 사람

0개의 댓글