본문 바로가기

Java/Design patterns

상태 처리를 단순화하는 Flag 사용하기

이 문서의 내용

    논리형 Flag

    논리형 boolean에 대한 정보를 갖는 Flag입니다. 토글 기능을 사용하여 논리적인 흐름을 처리하고 제어합니다.

    더보기

    논리형 Flag는 true | false 두 개의 값을 가지게 됩니다.

    Boolean 타입은 Null을 표현 할 수 있으므로 primitive에 해당하는 boolean 타입을 사용합니다.

    Flag를 토글하려면 논리 연산자 !을 사용합니다.

    boolean flag = true;
    		
    // switch true to false
    flag =! flag;
    		
    // switch false to true
    flag =! flag;
    코드 비고
    Line 1 flag = true Flag를 true로 초기화합니다.
    Line 4 Line 7 flag =! flag Flag를 토글합니다.

    비트 연산자 Flag

    비트 연산자를 사용한 Flag는 여러 개의 상태가 동시에 켜질 수 있는 스위치입니다.

    Flag에서 사용하는 상태 값은 다음과 같이 정의합니다.

    final static int FLAG_APPLE		= 1;
    final static int FLAG_TOMATO 		= FLAG_APPLE << 1;
    final static int FLAG_PINEAPPLE		= FLAG_APPLE << 2;
    final static int FLAG_CARROT		= FLAG_APPLE << 3;
    코드 비고
    Line 1 FLAG_APPLE = 1 여러 상태를 정의하는 시작 값은 2진수 0000 0001입니다.
    반드시 1부터 시작해야 하는 것은 아니며 최대한 많은 상태를 표현하기 위함입니다.
    Line 2 FLAG_APPLE << 1 시작 값에서 << 1 비트 연산합니다.
    두 번째 상태는 2진수 0000 0010입니다.
    Line 3 FLAG_APPLE << 2 시작 값에서 << 2 비트 연산합니다.
    두 번째 상태는 2진수 0000 0100입니다.
    Line 4 FLAG_APPLE << 3 시작 값에서 << 3 비트 연산합니다.
    두 번째 상태는 2진수 0000 1000입니다.

    아무런 상태도 갖지 않았다면 0으로 정의합니다. 0은 2진수 0000 0000입니다.

    final static int FLAG_NONE		= 0;

    Flag에 새로운 상태를 추가하려면 OR 비트 연산합니다.

    int flags = FLAG_NONE;
    		
    // append apple status
    flags |= FLAG_APPLE;
    		
    // append carrot status
    flags |= FLAG_CARROT;
    코드 비고
    Line 1 flags = FLAG_NONE Flag를 0으로 초기화합니다. 현재 상태는 2진수 0000 0000입니다.
    Line 4 flags |= FLAG_APPLE FLAG에 상태를 추가합니다. 현재 상태는 2진수 0000 0001입니다.
    Line 7 flags |= FLAG_CARROT FLAG에 상태를 추가합니다. 현재 상태는 2진수 0000 1001입니다.

    Flag에서 상태를 제거하려면 XOR 비트 연산합니다.

    int flags = FLAG_ALL;
    		
    // remove pineapple status
    flags ^= FLAG_PINEAPPLE;
    		
    // remove apple status
    flags ^= FLAG_APPLE;
    코드 비고
    Line 1 flags = FLAG_NONE Flag를 ALL로 초기화합니다. 현재 상태는 2진수 0000 1111입니다.
    Line 4 flags ^= FLAG_PINEAPPLE FLAG에 상태를 제거합니다. 현재 상태는 2진수 0000 1011입니다.
    Line 7 flags ^= FLAG_APPLE FLAG에 상태를 제거합니다. 현재 상태는 2진수 0000 1010입니다.

    Flag의 상태를 검사하려면 AND 비트 연산합니다.

    int flags = FLAG_ALL;
    flags ^= FLAG_APPLE;
    		
    if (0 != (flags & FLAG_APPLE))		System.out.println("Apple status on");
    if (0 != (flags & FLAG_TOMATO))		System.out.println("Tomato status on");
    if (0 != (flags & FLAG_PINEAPPLE))	System.out.println("Pineapple status on");
    if (0 != (flags & FLAG_CARROT))		System.out.println("Carrot status on");

    복합적인 Flag 상태를 정의하여 사용 할 수도 있습니다.

    final static int FLAG_ALL		= FLAG_APPLE | FLAG_TOMATO | FLAG_PINEAPPLE | FLAG_CARROT;
    final static int FLAG_APPLE_TOMATO	= FLAG_APPLE | FLAG_TOMATO;
    
    int flags = FLAG_ALL;
    flags ^= FLAG_PINEAPPLE;
    flags ^= FLAG_CARROT;
    		
    if (FLAG_ALL == (flags & FLAG_ALL))			System.out.println("All status on");
    if (FLAG_APPLE_TOMATO == (flags & FLAG_APPLE_TOMATO))	System.out.println("Apple & Tomato status on");

    정리 및 복습

    • 논리형 Flag는 boolean 타입으로 정의하며 상태를 토글하려면 논리 연산자 !를 사용합니다.
    • 비트 연산자 Flag는 비트 연산을 사용하며 동시에 여러 개 상태가 On/Off 될 수 있는 스위치입니다.
    • 상태는 1부터 시작하며 다음 상태는 이전 상태 기준으로 << 1 비트 연산하여 left shift합니다.
    • Flag에 새로운 상태를 추가하려면 |=(OR) 비트 연산합니다.
    • Flag에서 상태를 제거하려면 ^=(XOR) 비트 연산합니다.
    • Flag의 상태를 비교하려면 &(AND) 비트 연산합니다.