간단한 수나 부울 연산으로 변수의 상태를 제어하고자 하는 경우가 있습니다. 일반적으로 이를 토글(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
문에 하나하나 넣지 않으면서도 클릭할 때 마다 반대 값으로 바꾸어줄 수 있는 것입니다.
이렇게 토글 변수를 활용하여 코드를 가독성있게 작성할 수 있습니다.
리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…
JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…
NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…
언제부턴가 윈도우 11을 처음 설치할 때 마이크로소프트(Microsoft) 계정 로그인을 강제로 요구하게 되었습니다. 물론 마이크로소프트 계정이…
애플 에어팟 프로 2 (AirPods Pro 2) 케이스에는 스피커가 내장되어 있습니다. 그런데 간혹 아무 것도…