Post

변수의 토글 처리 기법

20대 초반에 고민해 본 변수의 토글 처리 방법에 대한 글 입니다. 프로그래밍에 대한 재미를 처음 느껴봤던 주제인만큼 이 글은 오랫동안 보관하고 있습니다. 가벼운 주제이지만 스스로에게는 무척 의미있는 내용이기 때문에 초심을 기억해 내고자 할 때마다 읽어보는 글 입니다.

변수의 토글 처리 기법

1. bool 타입

제일 쉬운 경우. 별로 설명이 필요없는 듯.

1
2
boolean toggle = true;
toggle = !toggle;

2. 1과 -1의 토글

마찬가지로 아주 쉽다.

2-2, 3-3의 토글의 경우에도 사용할 수 있겠지만, 그런 토글을 사용할 일은 아직까지 한번도 없었다.

1
2
int toggle = 1;
toggle = -toggle;

3. 0과 1의 토글

그냥 bool로 해도 되겠지만, 0과 2의 토글, 0과 3의 토글 등의 경우에도 사용이 가능하고, 이렇게 0과 어떤 숫자와의 토글을 써야하는 때가 의외로 자주 있다.

보통의 경우 이렇게 많이 쓴다.

1
2
3
4
5
6
7
int toggle = 1;

if (toggle == 1) {
    toggle = 0;
} else {
    toggle = 1;
}

조금 더 생각을 한다면, 3항 연산자를 사용해서 다음과 같은 처리가 가능해 진다.

개인적으로 두가지 조건을 갖는 변수의 경우에 가장 많이 활용하는 경우.

1
2
int toggle = 1;
toggle = (toggle == 1) ? 0 : 1;

논리연산을 하지 않으려면 다음과 같이 할 수 있다.

실은 이것이 내가 가장 잘 사용하는 방법이다.

주로 메뉴를 만들때 키 포커싱을 처리하는 방법이다.

1
2
int toggle = 1;
toggle = (toggle + 1) % 2;

혹은 이렇게도 사용 가능하다.

1
2
int toggle = 1;
toggle = (toggle + 1) & 0x01;

여러 모로 생각해 본 결과 가장 사용하기 편리하고 직관적인 방법인 이거다.

정말로 단순하면서도 최고의 팁이다.

단 한번의 연산으로 토글이 되는 방법!!

1
2
int toggle = 1;
toggle = 1 - toggle;

하지만 위의 방법보다 더 고차원 적인 XOR 을 사용해서 토글 처리가 가능한 방법이 있다.

1
2
int toggle = 1;
toggle ^= 1;

4. 0과 다른 수의 토글

0과 다른 숫자(예: 0과 5, 0과 10 등)의 토글은 위의 방법을 응용할 수 있습니다.

0과 5의 토글

1
2
3
4
5
6
7
8
9
int toggle = 0;
// 방법 1: 조건문 사용
toggle = (toggle == 0) ? 5 : 0;

// 방법 2: 수학적 계산 (5에서 현재값을 빼기)
toggle = 5 - toggle;

// 방법 3: XOR 연산 사용
toggle ^= 5;

0과 임의의 수 N의 토글

1
2
3
4
5
6
7
8
int N = 10;  // 토글할 대상 숫자
int toggle = 0;

// 수학적 방법
toggle = N - toggle;

// XOR 방법
toggle ^= N;

5. 실제 활용 사례

게임에서의 플레이어 턴 관리

1
2
3
4
5
6
7
8
9
public class GameTurnManager {
    private int currentPlayer = 1;  // 1번 플레이어부터 시작

    public void switchPlayer() {
        // 1과 2 사이의 토글
        currentPlayer = 3 - currentPlayer;
        System.out.println("현재 플레이어: " + currentPlayer);
    }
}

UI 상태 관리 (메뉴 보이기/숨기기)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MenuController {
    private boolean isMenuVisible = false;

    public void toggleMenu() {
        isMenuVisible = !isMenuVisible;
        updateMenuDisplay();
    }

    private void updateMenuDisplay() {
        if (isMenuVisible) {
            System.out.println("메뉴 표시");
        } else {
            System.out.println("메뉴 숨김");
        }
    }
}

배열 인덱스 순환

1
2
3
4
5
6
7
8
9
10
11
12
public class ArrayIndexToggle {
    public static void main(String[] args) {
        String[] options = {"옵션A", "옵션B"};
        int currentIndex = 0;

        // 0과 1 사이를 순환
        for (int i = 0; i < 10; i++) {
            System.out.println("현재 선택: " + options[currentIndex]);
            currentIndex = (currentIndex + 1) % 2;  // 0↔1 순환
        }
    }
}

6. 성능 비교

서로 다른 토글 방법들의 성능을 비교해보면:

방법연산성능가독성
toggle = !toggle (boolean)논리 NOT⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
toggle = 1 - toggle산술 연산⭐⭐⭐⭐⭐⭐⭐⭐
toggle ^= 1비트 XOR⭐⭐⭐⭐⭐⭐⭐⭐
toggle = (toggle == 1) ? 0 : 1조건 연산⭐⭐⭐⭐⭐⭐⭐

7. 주의사항

1) 타입 안정성

1
2
3
4
5
6
7
// 잘못된 예: 범위를 벗어날 수 있음
int toggle = 1;
toggle = 2 - toggle;  // 0과 2 사이가 아닌 다른 값이 들어올 수 있음

// 올바른 예: 안전한 토글
int toggle = 1;
toggle = (toggle == 1) ? 0 : 1;  // 항상 0 또는 1만 보장

2) 멀티스레드 환경

1
2
3
4
5
6
7
public class ThreadSafeToggle {
    private volatile boolean toggle = false;

    public synchronized void safeToggle() {
        toggle = !toggle;
    }
}

8. 결론

변수의 토글 처리는 프로그래밍에서 자주 사용되는 기법입니다. 상황에 맞는 적절한 방법을 선택하여 사용하면:

  • 가독성 향상: 코드의 의도가 명확해집니다
  • 성능 최적화: 적절한 연산 방식 선택으로 성능을 개선할 수 있습니다
  • 버그 방지: 명확한 토글 로직으로 예상치 못한 값 할당을 방지할 수 있습니다

특히 게임 개발, UI 상태 관리, 알고리즘 구현 등에서 이러한 토글 기법들이 유용하게 활용됩니다.

This post is licensed under CC BY 4.0 by the author.