본문 바로가기
Application/Java

[Jump2Java] 07장 정적 변수와 메소드 (static)

by 윤루트 2021. 9. 16.

static 변수

  • 값이 변하지 않는 경우라면 static 사용 시 메모리의 이점을 얻을 수 있다.
public class HousePark  {
    // 변경 전: String lastname = "박";
		static String lastname = "박";

    public static void main(String[] args) {
        HousePark pey = new HousePark();
        HousePark pes = new HousePark();
    }
}
  • lastname 변수에 static 키워드를 붙인다.
  • 자바는 메모리 할당을 딱 한번만 하게 되어 메모리 사용에 이점을 볼 수 있게된다.
  • 만약 lastname 값이 변경되지 않기를 바란다면 static 키워드 앞에 final이라는 키워드를 붙인다.
    • final 키워드는 한 번 설정되면 그 값을 변경하지 못하게 하는 기능이 있다.
    • 변경하려고 하면 예외가 발생한다.
  • static의 공유의 개념
    • static 으로 설정하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유하게 된다.
public class Counter  {
    // 변경 전: int count = 0;
		static int count = 0;
    Counter() {
        this.count++;
        System.out.println(this.count);
    }

    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
    }
}

/*
변경 전 출력 결과
1
1

변경 후 출력 결과
1
2
*/
  • 위의 예시처럼 static 키워드는 공유하기 위한 용도로 자주 쓰인다.

static method

  • static이라는 키워드가 메소드 앞에 붙은 것
public class Counter  {
    static int count = 0;
    Counter() {
        this.count++;
    }

    public static int getCount() {
        return count;
    }

    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();

        System.out.println(Counter.getCount());
    }
}

// 출력 결과: 2
  • main 메소드에서 getCount() 메소드는 Counter.getCount() 와 같이 클래스를 통해 호출할 수 있게 된다.
  • static 메소드 안에서는 인스턴스 변수 접근이 불가능하다.
    • count는 static 변수이기 때문에 static 메소드에서 접근이 가능하다.

Singleton Pattern

  • 디자인 패턴 중 하나로, 단 하나의 객체만을 생성하게 강제하는 패턴이다.
  • 즉, 클래스를 통해 생성할 수 있는 객체는 한 개만 되도록 만든다.
class Singleton {
    private static Singleton one;
    private Singleton() {
    }

    public static Singleton getInstance() {
        if(one==null) {
            one = new Singleton();
        }
        return one;
    }
}

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton1 == singleton2);
    }
}

// 출력 결과: true
  • Singleton 클래스에 one 이라는 static 변수를 둔다.
  • getInstance 메소드에서 one 값이 null 인 경우에만 객체를 생성하도록 한다.
    • one 객체가 단 한 번만 만들어진다.
  • getInstance 메소드의 동작 원리
    • 최초 getInstance가 호출되면 one이 null이므로 new에 의해서 객체가 생성이 된다.
    • 이렇게 한 번 생성되면 one은 static 변수이기 때문에 그 이후로는 null이 아니게 된다.
    • 이후에 다시 getInstance 메소드가 호출되면 이제 one은 null이 아니므로 이미 만들어진 singleton 객체인 one을 항상 리턴하게 된다.
  • main에서 최초로 호출된 singleton1 과 이후 호출된 singleton2 가 같은지 출력한다.
    • 결과가 true이므로 같은 객체임을 확인한다.

'Application > Java' 카테고리의 다른 글

[Jump2Java] 07장 쓰레드  (0) 2021.09.16
[Jump2Java] 07장 예외 처리  (0) 2021.09.16
[Jump2Java] 07장 접근 제어자  (0) 2021.09.16
[Jump2Java] 06장 입출력 01  (0) 2021.09.15
[Jump2Java] 05장 객체지향 프로그래밍 06  (0) 2021.09.14

댓글