[Java/자바] Static (정적멤버와 Static), Singletone (싱글톤)

sbj·2023년 12월 4일

Java

목록 보기
12/15
post-thumbnail

1. 정적 멤버와 Static

Static은 정적, 즉 ‘고정된’ 이란 의미이다. 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드(정적필드)와 메소드(정적 메소드)를 의미한다.


1.2. The static Fields (Or Class Variables) 정적 멤버, 클래스 변수

정적 필드와 정적 메소드를 선언하려면 → static 키워드를 추가적으로 붙이면 된다.

public class Friend {
	static int numberOfFriends; //static fields (정적필드)
}

정적 필드, 정적 메소드는 → 클래스에 고정된 멤버이므로 클래스 로더가 클래스를 로딩해서 메모리 영역에 적재할 때 클래스 단위로 관리된다. 따라서, 클래스 로딩이 끝나면 바로 사용할 수 있다.


1.3. When we use static? 그래서 언제 static을 사용하는가?

필드

객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언하고, 객체마다 가지고 있을 필요가 없는 공용데이터라면 Static 으로 선언하는 것이 적절하다.

메소드

인스턴스 필드를 포함하고 있다면 인스턴스 메소드로 선언하고, 인스턴스 필드를 포함하고 있지 않다면 Static메소드로 선언한다.


1.4. Static 사용 시 주의할 점

객체가 없어도 실행된다는 특징 때문에 정적 메소드를 선언할 때, 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다. 또한, 객체 자신의 참조인 this키워드도 사용이 불가능하다.

그럼, 정적 메소드에서 인스턴스 멤버를 사용하고 싶다면? → 객체를 먼저 생성하고 참조 변수로 접근해야 한다.

main() 메소드에서도 동일한 규칙이 적용된다.
public static void main(String[] args) {

메인 메소드도 정적 메소드이므로 인스턴스 필드와 인스턴스 메소드를 main() 메소드 내에서 바로 사용할 수 없다.

public class Main {
	public static void main(String[] args) {

		// Static = modifier. A single copy of a variable/method is created and shared.
		Friend friend = new Friend();
		friend.name = "수빈";
		friend.hello();
	}
}
public class Friend {
	String name;

	void hello() {
		System.out.println("Hello " + name);
	}

}
#Output
Hello 수빈

2. Singleton (싱글톤)

단 하나의 객체만 만들도록 보장한다.

싱글톤 조건

  1. 생성자 앞에 private접근 제한자를 붙여준다.
  2. 싱글톤 (자기 자신)의 객체를 리턴하는 정적 메소드를 선언하고, 자신의 객체를 생성해 초기화한다.

2.1 싱글톤 목적?

주 목적

  1. 싱글톤의 주 목적은 객체 생성의 수를 단 하나로 제한하는 것이다. 싱글톤을 통해 소켓이나 DB 연결에 대한 접근 제어가 보장되는 경우가 많다.
  2. 인스턴스 생성이 제한되므로, 메모리 공간 낭비가 발생하지 않는다.

2-2. 싱글톤 Code Examples

class Singleton {

	private static Singleton single_instance = null;

	public String s;

	// Constructor -> Privat 생성자. 이 클래스 자체로 제한되어있다.
	private Singleton() {
		s = "I'm 싱글톤";
	}

	// Static 메소드 -> 싱글톤 클래스의 인스턴스 생성
	public static synchronized Singleton getInstance() {
		if (single_instance == null)
			single_instance = new Singleton();
		return single_instance;
	}
}

public class Main {

	public static void main(String[] args) {
		Singleton x = Singleton.getInstance();
		Singleton y = Singleton.getInstance();
		Singleton z = Singleton.getInstance();

		System.out.println("X is: " + x.hashCode());
		System.out.println("Y is: " + y.hashCode());
	}

}

Summary

나는 항상 뭔가를 배울 때 왜 이걸 왜, 언제 사용하는지가 궁금하다. 그래야 적재적소에 활용을 할 수 있으니까..

Static

객체를 생성하지 않고 사용할 수 있는 필드와 메소드이다.

객체가 공통으로 가지고 있는 공용데이터라면 static으로 선언한다.

Singleton

단 하나의 객체만 만들도록 한다.

  1. private 접근제한자를 붙여주고
  2. 자기 자신을 리턴하는 static 메소드를 선언한다.
  3. 소켓이나, DB 연결에 대한 접근 제어를 보장할 수 있다.
profile
Strong men believe in cause and effect.

0개의 댓글