본문 바로가기
코딩일기/android studio

안드로이드 독학 5일차 : 이벤트 리스너(event listener)

by 욱파이어니어 2021. 3. 9.
728x90
반응형

이벤트를 처리하는 방식 중에 이벤트를 처리하는 객체를 생성하여 이벤트를 처리하는 방법에 대해서 알아보자.

 

이벤트를 처리하는 메소드들이 정의된 인터페이스를 이벤트 리스너라고 한다.

 

이벤트 리스너는 여러가지가 존재하지만 가장 많이 사용하는 대표적인 리스너 인터페이스들을 보여주겠다.

 

※여기서 콜백 메소드란 다른 함수에 인자로 전달되는 함수이며 어떤 이벤트가 발생한 후에 작동되는 것이다.

리스너 콜백 메소드 설명
View.OnClickListener onClick() 어떤걸 터치했을때
View.OnLongClickListener onLongClick() 일정시간 동안 그대로 터치하고 있으면 발생
View.OnFocusChangeListener onfocusChange() 다른항목으로 포커스가 이동할때
View.OnKeyListener onKey() 포커스를가지고 있는 항목 위에서 키를 눌렀다가 놓았을떄
View.OnTouchListener onTouch() 터치이벤트로 간주되는 동작을 했을때 

 

이처럼 이벤트 리스너는 인터페이스라서 implements를 해줘야 하는데 이에도 4가지 방법이 있다.

(예로 View.OnClickListener를 사용하겠다.)

 

1. 리스너 클래스를 내부 클래스로 정의

이건 클래스를 따로 만들어서 해당 리스너를 implements 해서 해당 클래스로 객체를 생성하는 방법이다.

해당 클래스로 객체를 여러 개 만드는 거라면 모를까 그런 게 아니라 단 한 번의 이벤트를 사용하는 거라면 추천하지 않는

방법이라고 한다.

왜냐하면 그때 쓸 때만 잠깐 만들면 되는데 객체를 따로 생성하는 것이기 때문에 불필요한 공간을 차지하게 된다.

 

일단 이 방법이 뭔지 한번 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainActivity extends AppCompatActivity {
 
    class MyListener implements View.OnClickListener{
 
        @Override
        public void onClick(View view) {
            Toast.makeText(getApplicationContext(),"내부 클래스로 만든것임",Toast.LENGTH_SHORT).show();
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Button button = (Button)findViewById(R.id.custB);
        MyListener ml = new MyListener();
        button.setOnClickListener(ml);
    }
}
cs

이처럼 위에서 MyListener라는 클래스로 View.OnClickListener를 implements 해서

그 안에 있는 메서드 onClick()을 오버 라이딩해 재정의 해준다.

 

그리고 onCreate() 안에서 위에서 만든 MyListener 클래스로 ml이라는 객체를 생성해주고 

custB라는 id로 가져온 button 뷰의 setOnClickListener() 함수에 인자로 객체 ml을 넣어준다.

(왜냐 하면 해당 함수는 함수 인자로 View.OnclickListener를 받기 때문이다.)

 

이렇게 하면 custB라는 id를 가진 애가 onClick이라는 이벤트가 발생하면 이를 가만히 듣고 있던 

View.OnclickListener를 상속받은 ml이 이를 듣고 onClick()이라는 메서드를 콜백 하게 되는 것이다.

 

2. 리스너 클래스를 무명 클래스로 처리하는 방법

자바에는 상속받은 자식 클래스 없이 그 자리에서 익명의 객체를 만들어서 사용하는 '무명 클래스' 방법이 있다.

언제 있을지 모를 이벤트에 대한 처리를 무명 클래스 방식으로 이벤트 리스너의 객체를 생성해서 이벤트 리스너를 사용하는 방법이다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Button button = (Button)findViewById(R.id.custB);
        
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(),"무명 클래스로 만든것임",Toast.LENGTH_SHORT).show();
            }
        });
    }
}
cs

 

보면 button에서 안에 따로 객체를 생성하지 않고 일회성으로 사용하는 것을 볼 수가 있다.

1번에서 사용했을 때와는 다르게 코드수가 엄청나게 줄어든 것을 볼 수가 있다.

 

3. 액티비티에 인터페이스를 구현하는 방법

이건 MainActivity 클래스에서 해당 리스너를 implement 해서 사용하는 방법이다.

사용하는 방법은 아래와 같다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Button button = (Button)findViewById(R.id.custB);
 
        button.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View view) {
        Toast.makeText(getApplicationContext(),"액티비티로 만든것임",Toast.LENGTH_SHORT).show();
    }
}
cs
M

MainActivity 클래스에서 View.OnClickListener를 implements 해서 

button.setOnClickListener(this);에서 해당 클래스에서 재정의 했기 때문에 this를 썼다.

 

4. 람다식을 이용해서 인터페이스를 구현하는 방법

 

람다식을 이용해서 하는 방법을 보여주기 전에 일단 람다식에 대해서 알아보자

 

4-1. 람다식이란?

(매개변수) ->{함수 몸체}

이런 식으로 함수를 선언함과 동시에 익명 객체를 만들어서 사용하는 것이다.

 

람다식에 관한 자세한 설명은 아래 블로그를 참조해서 보면 더 좋을 것 같다.

khj93.tistory.com/entry/JAVA-%EB%9E%8C%EB%8B%A4%EC%8B%9DRambda%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95

 

[JAVA] 람다식(Lambda)의 개념 및 사용법

  람다함수란? 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어입니다. 현재 사용되고 있는 람다의 근간은 수학과 기초 컴퓨터과학 분야에서의

khj93.tistory.com

 

그럼 이제 람다식으로 한 예제를 보자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MainActivity extends AppCompatActivity{
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Button button = (Button)findViewById(R.id.custB);
 
        button.setOnClickListener(view -> {
            Toast.makeText(getApplicationContext(),"람다로 만든것임",Toast.LENGTH_SHORT).show();
        });
    }
 
}
cs

이렇게 view라는 매개변수를 씀과 동시에 익명 객체를 만들어서 사용하는 것이다.

이를 사용하면 코드는 간결해지지만 너무 자주 사용하면 오히려 가독성을 떨어뜨린다.

그리고 성능도 안 좋아진다는데 자세한 내용은 위의 블로그에 나와 있으니 참조하면 될 것 같다.

 

반응형