JooTC
android-logo-card-red

[안드로이드/JAVA] 변수의 토글(Toggle)을 위한 효율적인 코드 작성

토글 역할을 수행하는 변수란?


간단한 수나 부울 연산으로 변수의 상태를 제어하고자 하는 경우가 있습니다. 일반적으로 이를 토글(Toggle)이라고 합니다.

구체적으로 어떠한 경우에 토글을 사용할까요? 다음 안드로이드 예제로 살펴보겠습니다. (이 포스트에서는 JAVA/안드로이드를 기준으로 작성하였지만 대부분의 프로그래밍 언어에서도 활용될 수 있습니다.)

public class MainActivity extends AppCompatActivity {
    private Button testButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        testButton = findViewById(R.id.testBtn);
        testButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                testButton.setText("활성화");
            }
        });
    }
}

다음 예제에서는 testButton 객체에 Button 뷰를 할당하고 버튼을 클릭하였을 때 동작 처리를 구성하였습니다. 버튼 클릭 시 이 버튼의 텍스트는 기존의 ‘비활성화’ 에서 ‘활성화’로 바뀌게 됩니다.

android-button-active

여기까지는 그럴 듯 합니다. 그렇다면 ‘활성화’로 바뀐 버튼을 다시 클릭하여 ‘비활성화’로 만들고 싶을 때는 어떻게 해야 할까요? 단순하게 생각한다면 이렇게 작성해볼 수 있겠습니다.

@Override
public void onClick(View v) {
    if (testButton.getText().toString().equals("활성화"))
        testButton.setText("비활성화");
    else
        testButton.setText("활성화");
}

testButton의 버튼 텍스트를 가져와서(testButton.getText().toString()) “활성화”와 같다면, “비활성화”로 바꾸도록 합니다.

이 코드는 올바르게 동작하지만, 뭔가 지저분해 보입니다. 토글 역할을 하는 변수가 아닌 단순 텍스트 비교를 통한 전환 처리를 했기 때문입니다.  이제 위 코드를 수정해보도록 하겠습니다. 제대로 된 토글 역할을 수행하기 위해 클래스 내 상단에 변수를 하나 추가해주겠습니다.

public class MainActivity extends AppCompatActivity {

    private int mBtnClickToggle; // 토글 변수
    ...

위에서 보이듯이 mBtnClickToggle 이라는 멤버 변수를 선언했습니다. 이 변수에는 0 또는 1의 값이 들어갈 것입니다. 초기 값이 0이므로 0은 버튼을 누르지 않은 상태, 1은 버튼을 한 번 눌렀던 상태로 해석될 수 있을 것입니다. 이를 토대로 위의 코드를 다시 작성해보겠습니다.

@Override
public void onClick(View v) {
    if (mBtnClickToggle == 1) { // 토글 값이 1일 때
        testButton.setText("비활성화");
        mBtnClickToggle = 0;
    }
    else { // 토글 값이 1이 아닐 때 (0)
        testButton.setText("활성화");
        mBtnClickToggle = 1;
    }
}

이렇게되면 이전의 코드와 비교하여 조금 더 명확하게 이해할 수 있게 됩니다.

 

 

변수의 토글 처리 코드를 효율적으로 작성하기


토글 역할을 수행하는 변수의 예시를 살펴보았는데요. 사실 위 코드대로 사용해도 좋지만, 지금부터는 위 코드를 개발자가 더 이해하기 쉽고 코드 자체를 간소화할 수 있는 대안을 알려드리고자 합니다.

사실 대부분의 토글 역할을 하는 변수들은 오직 두가지 값(예를 들면 0 또는 1)만 존재할 가능성이 높습니다. 이에 따라 자료형을 int 보다는 boolean으로 바꾸는 것이 좋습니다. 이대로 다시 한 번 코드를 고쳐보겠습니다.

클래스 내부의 상단부에서 추가했던 mBtnClickToggle 변수의 이름을 좀 더 명확하게 이해하기 위해 mBtnIsActive로 변경해보았습니다. 이 값이 true이면 버튼을 눌러서 ‘활성화’가 된 상태이며, false이면 다시 버튼을 눌러 ‘비활성화’가 된 상태일 것입니다.

이제 mBtnIsActive 변수를 boolean 타입으로 변경해줍니다.

public class MainActivity extends AppCompatActivity {

    private boolean mBtnIsActive; // 토글 변수
    ...

다시 아랫부분으로 내려와서 onClick 메소드를 다음과 같이 고쳐보겠습니다.

@Override
public void onClick(View v) {
    if (mBtnIsActive) { // 토글 값이 true 일 때
        testButton.setText("비활성화");
        mBtnIsActive = false;
    }
    else { // 토글 값이 false 일 때
        testButton.setText("활성화");
        mBtnIsActive = true;
    }
}

코드가 더욱 명확해졌습니다.

마지막으로, boolean 타입은 두 가지 값(true, false)만 가진다고 했습니다. 지금의 동작은 단순히 생각하면 버튼을 클릭할 때 마다 반대의 상태로 전환하는 것이겠죠? 위 코드에서 mBtnIsActive 변수의 값을 falsetrue 값으로 직접 값을 대입하였었는데, 사실 이를 더욱 간소화 시킬 수도 있습니다.

@Override
public void onClick(View v) {
    // true라면 false로, false라면 true로 전환
    mBtnClickToggle = !mBtnClickToggle;
    // 토글 값에 대한 스위치 처리
    if (mBtnClickToggle)
        testButton.setText("비활성화");
    else
        testButton.setText("활성화");
}

위 코드의 핵심은 mBtnIsActive 변수 처리는 단 한 줄 뿐이라는 것입니다. mBtnClickToggle 변수 앞에 느낌표인 ! 을 붙이면 NOT을 의미하며 bool 연산에서의 NOT은 각 값의 반대 값을 의미합니다. 다시말해 true 값과 false 값을 if문에 하나하나 넣지 않으면서도 클릭할 때 마다 반대 값으로 바꾸어줄 수 있는 것입니다.

이렇게 토글 변수를 활용하여 코드를 가독성있게 작성할 수 있습니다.

이 포스트가 도움이 되었나요?

댓글 남기기

avatar
error: 경고: 무단 콘텐츠 복사 및 사용을 금지하고 있습니다. 이해해주셔서 감사합니다.