2022. 6. 26. 15:24ㆍProgramming/Java
김영한 강사님의 스프링 강의의 싱글톤 부분을 듣던 도중 static에 대한 지식이 부족해서 공부하면서 적어보려고 한다. 기본을 채우기 위해 공부하며 채워 넣고자 한다.
static이란?
public static void main(String [] args){} 우리가 자바를 시작하면 바로 처음 보는 코드이다. 사전적 의미의 static은 (변화 움직임 없이) 고정된, 고정적인 이라는 뜻을 가지고 있다. 그럼 java에서 static이란 무엇일까?
클래스, 메서드, 필드명에서 보이는 이 static은 해당 대상을 객체를 만들 때마다 생성이 되고 사용이 되는 것이 아닌 클래스, 즉 설계도에만 지정된 상태로 만들어 준다. 따라서 해당 클래스에서 static으로 지정된 자원은 객체의 생성에 따라 무한정 생성이 되는 자원이 아닌 쓰고 반납하는 등의 공유하는 하나의 자원이 된다.
- 변수나 메서드 혹은 클래스에 사용이 된다
- static을 사용 시 선언한 자원은 클래스가 메모리로 올라갈 때 자동으로 생성, 객체의 생성 없이 사용 가능
static의 사용 이유
- 효율 증가를 위해
- 변하지 않는 일정한 값 / 설정 정보는 매번 생성하는 것보단 전역으로 생성하여 사용 시 효율을 높일 수 있다
- 공통으로 사용되는 데이터를 관리할 때 사용
- 다만 static의 경우 인스턴스가 생성이 될 때 생성이 되는 것이 아닌 클래스가 올라사는 순간부터 메모리 공간에 자동적으로 생성이 되면서 자원을 소모하기에 무분별한 사용은 좋지 않다.
@Test
@DisplayName("Spring 없는 순수한 DI 컨테이너")
void pureContainer() {
AppConfig appConfig = new AppConfig();
//1. 조회 : 호출할 때 마다 객체를 생성
MemberService memberService1 = appConfig.memberService();
//2. 조회 : 호출 할 때 마다 객체를 생성
MemberService memberService2 = appConfig.memberService();
// 참조값이 다른걸 확인
System.out.println("memberService1 = " + memberService1);
System.out.println("memberService2 = " + memberService2);
// memberService1 =! memberService2
assertThat(memberService1).isNotSameAs(memberService2);
}
@Test
@DisplayName("싱글톤 패턴을 적용한 객체 사용")
void singletonServiceTest() {
SingletonService singletonService1 = SingletonService.getInstance();
SingletonService singletonService2 = SingletonService.getInstance();
System.out.println("singletonService1 = " + singletonService1);
System.out.println("singletonService2 = " + singletonService2);
// same == : 즉 주소의 값을 비교
// equal : 객체의 내용을 비교, 즉 서로 저장이 된 메모리가 달라도 값이 같으면 True 출력
assertThat(singletonService1).isSameAs(singletonService2);
}
해당 코드는 김영한 강사님의 학습과정 중의 코드를 가져온 것이다. static을 사용하여 싱글톤을 통한 test 메서드와 기존 객체를 반복하며 생성하는 메서드를 가져왔다. static을 활용하여 생성한 메서드의 결과 해당 값의 주소를 가져와서 그 값이 동일함을 알 수 있다.
이는 싱글톤 패턴이 static지정자를 사용해서 하나의 객체를 주고받으면서 사용했다는 것을 알 수 있다.
static / instance의 차이
static | instance |
메모리에 지정이 되어 사용 - 객체간의 호출 및 수정에 영향을 받지않는다 |
객체가 생성이 되면 같이 생성 - 객체 각각에 값을 지정하여 저장가능 |
메서드의 경우 호출이 될 때, 메모리에 미리 생성이 되어 따로 생성자를 호출하지않고도 사용이 가능하다. | 객체를 생성하면 그 순간 사용이 될 수 있기에 따로 new 연산자를 통해 객체를 생성해야 함수를 호출 할 수 있다. |
static 함수에는 static 변수만 사용가능 |
정리
- 공통적으로 사용하는 부분은 static으로 선언
- 이는 자원의 효율적 사용에 관여
- static이 붙은 변수, 메서드는 객체를 생성하지 않아도 사용 가능
- static 메서드는 static 변수만 사용 가능
'Programming > Java' 카테고리의 다른 글
[Java] Stream이란? (0) | 2022.11.15 |
---|---|
[Java] 객체지향 (0) | 2022.11.14 |
[Java] 자바의 추상 클래스 & 인터페이스 정리 / 상속 (0) | 2022.03.29 |
[ORM - JPA] JPA를 고른 이유 (0) | 2022.03.13 |
[IntelliJ] 단축키 (0) | 2022.03.11 |