static

김명래·2022년 9월 8일
0

OOP

목록 보기
4/4

static 이란 무엇인가 ?

static 은 변수나 메소드 키워드에 사용된다.

  • 프로그램 실행시에 할당되고 종료시에 해제된다.

  • 일반적으로 우리가 만든 class 는 Static 영역에 생성이되고 객체 생성시에 heap 영역에 할당이 된다.

  • static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성이 된다. 즉, 객체생성 없이 바로 사용가능하다.

  • GC가 관리하지 않는다. 따라서 남용할시에 시스템 퍼포먼스에 악영향을 줄 수 있다.

  • 스태틱 메소드 안에서는 객체변수 접근이 불가능 하다.

static 의 사용이유

package encapsualtion;

class LeeHouse{
	private String name = "EasyAn";
	public String address;
}

class WestHouse{
	private String name = "Genius";
	public String address;
}
class HanHouse{
	private String name ="LongMin";
	public String address;
}

public class staticExample {	
	public static void main(String[] args) {		
		WestHouse w = new WestHouse();
		w.address = "인천시 어딘가";
		WestHouse w2 = new WestHouse();
		w.address = "서울시 어딘가";
		
		
	}
}

영재형이 집을 하나 당첨되고 또 하나 당첨되었다

이때 영재형에 집 정보를 가지고있는 객체를 하나 더 생성하여 그 집에대한 주소를 넣어주었는다.

별 문제없는 코드지만 w 와 w2 객체가 가지고있는 name값이 같아야 하지만 서로 달라질수 있다.

이렇게 항상 변하지 않는경우라면 static 키워드를 사용해서 메모리의 이점을 가져올 수 있다.

package encapsualtion;

class LeeHouse{
	public static String name = "EasyAn";
	public String address;
}

class WestHouse{
	public static String name = "Genius";
	public String address;
}
class HanHouse{
	public static String name ="LongMin";
	public String address;
}

public class staticExample {	
	public static void main(String[] args) {		
		WestHouse w = new WestHouse();		
		WestHouse w2 = new WestHouse();
		w.address = "인천시 어딘가";
		w2.address = "서울시 어딘가";				
	}
}

이렇게 사용하면 name 필드는 메모리에 단 한번만 할당하기 때문에 메모리 사용 이점을 가져올 수 있다.

또한 static을 사용하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유할 수있다.

package encapsualtion;

class LeeHouse{
	public static String name = "EasyAn";
	public String address;
}

class WestHouse{
	public static String name = "Genius";
	public String address;
}
class HanHouse{
	public static String name ="LongMin";
	public String address;
}

public class staticExample {	
	public static void main(String[] args) {		
		WestHouse w = new WestHouse();		
		WestHouse w2 = new WestHouse();
		w.address = "인천시 어딘가";
		w2.address = "서울시 어딘가";			
		w.name = "MyeongRae";
		
		System.out.println(w.name);
		System.out.println(w2.name);
	}
}
//////출력값 
MyeongRae
MyeongRae

싱글톤 패턴 (singleton pattern)

static을 응용한 디자인패턴중 싱글톤 패턴에 대해 알아보자.

어떨때 사용하는가 ?

package encapsualtion;

class EasyAn{
	public String name = "EasyAn";
	public String address = "서울시 어딘가";
	public String phone = "010-1231-1234";
	public String birthDay = "99xxxx";
}

class Genius{
	public String name = "Genius";
	public String address = "인천시 어딘가";
	public String phone = "010-1231-1234";
	public String birthDay = "90xxxx";
}
class LongMin{
	public String name ="LongMin";
	public String address = "서울시 어딘가";
	public String phone = "010-1231-1234";
	public String birthDay = "97xxxx";
}

public class staticExample {	
	public static void main(String[] args) {		
		EasyAn easyAn = new EasyAn();
		
	}
}

new 키워드를 사용해 easyAn 이라는 객체를 만들어냈다. 이는 단 한명만 존재해야하는 사람을 여러명만들어 낼수있다는것 굉장히 큰 문제이다.

이때 우리는 싱글톤 패턴을 이용하여 new 키워드를 제한하고 하나의 객체만 사용하도록 제한할 수 있다.

package encapsualtion;

class LongMin{
	private static LongMin hanLongMin;
	
	private LongMin() { 		
	}
	
	public static LongMin getInstance() {
		if(hanLongMin == null) {
			hanLongMin = new LongMin();			
		}
		return hanLongMin;
	}
	
	public String name ="LongMin";
	public String address = "서울시 어딘가";
	public String phone = "010-1231-1234";
	public String birthDay = "97xxxx";
}

public class staticExample {	
	public static void main(String[] args) {		
		
		LongMin h1 = LongMin.getInstance();
		LongMin h2 = LongMin.getInstance();
		
	}
}

순서대로 살펴보자 먼저 생성자를 private 접근제한자로 지정해주면서 new keyword를 사용할 수 없게 만들었다.

그 이후 필드에 hanLongMin이라는 변수를 static 메모리에 할당하였다.

getInstance() 를 사용할 때 hanLongMin 변수에 할당된것이 없으면 생성자를 통해 객체를 Heap 에 할당했고 이후에 hanLongMin 이라는 객체를 반환한다.

따라서 LongMin class 사용하기 위해서는 getInstance를 사용할 수 밖에 없다.

profile
독자보다 필자를 위해 포스팅합니다

0개의 댓글