모바일 애플리케이션

[안드로이드/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 뷰를 할당하고 버튼을 클릭하였을 때 동작 처리를 구성하였습니다. 버튼 클릭 시 이 버튼의 텍스트는 기존의 ‘비활성화’ 에서 ‘활성화’로 바뀌게 됩니다.

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

@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문에 하나하나 넣지 않으면서도 클릭할 때 마다 반대 값으로 바꾸어줄 수 있는 것입니다.

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

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

Recent Posts

[iOS] Xcode ‘You do not have required contracts to perform an operation’ 해결

Xcode에서 iOS 애플리케이션을 빌드(Archive)하고 App Store Connect에 앱을 업로드하는 도중, 아래와 같은 에러가 발생하면서 더…

1주 ago

[안드로이드] INSTALL_FAILED_INSUFFICIENT_STORAGE 해결

INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…

6개월 ago

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

8개월 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

8개월 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

8개월 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

8개월 ago