메모장

android studio 과제2(자바 반복되는 코드 줄이기)

BBakGoSu 2023. 10. 2. 21:55

자바 반복되는 코드 줄이기

 

앱을 실행하면 그림1과 같이 6개의 버튼으로 구성된 화면이 표시된다. 색상과 배치가 그림과 동일하도록 레이아웃을 구성하라. 버튼을 누르면 그 버튼이 사라지고 인접한 버튼들이 그 공간을 차지한다. 예를 들어 그림1에서 2번 버튼을 누르면 그림2가 되고, 그림2에서 5번 버튼을 누르면 그림3이 된다. 버튼을 모두 클릭하여 사라지면(그림4) “버튼이 모두 사라졌습니다라는 메시지가 토스트로 표시된다.

(작성방법) 중첩된 리니어레이아웃에 버튼들을 포함시키고 layout_weight 속성을 적절히 적용하여 화면을 구성한다. 버튼 클릭에 대한 동작이 모두 동일하므로 리스너는 MainActivity가 담당하게 구성한다. 버튼이 클릭될 때 클릭된 버튼의 visibility 속성을 GONE으로 변경하면 그 버튼이 사라지므로 레이아웃 내의 인접한 위젯들이 그 공간을 차지하게 된다. (, 인접 버튼이 확장되어 사라진 공간을 차지하는 부분은 따로 코딩할 필요가 없다.) 버튼의 수를 변수에 저장하고 버튼이 클릭될 때마다 줄여서 모든 버튼이 사라졌는지 확인할 수 있다.

이 문제 푸는데 나는 코드를 

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="2"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal">
    <android.widget.Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#FF0000"
        android:text="1"/>
    <android.widget.Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#00FF00
"
        android:text="2" />
    <android.widget.Button
        android:id="@+id/btn3"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#0000FF
"
        android:text="3" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical">
            <android.widget.Button
                android:id="@+id/btn4"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="#FFFF00"
                android:text="4" />
            <android.widget.Button
                android:id="@+id/btn5"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="#00FFFF"
                android:text="5" />

        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="horizontal">
            <android.widget.Button
                android:id="@+id/btn6"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="#808080"
                android:text="6" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

 

Main activity

package com.example.hw02;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {
    Button Btn1,Btn2,Btn3,Btn4,Btn5,Btn6;
    int click;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("HomeWork02");
        Btn1 = findViewById(R.id.btn1);
        Btn2 = findViewById(R.id.btn2);
        Btn3 = findViewById(R.id.btn3);
        Btn4 = findViewById(R.id.btn4);
        Btn5 = findViewById(R.id.btn5);
        Btn6 = findViewById(R.id.btn6);



        Btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Btn1.setVisibility(View.GONE);
                click+=1;
            }
        });
        Btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Btn2.setVisibility(View.GONE);
                click+=1;
            }
        });
        Btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Btn3.setVisibility(View.GONE);
                click+=1;
            }
        });
        Btn4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Btn4.setVisibility(View.GONE);
                click+=1;
            }
        });
        Btn5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Btn5.setVisibility(View.GONE);
                click+=1;
            }
        });
        Btn6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Btn6.setVisibility(View.GONE);
                click+=1;
            }
        });

        if(click==6){
            Toast.makeText(getApplicationContext(), "버튼이 모두 사라졌습니다.",Toast.LENGTH_LONG).show();
        }
    }
}

이렇게 했더니 마지막 if~문이 실행이 안되었다.

생각해보니 click 이 밖에 있어서 초기화가 되는것이다. 

따라서 바꾼 코드는 

package com.example.hw02;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {
    int click;

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

        View.OnClickListener btnClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Button clickedButton = (Button) view;
                clickedButton.setVisibility(View.GONE);
                click += 1;

                if (click == 6) {
                    Toast.makeText(getApplicationContext(), "버튼이 모두 사라졌습니다.", Toast.LENGTH_LONG).show();
                }
            }
        };


        // 각 버튼에 동일한 클릭 리스너를 설정합니다.
        // 버튼 클릭 시 동일한 동작을 수행하므로 반복적인 코드를 줄일 수 있습니다.

        for(int i=1; i<=6; i++){
            int buttonId = getResources().getIdentifier("btn" + i, "id", getPackageName());
            Button button = findViewById(buttonId);
            button.setOnClickListener(btnClickListener);
        }
    }
}

핵심 코드 1

View.OnClickListener btnClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Button clickedButton = (Button) view;
                clickedButton.setVisibility(View.GONE);
                click += 1;

                if (click == 6) {
                    Toast.makeText(getApplicationContext(), "버튼이 모두 사라졌습니다.", Toast.LENGTH_LONG).show();
                }
            }
        };

 

코드 해석 하자면 

View는 View는 안드로이드에서 UI 구성 요소를 나타내는 클래스  이다.  따라서 버튼, 텍스트뷰등 모드 View하위 요소이다. 따라서 

View 클레스의 클릭리스너를 설정하고 새로운 버튼을 선언한다.

클릭버튼에다가 클릭된 View를 버튼으로 형변환 시킨다.  그리고 그 클릭버튼을 GONE 해버린다. 따라서 없어진다. 

그리고 이때 클릭을 1더해준다. 

 

핵심코드2

for(int i=1; i<=6; i++){
            int buttonId = getResources().getIdentifier("btn" + i, "id", getPackageName());
            Button button = findViewById(buttonId);
            button.setOnClickListener(btnClickListener);
        }

이것은 

위에 코드 

Btn1 = findViewById(R.id.btn1);
        Btn2 = findViewById(R.id.btn2);
        Btn3 = findViewById(R.id.btn3);
        Btn4 = findViewById(R.id.btn4);
        Btn5 = findViewById(R.id.btn5);
        Btn6 = findViewById(R.id.btn6);

이것을 for문으로 바꾼것이다. 

해석하면 bottonID라는 인트형 변수에 getResources를 이용하여 버튼 아이디를 가져온다. 

  1. getResources().getIdentifier("btn" + i, "id", getPackageName()): 위에서 생성한 버튼 ID 문자열을 사용하여 해당 리소스의 식별자(ID) 값을 가져옵니다.
    • "btn" + i : 리소스 이름으로 사용할 문자열을 생성합니다.
    • "id" : 리소스 타입이 ID임을 나타냅니다.
    • getPackageName() : 앱의 패키지 이름(식별자)을 가져옵니다.

이런식으로 사용된다. 이렇게 가져온 버튼 아이디를 button이라는 버튼 변수에 1씩 더해서 저장한다. 그럼

button = btn1,btn2...

이런식으로 변환되고 6개 까지 저장된다. 이것을 각각 버튼 클릭 리스너로 보내주면 완성이다. 

 

chetGPT를 이용했지만 이해가 되질않아 다시한번 정리했다.