이 글은 간단한 인터페이스에 대한 예제만을 보여드립니다.
깊게는 들어가지 못하는 제 게으름과 실력을 탓합니다.
flutter만 하다가 자바로 넘어온 지 어언 2주가 넘어간다.
문득 궁금한 기능이 생겼는데,
바로 A라는 액티비티에 있는 메서드를
내가 B액티비티 혹은 프래그먼트에 있을 때,
실행시키고 싶다면 어떻게 해야 할까?
flutter에 경우는
생성자로 Function을 넘겨주어
그 function을 실행하면, 생성자를 넘겨준 쪽에서
이 함수가 실행이 되었다.
그렇다면 자바에서 어떻게 할까?
바로
인터페이스다.
나도 항상 이 인터페이스를 그날그날 이해하면서도, 잘 모르고 넘긴 경우가 있다.
사실은 아직도 잘 모르지만,
이번에 내가 위와 같은 상황에서 인터페이스를 활용하는 법을
기록하기 위해 적어둔다.
말 그대로 정말 필요한 기능만을 가져가 보자.
자 우선 위와 같은 상황이 벌어졌다고 생각해봅시다.
우선 인터페이스를 만들어 줍시다.
public interface TestClickListener {
void hamburger();
void pizza(String cheese, String coke);
}
인터페이스라는 뜻은 무언가 입력을 했을 때 그 입력 내용을 전달해주는
매개체?? 같은 역할이라고 할 수 있습니다.
저희가 컴퓨터 키보드를 입력하면 화면에 글씨가 써지는 상황에선
키보드가 인터페이스라고 할 수 있습니다.
위에 처럼 TestClickListener를 만들어주고,
안에 두 메서드를 달아줍니다.
하나는 파라미터가 없고,
하나는 두 개나 있습니다.
현재 저 두 메서드는 빈 껍데기이지만, 저 두 인터페이스 메서드로 인자를 전달하거나,
메서드를 실행해 보겠습니다.
다음은 MainActivity입니다.
public class MainActivity extends AppCompatActivity implements TestClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), MainActivity2.class);
startActivity(intent);
}
});
}
private void iLikePizza(String cheese, String coke) {
Log.d("i like pizza" + cheese + coke, "yes");
}
private void iLikeBurger() {
Log.d("i like burger", "yes");
}
@Override
public void hamburger() {
iLikeBurger();
}
@Override
public void pizza(String cheese, String coke) {
iLikePizza(cheese, coke);
}
}
코드를 차례차례 보겠습니다.
public class MainActivity extends AppCompatActivity implements TestClickListener{
...
}
우선 우리가 실행하고 싶은 메서드나 기능이 있다면,
그 기능이 있는 곳에 인터페이스를 위와 같이 implements안에 달아주어야 합니다.
그러면 아래 빨간 줄이 뜨게 되는 데
맥 기준으로 option + Enter를 누르게 되면(윈도우는 Alt + Enter)
implement methods를 추가하라고 나옵니다.
아까 저희가 인터페이스에 적어주었던 껍데기 들입니다.
@Override
public void hamburger() {
}
@Override
public void pizza(String cheese, String coke) {
}
바로 이 녀석들이죠.
인터페이스에 두 개의 메서드가 정의되어있으면 무조건 이런 식으로
구현을 해주어야 합니다.
다시 상황을 보죠.
우리는 MainActivity에 iLikeBurger 메서드와
iLikePizza 메서드(파라미터 포함)를 실행시키고 싶습니다.
바로 MainActivity2에서 특정 행동을 할 때! 말이죠.
우선 인터페이스 안에 저희가 원하는 메서드를 삽입해줍니다.
@Override
public void hamburger() {
iLikeBurger();
}
@Override
public void pizza(String cheese, String coke) {
iLikePizza(cheese, coke);
}
자 이제 MainActivity2를 봅시다.
public class MainActivity2 extends AppCompatActivity {
TestClickListener testClickListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
testClickListener = new MainActivity();
testClickListener.hamburger();
testClickListener.pizza("치즈다", "콜라다");
}
});
}
}
이곳에서 버튼을 누르면 MainActiviy에 있는 메서드가 실행되게 코드를
구현하였습니다.
위에서부터 살펴봅시다.
우선 저희의 인터페이스를 선언해주고,
버튼을 클릭했을 때, 리스너 안에 MainActivity에 객체를 넣어줍니다.
그러고 나서 받은 MainActivity 인스턴스를 통해
두 메서드를 위와 같이 실행해줍니다.
pizza메서드 같은 경우는 파리미터도 넣어줍니다.
그렇습니다. 아까 그 껍데기 인터페이스 메서드가 이렇게 쓰이는 것입니다.
그렇게 버튼을 누르게 되면,
이런 식으로 MainActivity에 메서드가 실행된 것을 알 수 있습니다.
오늘은 간단한 예제를 통해서 인터페이스에 기능을
맛보았습니다.
아직 콜백에 대한 개념이 저도 적어, 이렇게 쓰는 게
정석은 아니라 생각하지만,
천천히 배워나가는 것 중에 하나라고 생각합니다.
내일도 파이팅!!