포스트

LG CNS 부트캠프 학습일지 15일차

학습 내용

  • 추상화 (Abstraction)
  • 캡슐화 (Encapsulation)
  • Singleton Pattern

추상화 (Abstraction)

추상화란 무엇인가. 풀어서 이야기하면 어떤 대상을 추상적으로 만든다는 것이다. 그러면 대상을 추상적으로 만든다는 것은 무엇인가. 대상의 필요한 부분만 드러내는 것이다. 우리가 사용하는 전자기기를 예로 들면 바로 이해할 수 있다. 전자기기를 분해한 모습을 상상해보자. 플라스틱 껍데기 아래 복잡한 회로기판 위에 수많은 부품이 납땜되어 있다. 사용자로서 우리는 그 회로기판이 어떻게 생겼는지 그리고 부품들이 어떻게 상호작용하는지 알지 못하고 알고 싶지도 않다. 하지만 우리는 그 전자기기를 사용하는 방법은 알고 있다.

추상화도 마찬가지다. 어떤 클래스가 어떤 필드로 구성되어 있는지 그리고 어떤 private 메소드를 가지고 있는지는 알 필요가 없다. 그 클래스 또는 인터페이스가 제공하는 메소드가 무엇인지 아는 것으로 충분하다.

추상화를 하는 방법 중 하나는 인터페이스를 정의하는 것이다. 객체들끼리 상호작용할 때 사용하는 통신규약 (프로토콜) 정도로 이해하고 있다. 엄밀히 말하면 정확한 표현은 아니다. 인터페이스를 사용하면 결합도(coupling)을 줄일 수 있다는 점에서 유익하다. 다만 언제나 그렇듯이 모든 경우에 인터페이스를 사용하면 가독성을 해친다. 중용을 지켜서 정말 필요할 때가 언제인지 판단할 수 있는 능력을 기르자.

캡슐화 (Encapsulation)

캡슐을 의미있게 번역하지는 않았다. 알약(캡슐)을 생각하면 좋은데, 알약 안에 어떤 것이 들어있는지 모른 상태로 복용하는 것을 생각하면 그 의미를 이해할 수 있을 것이다. 구현을 숨긴다는 점에서 추상화와 맥락이 비슷하다. 일반적으로 private access modifier를 사용하는 것으로 캡슐화를 한다.

Singleton Pattern

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MySingleton {
	private static MySingleton instance;

	public static MySingleton getInstance() {
		if (instance == null) {
			instance = new MySingleton();
		}

		return instance;
	}
	
	private MySingleton() {
		...
	}
}

디자인패턴을 본격적으로 배우는 것은 아니지만 중간에 싱글톤 패턴을 구현하는 방법에 대해서 배웠다. 마인크래프트 모드를 만들 때 종종 사용했는데, 어려운 디자인패턴은 아니다.

멀티스레드 환경에서 싱글톤 패턴 사용하기

싱글톤은 thread safe 하지 않다고 알고 있다. 다시말해 멀티스레드 환경에서 여러 스레드가 싱글톤 객체에 순차적으로 접근하지 않을 수 있기 때문에 그 객체의 값이 유효하다는 것을 보장하기 어렵다는 것이다. 싱글톤을 thread safe하게 만들어주기 위해서는 별도로 조치를 취해주어야 한다. Claude에게 물어보고 얻은 답변을 정리했다.

1
2
3
4
5
6
7
8
9
10
11
public class Singleton {
    private Singleton() {}

    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}

Bill Pugh pattern 이라고 한다. 내부 클래스를 정의하고 그 클래스를 통해서 싱글톤 객체에 접근하는 방식으로 구현되었다. 다만 코드를 바라보고 있는 것만으로는 Bill Pugh의 방식이 왜 thread safe한지 이해하기 어려웠다. 그 이유를 설명하면 아래와 같다.

고전적 싱글톤 패턴에서는 객체가 런타임에 초기화된다. 런타임에 초기화되기 때문에 서로 다른 두 스레드가 동시에 인스턴스를 만드는 경우가 발생할 수 있다. 반면 Bill Pugh 싱글톤 패턴은 싱글톤 객체가 클래스 초기화 시기에 초기화된다. 런타임에는 싱글톤 객체를 초기화시키지 않기 때문에 thread safe하다.

결론

Bill Pugh 싱글톤 패턴에 대해서 배웠다. 멀티스레드를 의식하면서 코드를 작성해본 경험이 없어서 해당 패턴은 접해볼 기회가 없었다. Bill Pugh 싱글톤 패턴을 사용해볼 기회가 있다면 좋을 것 같다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

Comments powered by Disqus.