간단한 수나 부울 연산으로 변수의 상태를 제어하고자 하는 경우가 있습니다. 일반적으로 이를 토글(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
변수의 값을 false 와 true 값으로 직접 값을 대입하였었는데, 사실 이를 더욱 간소화 시킬 수도 있습니다.
@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
문에 하나하나 넣지 않으면서도 클릭할 때 마다 반대 값으로 바꾸어줄 수 있는 것입니다.
이렇게 토글 변수를 활용하여 코드를 가독성있게 작성할 수 있습니다.
Xcode에서 iOS 애플리케이션을 빌드(Archive)하고 App Store Connect에 앱을 업로드하는 도중, 아래와 같은 에러가 발생하면서 더…
INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…
리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…
JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…
NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…