인프런 커뮤니티 질문&답변

JPMogan님의 프로필 이미지
JPMogan

작성한 질문수

스프링 핵심 원리 - 기본편

회원 도메인 개발

MemoryMemberRepository , line number 7

작성

·

1.4K

13

안녕하세요, 강의 너무 감사히 잘 듣고있습니다

질문있는데요

MemoryMemberRepository , line number 7 에서요

hashmap을 static으로 선언 하신 이유가 무엇인가요?

답변 5

37

안녕하세요. JPMogan님, 공식 서포터즈 codesweaver 입니다.
.

클래스와 인스턴스

우리가 'new MemberRepository()' 와 같은 코드를 작성하면 애플리케이션은 'MemberRepository 클래스'를 참조하여 'MemberRepository 인스턴스'를 만들게 됩니다. 인스턴스를 만든다는 것은 클래스의 정보를 기반으로 메모리에 새로운 객체를 만든다는 의미입니다. 예를들면, 클래스는 붕어빵 틀에 인스턴스는 붕어빵에 비유할 수 있습니다. 붕어빵 틀을 이용하여 붕어빵을 만들수 있지만 붕어빵 틀과 붕어빵은 서로 다른것처럼요.

클래스는 필드(멤버변수)와 메서드를 가질 수 있습니다.  그리고 필드와 메서드에는 static 키워드를 붙일 수 있습니다. static 이 붙은 필드나 메서드는, '인스턴스의 소유'가 아닌, '클래스의 소유'가 됩니다. 

.

클래스 소유의 뜻

클래스의 소유라는 뜻은, 어떤 클래스를 가지고 인스턴스를 무한히 생성한다 하더라도 static 이 붙은 필드와 메서드는 클래스에 단 하나 존재한다는 뜻입니다. 왜냐하면 애플리케이션 전체에서 클래스는 단 하나만 존재하기 때문입니다. 우리는 클래스를 가지고 무한개의 인스턴스를 생성할 수는 있지만, 클래스가 단 한개 뿐이라는 사실은 어떻게 할 수 없습니다. (붕어빵을 100만개 찍어내도 붕어빵 틀은 하나!)

.

static의 특징

static 은 non static에 접근할 수 없다

static은 재미있는 특징을 갖고 있습니다. 인스턴스들은 static 에 접근할 수 있지만. static은 인스턴트에 접근할 수 없다는 특징을 갖습니다. 이는 static과 static이 아닌 것들(non static)이 메모리에 로드되는 시점의 차이 떄문에 발생합니다.

static 이 붙은 필드와 메서드는 애플리케이션이 시작됨과 동시에 메모리에 생성됩니다. 그러나 non static은 애플리케이션이 실행되다가 new 키워드를 만나는 순간 비로소 메모리에 생성됩니다. 만약 static이 non static에 접근하려고 하면, non static이 아직 메모리에 생성되지 않은 시점일 수 있습니다. 그렇게 되면 NullPointerException이 발생하게 되죠. 그래서 자바에서는 static에서 non static에 접근 할 수 없도록 문법 차원에서 막고 있습니다.

.

static은 new 로 생성하지 않아도 사용할 수 있다

앞서 말씀드린 특징과 관련된 특징입니다. static은 애플리케이션이 시작됨과 동시에 메모리에 생성된다고 설명드렸습니다. 그래서 클라이언트가 new 키워드를 사용하여 인스턴스로 생성하지 않고 바로 사용할 수 있습니다.  '클래스이름.Static변수명' 혹은 '클래스이름.Static메서드명' 형태로 이용할 수 있습니다.

그리고, 잘 기억해 보시면 우리는 static 메서드를 항상 사용하고 있습니다.

바로 main() 메서드가 static 메서드 입니다! 애플리케이션이 시작되려면 최초에 어떤 메서드는  JVM에 의해 호출되어야 합니다. 그래야 그 메서드를 시작으로 다른 메서드들이 연쇄적으로 실행되기 떄문입니다. 그 메서드가 바로 main 메서드 입니다, 그리고 main 메서드는 static 이기 때문에 애플리케이션이 시작되면 바로 메모리에 생성되며 JVM이 호출 할 수 있게 됩니다. main 메서드를 최초로 호출되는 메서드이고 애플리케이션의 시작점이라는 뜻으로 '엔트리 포인트' (Entry Point)라고도 부릅니다.

.

수업 예제에서 static Map을 사용한 이유

수업 예제에서도 Map을 static으로 생성하였습니다. 이렇게 되면 서비스에서 new MeberRepository(); 하든,  컨트롤러에서 new MemberRepository() 하든 테스트에서 new MemberRepository() 하든 애플리케이션이 시작되고 종료될 때까지 Map은 오로지 단 한번만 생성됩니다. 그리고 이 Map을 모든 인스턴스가 공동으로 사용하게 됩니다. (만약 Map의 접근제어자가 private이 아니라  public 이라면 MemberRepository.store 형태로 바로 Map에 접근할 수 있습니다.

.

예제에서는 바로 이러한 static의 특성을 이용하여 '단 하나의 Map'만 사용하기 위해 static으로 Map을 생성한 것입니다. 만약 Map에 붙은 static을 제거하게 되면 new MemberRepository() 를 작성할 때마다 각각의 인스턴스가 자기만의 Map 을 갖게 됩니다. 이 Map은 인스턴스끼리 공유하지 않고 자기 혼자만 사용하는 Map이 됩니다.

.

감사합니다.

3

정성스런 답변 감사합니다 

3

세세하고 깔끔한 답변 감사합니다.

2

단번에 이해됐네요 설명 감사드립니다.

0

정말 도움이 많이 되었습니다. 감사합니다.

JPMogan님의 프로필 이미지
JPMogan

작성한 질문수

질문하기