Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

운기의 블로그

Singleton pattern 에 대해서 본문

안드로이드

Singleton pattern 에 대해서

운띠야 2021. 4. 4. 23:44

 

싱글톤 패턴에 대해서 설명하기 전에 자바 컴파일시 일어나는 일, 그리고 그러한 일들로 인해 싱글톤 패턴을 왜 사용하는가에 대해서 먼저 말하려고 합니다.

 

1. Java는 기본적으로 인터프리트와 컴파일 방법으로 코드를 읽습ㄴ디ㅏ. 

2. 그중에서도 컴파일 방법으로 인해 자바 코드를 실행과 동시에 읽고 각각 역할에 맞게 메모리에 올려 둡니다.

 

스택 매개변수, 지역변수, 리턴값 등이 저장되며 실행이 완료되면 제거됩니다. 임시 저장 공간
New명령어를 통해 생성한 인스턴스와 배열 등의 참조형
변수정보 , GC의 대상
데이터 전역변수, 지역변수, static으로 선언되는 변수, 클래스,  프로그래밍이 종료될 때 까지 지워지지 않을 데이터를 저장 하는 공간
코드  프로세스가 실행할 코드와 매크로 상수가 기계어의 형태로 저장된 공간

 

여기서 주의 깊게 봐야 할 껀 힙 영역입니다.

new를 사용하여 객체를 인스턴스화 하면 힙 영역에 생성이 됩니다. ( 이때 생성되는 인스턴스들은 힙 영역에서 각자 다른 메모리를 차지합니다)

 

아래의 예시를 통해 좀 더 보도록 하겠습니다.

 

retrofit 코드 -> 싱글톤 패턴처럼 짜려고 하지만, 완벽한 싱글톤 패턴은 아님

위의 코드는 레트로핏 통신하기위해 레트로핏 객체를 만들어 주는 클래스입니다.

RemoteDataSoruce 클래스 객체를 new를 사용해서 가져온다면 레트로핏 객체를 인스턴스화 해서 힙 영역에 올려두고 사용 할 수 있습니다 .

 

하지만 이때 여러 군데에서 동일하게 사용되는 레트로핏 클래스를 계속해서 new를 사용해서 힙 영역에 올리면 메모리를 낭비하게 됩니다. ( 물론 가비지 콜렉션에서 힙 영역에서 사용되지 않으면 알아서 처리는 해주지만 ... )

 

이러한 해결하기 위해 싱글톤 패턴을 사용하게 됩니다. 

 

싱글톤 패턴이란 무엇인가?

 

싱글톤 패턴이란 어떤 클래스가 컴파일 시 최초로 한 번 메모리에 할당받게 되고, 그 메모리에서 객체를 생성해서 계속 사용 하는 디자인 패턴을 말합니다. 

 

다른 말로 하면 객체를 여러번 생성하는게 아니라 딱 한번 객체를 인스턴스화 한 후에 그 인스턴스를 다른 클래스에서 불러와서 사용하는 것을 말합니다. 

 

 

사용 방법

 

외부에서 접근 할 수 없게 생성자는 private으로 만들어줍니다.

그리고 NetworkManger 객체에 접근 할 수 있게 instace를 생성해줍니다.

 

그 후 우리는 레트로핏 객체를 사용해야하기 때문에 생성된 레트로핏 객체에 접근할 수 있게 getRetrofit 메서드를 만들어서 레트로핏 객체를 리턴해줍니다.

 

생성자 안에는 사용 할 레트로핏 객체를 생성해주고, 다른 곳에서 api를 받기 위해서 제네릭 타입을 선언해 줍니다. 

이렇게 생성된 NetworkManager는 아래의 방법 처럼 사용합니다.

 

NetworkManager의 Instance를 가져와서 NetworkManager의 인스턴스를 사용하고 클래스 안에 있는 apiService를 이용해 미리 만들어둔 인터페이스 api에 넣어 줍니다. 

 

이렇게 하면 레트로핏 싱글톤으로 구현 완료 !!

 


참고 

 

retrofit 코드 -> 싱글톤 패턴이지만, 완벽한 싱글톤 패턴은 아니라고 생각

위에 넣어 둔 방식으로도 많이 사용되지만, 제가 생각할 때에는 해당 클래스의 인스턴스를 돌려줘야 하는게 맞다고 생각하기 때문에 NetWorkManager의 instance를 돌려주어서 만들어 줬습니다.