본문 바로가기
Java/정리

[Java] Static 변수,메소드,싱글톤 패턴

by 콧등치기국수 2021. 8. 28.

static은 메모리에 한번 올려지면 어느 곳에서나 공통으로 사용이 가능하고, static메소드는 객체를 생성할 필요없이 클래스명.메소드명으로 사용가능하다고 알고 있었는데, JDBC를 공부하면서 나와서 확실히 공부해두고 싶어서 복습차 공부해보았다. 점프투자바 페이지에서 static을 설명한 걸 봤는데 첨 공부할때 보다 이해도도 높고 또 '아 맞다 이런 것도 있었지'하고 다시 생각나는 것들도 있어서 정리해두려 한다! (지금 셤공부도 해야하고 세미플젝도 해야하고 sqld시험준비도 해야하는데 넘 바쁘지만 static을 내가 쓴 게 아닌 다른 사람이 쓴 코드로 보면서 이해하니 너무 좋아서 정리하고싶어졌다...차근차근 해야지...쥬륵)

 

Static 변수


public class HousePark  {
    static String lastname = "박";	//String lastname = "박"

    public static void main(String[] args) {
        HousePark pey = new HousePark();
        HousePark pes = new HousePark();
    }
}

static 키워드를 붙이면 자바는 메모리 할당을 딱 한 번만 하게 되어 메모리 사용에서 이점을 볼 수 있다.

또한 static으로 설정하면 같은 곳의 메모리 주소만 참조하게 되기 때문에 staitc 변수의 값을 공유도 할 수 있다.

 

만약 위의 코드에서 lastname변수가 static 변수가 아니라면,

객체를 생성할 때마다 변수인 lastname을 메모리에 별도로 할당해주어야 할 것이다. 똑같은 값이 저장될 텐데도 말이다.

그래서 이렇게 변하지 않는 값의 경우 static을 사용하여 메모리의 이점을 얻을 수 있는 것이다.

 

보통 변수의 static키워드는 프로그래밍 시 메모리의 효율보다는 공유하기 위한 용도로 훨씬 더 많이 사용하게 된다고 한다. 

예전에 미니프로젝트를 할 때는 자바로만 gui를 이용해서 음식주문프로그램을 만들었는데 그때 로그인한 유저에 따라 주문목록을 만들어내기 위해서 지금 로그인된 유저의 id를 가져와야 했다. 그때 mainFrame에서 static변수인 loginUserId를 만들고, 로그인 시 사용자가 입력한 id를 loginUserId에 저장을 해서 주문하기, 주문목록보기, 리뷰 등에서 모두 같은 유저임을 확인할 수 있도록 했었다. 같은 팀이었던 실력자 분이 알려주셔서 유용하게 썼던 기억이 있어서 다시 찾아보았다. 아래에서 확인할 수 있다.

//MainFrame 클래스
public static String loginUserId;	//공유목적으로 static변수로 생성

//MemberSignInView클래스
MainFrame.loginUserId = id;		//로그인 성공시 사용자가 입력한id를 static변수에 저장

 

Static 메소드


static 메소드는 인스턴스 변수를 사용할 수 없다. 또한 인스턴스 메소드도 호출할 수 없다.

인스턴스 메소드는 static변수, 인스턴스 변수 모두 사용이 가능하다. 그리고  static메소드, 인스턴스 메소드 모두 호출할 수 있다.

  class TestClass2 {
      int iv;
      static int cv;

      void instanceMethod() { //인스턴스 메소드
          System.out.println(iv); // 인스턴스 변수를 사용할 수 있다.
          System.out.println(cv); //클래스 변수를 사용 할 수 있다.

     static void staticMethod() { //스태틱 메소드
          System.out.println(iv); // Error!! : 인스턴스 변수를 사용할 수 없다.
          System.out.println(cv); //클래스 변수를 사용 할 수 있다.
      }
  }

 

 

Singleton pattern(싱글톤 패턴)


 싱글톤 패턴은 단 하나의 객체만을 생성하게 강제하는 패턴이다.

 

아래 코드는 new를 이용하여 무수히 많은 객체를 생성한다면 싱글톤의 정의에 어긋나게 되므로 일단 외부클래스에서 new로 객체를 생성할 수 없도록 private키워드를 이용해서 막은 것이다. 

class Singleton {
    private Singleton() {
    }
}

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton = new Singleton();
    }
}

 

아래와 같이 one이라는 static변수를 두고, getInstance메소드에서 one값이 null인 경우에만 객체를 생성하도록 하면 one객체는 단 한번만 만들어지게 된다.

getInstance 메소드가 최초로 호출되면 one이 null이므로 new에 의해 객체가 생성이 된다.

이렇게 처음 생성된 one은 static변수이므로(메모리에 할당되어서 공유할 수 있으니까) 그 이후로 getInstance 메소드가 호출될 때 null이 아니게 된다. 따라서 이미 만들어진 싱글톤 객체인 one을 항상 리턴하게 된다!

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);
    }
}

 

 

 

출처 및 참고

https://wikidocs.net/228

https://velog.io/@withcolinsong/static%EB%A9%94%EC%86%8C%EB%93%9C%EC%99%80-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%A9%94%EC%86%8C%EB%93%9C