본문 바로가기
Development/DesignPatten

[디자인패턴] DesignPattern05 - Singleton(싱글톤 패턴) - 예제 포함

by 푸민 2020. 9. 1.
반응형

안녕하세요 푸민입니다.

오늘은 제가 개발하는 중 가장 많이 사용하는 디자인 패턴 중에 하나인 Sington(싱글톤 패턴)에 대해서 작성해보도록 하겠습니다. 아래에 Android 및 iOS 예제 소스가 포함 되어 있습니다.


1. 싱글톤?

싱글톤 패턴은 하나의 클래스가 오직 하나의 인스턴스만을 가지도록 보장하고, 전역적인 접근이 가능합니다. 유틸리티 클래스의 경우 사용할때 마다 생성하면 메모리 낭비입니다. 그래서 하나의 인스턴스만 생성하여 다양한 부분(전역적)에서 사용하도록 도와주는 패턴입니다.


2. 구현

다양한 기능을 사용할 수 있는 Util 클래스를 작성하겠습니다.

Util 클래스의 기능은 문자를 숫자로 변경하는 기능을 넣어볼게요.

 

- Android - Java

public class Util{
	
    private static Util instance;
    
    public static Util getInstance(){
    	if(instance == null){
        	instance = new Util();
        }
    	return instance;
    }
    
    private Util(){
    }
    
    public int stringToInt(String str){
    	int returnInt = 0;
    	try{
        	returnInt = Int.parseInt(str);
        } catch(NumberFormatException e){
        	returnInt = -1;
        }
        return returnInt;
    }
}
  • 변수중 private static Util instance 는 자신의 인스턴스를 가지도록 합니다. private 으로 외부에서 직접적인 접근이 불가능하도록 막고, static 을 사용함으로 실행시 바로 메모리에 할당, 전역에서 사용가능하도록 합니다.
  • private Util() 을 해줌으로써 외부에서 생성이 불가능하게 막고 자신만 생성 가능하도록해줍니다.
  • public static Util getInstance() 외부에서 해당 인스턴스를 가져갈수 있게 해주고, 인스턴스가 없을 경우 생성하도록 합니다.
  • public int stringToInt(String str) 문자열을 받아서 숫자 형태로 데이터 타입을 변경합니다. 숫자가 아닐 경우 예외처리하여 -1을 반환합니다.

 

- iOS - Objective C

// Util.h

#import <Foundation/Foundation.h>

@interface Util : NSObject

+ (Util *) getInstance;

- (int) stringToInt:(NSString *) str;

@end



// Util.m

#import Util.h

@implementation Util

+ (Util *) getInstance{
	static Util *instance = nil;
    if(instance == nil){
    	@synchronized(self){
        	instance = [[Util alloc] init];
        }
    }
    
    return instance;
}

- (int) stringToInt:(NSString *) str{
	int returnInt = 0;
    
    if(str != nil && ![str isEqualToString:@""]){
    	NSCharacterSet *nonDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
        NSRange nond = [str rangeOfCharacterFromSet:nonDigits];
        if(NSNotFound == nond.location){
        	return [str intValue];
        }
        else{
        	returnInt = -1;
        }
    }
    else{
    	returnInt = -1;
    }
    
    return returnInt;
}
  • + (Util *) getInstance 를 전역에서 부를수 있도록 설정하고, static 변수로 instance 를 생성한다. 그리고 인스탄스가 없을 경우 instance 를 할당해준다.
  • - (int) stringToInt:(NSString *)str 에서 문자를 받은뒤 nil 및 공백 체크하고 숫자가 아닐 경우 -1을, 숫자면 해당 숫자을 int 형으로 반환해준다.

 

문의는 댓글로 남겨주세요.

반응형

댓글