자바의 인터페이스 (콜백, 리스너, 옵저버)

Ji·2021년 8월 14일
0

자바의 인터페이스에 대해서 자세히 설명해 주신 블로그 글 ( https://www.charlezz.com/?p=768 )이 있어서 그에 대해 공부하고 작성한 글이다.

인터페이스?

행동 (behavior)

  • 다른 언어에서는 함수가 별도로 존재. but 자바에서는 클래스가 존재함 (함수가 따로 존재 X)
  • 클래스 내에 있는 함수를 메소드(method) 라고 함.
  • 이 method가 객체지향프로그래밍에서의 행동임.
public int sum(int a, int b) {
    return a+b;
}
  • sum이란 메소드가 있고 a와 b를 입력받아 더하는 '행동'을 하고 있음. sum이라는 메소드는 인터페이스의 정의에서 말한 '행동'을 뜻함.

구현 (Implementation)

public interface Calculator {
    int sum(int a , int b);
}
  • 자바의 인터페이스의 형태 (Calculator라는 인터페이스)
  • Calculator 내부 sum 이라는 메소드를 정의 but 구현은 하지 않음.
  • interface를 구현할 때는 클래스에 'implements'라는 키워드를 사용. (아래 코드)
public class CalculatorImpl implements Calculator {
    @Override
    public int sum(int a, int b) {
        return a+b;
    }
}
  • 인터페이스를 구현하고자 하면, 인터페이스 내의 정의된 메소드들은 반드시 구현해야함.
Calculator calc = new CalculatorImpl();
  • CalculatorImpl로 만들어진 객체는 CalculatorImpl 타입이기도하고, Calculator이기도 함.

추상 (abstraction)

  • 어떤 행동(behavior)에대해 구체적인 구현(implementation)을 미루는 것을 추상(abstraction)이라고 함.
  • 추사은 구체적이거나 실체는 없고 행동(method) 정의만 있는 것.
  • 다형성(Polymorphism): 추상화된 interface 구현을 어떻게 하느냐에 따라서 메소드 내의 코드 or 반환값을 다르게 만들 수 있음. 같은 interface를 구현하더라도 다른 형태를 가질 수 있는 것을 '다형성(Polymorphism)'이라고 함.
public class CalculatorPlus3 implements Calculator {
    @Override
    public int sum(int a, int b) {
        return a+b+3;
    }
}
  • CalculatorPlus3라는 클래스를 만든 상황 and Calculator를 구현.
  • but 아까와는 다르게 반환값에 3을 더하는 상황.
  • CalculatorPlus3로 생성된 객체는 여전히 Calculator 타입 & sum이라는 메소드를 가지고 있음. but 그에 대한 반환값 등은 다르게 구현되어있는 상태. -> 다형성(polymorphism)

콜백 vs 리스너 vs 옵저버

  • 콜백(Callback) : 이벤트가 발생하면 특정 메소드를 호출해서 알려줌. (1개 호출). 일반적 함수 호출(call)은 호출자가 피호출자를 부름. but 콜백(Callback)은 피호출자가 호출자를 부르는 형태.
  • 리스너(Listener) : 특정 이벤트를 처리하는 인터페이스. 이벤트 발생 여부를 기다리다가 이벤트가 발생하면 연결된 리스너(핸들러)들에게 이벤트를 전달함 (n개 호출)
  • 옵저버(Observer) : 데이터나 속성의 변경을 감지하여 구독자에게 변경사항을 전달함

cf) 이벤트: UI에 적용되는 사용자들의 반응 (ex) 위젯을 클릭, 텍스트 입력, 드래그

예제

public interface MyEventListener {
    void onEvent();
}
  • 이벤트를 전달하고자 하는 인터페이스 정의
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listener.onEvent();
    }
    
    MyEventListener listener = new MyEventListener() {
        @Override
        public void onEvent() {
            Toast.makeText(MainActivity.this, "onEvent",Toast.LENGTH_SHORT).show();
        }
    }; 
}
  • listener라는 MyEventListener객체를 만든 상황. 클래스 없이 바로 interface만으로도 객체를 생성가능. 이는 이름이 없는 클래스이기 때문에 익명클래스 or 무명클래스 라고 함.

  • 보통 View.setOnclickListener(new OnClickListener(){…}) 이런식으로 View에 리스너를 달음. 대표적인 무명클래스를 이용하는 방법 중 하나.

  • listener 객체를 통해 onEvent()를 호출 -> 무명클래스가 이벤트를 잘 전달받는지 확인.

출처
https://www.charlezz.com/?p=768

profile
공부방

0개의 댓글

관련 채용 정보