Java/정리

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

콧등치기국수 2021. 8. 28. 19:41

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