╱╱╭╮╱╱╱╱╱╱╭━━━╮╱╱╱╭╮╱╭╮╱╱╱╱╱╱ ╱╱┃┃╱╱╱╱╱╱┃╭━╮┃╱╱╱┃┃╱┃┃╱╱╱╱╱╱ ╱╱┃┣━━┳━━╮┃┃╱┃┣━╮╱┃╰━╯┣━━┳━╮╱ ╭╮┃┃╭╮┃┃━┫┃╰━╯┃╭╮╮┃╭━╮┃╭╮┃╭╮╮ ┃╰╯┃╭╮┃┃━┫┃╭━╮┃┃┃┃┃┃╱┃┃╭╮┃┃┃┃ ╰━━┻╯╰┻━━╯╰╯╱╰┻╯╰╯╰╯╱╰┻╯╰┻╯╰╯

Java/Java 기초

[Java] 스태틱, 싱글톤 패턴 (static, singleton pattern)

재안안 2022. 4. 18. 04:22

이번에는 static 키워드에 대해 알아볼 것이다.

static은 간단한 개념이지만 매우 유용하게도 활용된다.

이번 포스트에서 알아볼 개념들은 아래와 같다.

 

  • static
  • singleton pattern

 

우선 스태틱(static)이란?

 

motionless와 같은 뜻이다. '정적인' 이라는 뜻이고

풀이는 아래와 같다.

static:

lacking in movement, action, or change, especially in a way viewed as undesirable or uninteresting.

줄이면 "standing or fixed in one place"

 

자바에서 static은 키워드이며 객체를 전역으로 선언하고 싶을 때 사용한다.

 

객체를 전역으로 선언한다는 말은 객체를 메모리의 Stack 영역에 선언한다는 것을 뜻한다.

 

메모리는 여러가지 영역으로 나누어진다.

  • Text
  • Data
  • Heap
  • Stack

 

자바에서 객체는 메모리의 heap영역에 생성된다. (new 연산자)

heap 영역에 생성된 객체들은 객체의 사용 여부에 따라 Garbage Collector에 의해 자동으로 삭제된다.

이를 동적할당이라고하며 이는 메모리 관리의 이점이 있다.

 

반면 Stack의 영역에 생성된 객체는 프로그램이 종료시 까지 삭제되지 않는다. (class 정의)

stack 영역에는 하나의 객체가 생성되면 프로그램이 끝날 때까지 변하지 않는 주소 값을 가진다.

이는 접근의 편의성에 대한 이점이 있다.

 

static을 사용하면 메모리 활용의 이점이 있을 수도 있다.

하지만 stack 영역은 Garbage Collector가 관리하지 않아 남발하면 오히려 메모리를 차지한다.

 

실제로 stack 영역의 객체는 단 하나의 주소값을 갖고있어 어디서든 접근이 가능하다.

이처럼 객체를 모두가 공유해서 사용하고 싶을 때 stack 영역에 생성한다.

 

그럼이제 static 키워드에 대해 알아보겠다.

 

static 키워드를 사용해 객체를 stack영역에 생성한다.

사용형식은 객체 생성시 static 키워드를 붙여주는 것이다.

 

아래의 예제를 통해 설명하겠다.

 

static 키워드 사용 예제

  • DifferentClass가 정의 되었다.
  • num, num2가 생성 되었다.
  • printHi(), printJI()가 정의 되었다.

 

static 키워드는 해당 예제와 같이 객체 생성시 앞에 붙이기만 하면 된다.

 

그럼 이제 어디서든 접근의 용이를 보여주겠다.

 

main 클래스와 실행결과

  • 분명 인스턴스 없이 실행되었다.
  • static이 아니면 인스턴스를 만들어야 접근이 가능하다.

 

모든 Class는 stack 영역에 정의된다. (instance는 heap 영역이다)

이미 stack의 영역에 정의되어 있기에 인스턴스 없이 주소를 통해 접근이 가능한 것이다.

Class 정의는 stack 영역에 저장되있다는 것을 기억하자.

 

이와 같이 stack의 영역을 이용하면 단 한번만 생성해서 계속 쓸 수 있다.

 

위의 정리를 활용해 또 다른 개념을 알아보자.

 

 

  • 싱글톤 패턴(singleton pattern)

 

싱글톤 패턴이란?

 

디자인 용어라고한다.

 

자바에서는 "단 하나의 인스턴스를 만들어서 모두 공유하는 것"이다.

 

예제를 통해 설명하겠다.

 

singletone pattern 예제

  • SingletonEx가 정의되었다.
  • 참조변수 unique는 stack 영역에 생성되었다.
  • SingletonEx의 생성자는 private이므로 다른 클래스에서 호출될 수 없다.
  • getInstance() 또한 stack 영역에 생성되었다.
  • 대신 getInstance()를 통해 한번만 생성후 나머지는 인스턴스의 주소값을 반환한다.

 

SingletonEx는 생성자가 숨겨져있어 다른 클래스에서는 인스턴스를 생성할 수 없다.

그런데 SingletonEx는 하나의 인스턴스를 허용하는데 이는 참조변수 unique를 통한 방법이다.

getInstance 메소드를 통해 단 하나의 인스턴스를 만들고 참조한다.

 

이렇게 Singleton Pattern을 사용할 경우

단 하나의 인스턴스만을 허용하기 때문에 용도에 따라 메모리 낭비를 방지 할 수 있다.

또한 경우에 따라서 단 하나의 인스턴스만 허용하고 싶을 때 사용할 수 있다.