시소당
객체지향에 대해서 공부를 하셔야 할 듯 하고요.
간단한 예를 들어볼까요?
public interface Pet{
public void screamOut();
}
펫이라는 인터페이스에는 소리지르라는 메소드가 있습니다.
구현은 당연히 안되어 있죠.
이제 구현하기 위한 상속을 받아보자면,
public class Cat implements Pet{
public void screamOut(){
System.out.println("야옹");
}
}
고양이는 "야옹"합니다.
public class Dog implements Pet{
public void screamOut(){
System.out.println("멍멍");
}
}
강아지는 "멍멍"합니다.
자, 이제 동물원에서 각 동물들의 울음소리를 알고 싶습니다.
인터페이스를 구현하지 않았다면 어떻게 해야할까요?
모든 동물들의 울음소리를 알려면 무슨 메소드를 호출해야 하는지
다알아야 겠죠? 하지만 이미 "구현할 것"을 명시해 두었으니
이렇게 하면 됩니다.
public class Zoo{
public static void main(String args[]){
Pet cat = new Cat();
cat.streamOut();
Pet dog = new Dog();
dog.streamOut();
}
}
예상되는 결과는 ?
야옹, 멍멍이 출력되겠죠.
Cat cat = new Cat();으로 해도 되지만,
지금은 울음소리만 알려고 한거니까
Pet cat = new Cat();으로 한거죠.
Pet이라는 인터페이스에는 streamOut();이 있으니까요.
이해가 되나요?
인터페이스를 구현함으로써 장점이 많은가 라기 보다는
객체지향을 공부하시고, 객체지향 페턴을 공부하시면
왜 abstract를 쓰는지 interface를 쓰는지,
상속을 받으면 좋은지 안좋은지를 알 수 있게 됩니다.
수고하세요,
--------------------------------------------
추가질문에 대한 답변입니다.
--> 프로그램 코딩할때 좀 편리하고 같은 이름으로 메서드를 만들수 있게끔 약속을 하는거네요
네, 그런 이유도 있습니다.
하지만 더 큰 이유는 객체지향에서 찾아봐야 맞는데요.
다형성이란 말 들어보셨죠?
이렇게 해보죠.
Dog와 Cat 클래스를 좀 더 변경해 봅시다.
먼저 인터페이스를 하나 더 추가해보죠
public interface PetWeight{
public int getWeight();
}
그리고 Dog와 Cat을 수정합니다.
public class Dog implements Pet, PetWeight{
public void screamOut(){
System.out.println("멍멍");
}
public int getWeight(){
return 12;
}
}
public class Cat implements Pet, PetWeigth{
public void screamOut(){
System.out.println("야옹");
}
public int getWeight(){
return 10;
}
}
이제 각 동물들의 몸무게를 볼까요?
public class Zoo{
public static void main(String args[]){
Cat cat = new Cat();
Dog dog = new Dog();
Pet petCat= cat;
petCat.streamOut();
Pet petDog = dog;
petDog .streamOut();
PetWeight catWeight = cat;
System.out.println(catWeight.getWeight());
PetWeight dogWeight = dog;
System.out.println(dogWeight.getWeight());
}
}
이런식으로 다형성을 시킬 수 있습니다.
인터페이스를 쪼개버렸죠?
Pet이라는 인터페이스 자체는 울 수 있는 동물들에게 구현하라고 할 수 있지만
금붕어 같은 경우는 Pet이라는 인터페이스를 구현하라고 하면 웃기겠죠?
하지만 PetWeight는요? 금붕어도 무게가 있으니까,
인터페이스를 구현하라고 시킬 수 있는 겁니다.
즉, 이것은 객체지향 자체에 대한 설명인거죠.
하지만, 바로 이해하라고 한다면 무리가 있겠죠?
객체지향에 대한 좋은 서적들이 많으니 사서 보시길 바랍니다.
--> 그럼 이벤트에보면... 리스너등록만 해주고.. 인터페이스리스너 상속은 안받구요..
그럼.. 필요한 이벤트메서드만 만드는게 가능하나요??
아닙니다.
이렇게 해보죠. 아까 구현했던 Cat과 Dog를 갖고 몸무게를 비교하는 메소드를
추가해 볼테니 잘 보시기 바랍니다
우선 인터페이스를 수정해 보죠.
public interface PetWeight{
public int getWeight();
public int compareTo(PetWeight pet);
}
이제 compareTo를 구현해야죠?
public class Cat implements Pet, PetWeigth{
public void screamOut(){
System.out.println("야옹");
}
public int getWeight(){
return 10;
}
public int compareTo(PetWeight pet){
return this.getWeight() - pet.getWeight();
}
}
public void screamOut(){
System.out.println("멍멍");
}
public int getWeight(){
return 12;
}
public int compareTo(PetWeight pet){
return this.getWeight() - pet.getWeight();
}
}
자, zoo 클래스에서 몸무게를 비교해 볼까요?
public class Zoo{
public static void main(String args[]){
Cat cat = new Cat();
Dog dog = new Dog();
Pet petCat= cat;
petCat.streamOut();
Pet petDog = dog;
petDog .streamOut();
PetWeight catWeight = cat;
System.out.println(catWeight.getWeight());
PetWeight dogWeight = dog;
System.out.println(dogWeight.getWeight());
if(dogWeight.compareTo(catWeight)>0){
System.out.println("개가 더 무거워요");
}
}
}
이렇게 될 수 있겠죠?
단순히 메소드 명만 같게 하려고 있는 것이 아니라,
인터페이스 자체에 의미가 있는 것입니다.
compareTo의 파라메터는 ? 인터페이스 였죠?
compareTo는 인터페이스 구현체가 Cat이건 Dog건, 기린이건 관계치 않고
PatWeight를 구현한 클래스면 실행시킬 수 있는 것이죠.
아까보다는 좀 더 이해가 되셨겠죠?
따라서 인터페이스를 상속받으려면 implements 즉 구현을 해야 한다는 것입니다.
메소드가 100개 인 인터페이스를 구현해야 한다면,
100개의 메소드를 모두 구현할 수 밖에 없는거죠.
--> 그리고 인터페이스로 만들어놓은메서드를 다 오버라이딩 해야 하는 번거로움 때문에.. 아답터라는 클래스를 만들어서 그걸 상속 받아서 한다고.. 알고 있는데..
아답터는.. 메서드랑 내용을 공백으로 해서 만들어 놓은 클래스자나요..
아답터는 인터페이스의 추상클래스때문에 좀 편리하게 작성하기위해 아답터를 쓴다고 했는데..
아답터도 안쓰고 인터페이스 상속도 안받고..
리스너 등록만해주고.. 코딩하면 어떻게 되나요???
어찌보면 맞는 말이기도 하지만,
어댑터를 쓰는 것은 "용도에 따라 다르다"입니다.
1. 어댑터 안써도 됩니다. (하지만 공부를 위해서 라면 쓰는 것을 강력히 권합니다.)
2. (아마 swing하시는 것 같은데) 인터페이스는 반드시 구현해야합니다.
라고 말씀드릴 수 있겠네요.
다 보시고 이해가 안가셔도 너무 걱정마세요
이것은 너무 큰 주제입니다.
객체지향에 대해 모르면, 왜 interface를 쓰는지 왜 abstract를 쓰는지
알 수가 없으니까요.
더 자세한 내용은 책을 보고 공부하시는 게 나을 듯 하네요.
출처 : 네이버 지식인