1. 인터페이스란?
인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미합니다.
자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 될 수 있지만 다중 상속을 할 경우 메소드 출처의 모호성과 같이 여러 문제가 발생할 수 있게 됩니다.
이와 같은 이유로 자바에서는 클래스를 통한 다중 상속을 지원하지 않습니다.
하지만 다중 상속의 이점을 활용하기 위해 인터페이스라는 것을 통해 다중 상속을 지원하고 있습니다.
인터페이스는 위에서 일종의 추상클래스라고 했지만 추상클래스와는 분명 다른 점이 존재합니다.
자바에서 추상 클래스는 추상 메소드를 포함할 수 있지만 어쨌든 클래스 이기 때문에 생성자, 필드, 일반 메소드도 포함할 수 있습니다.
하지만 인터페이스(interface)는 오로지 추상 메소드와 상수만을 포함할 수 있습니다.
따라서 인터페이스를 상속받고 있는 클래스들은 인터페이스에 있는 추상 메소드들을 구현해야 합니다.
class가 interface를 상속받는 키워드는 implements 입니다.
class 가 class 상속 키워드 -> extends
class 가 interface 상속 키워드 -> implements
interface 가 interface 상속 키워드 -> extends
2. 인터페이스의 선언
접근제어자 interface 인터페이스이름 {
public static final 타입 상수이름 = 값; //변수는 상수화 (static final)
...
public abstract 메소드이름(매개변수목록); //추상메소드
...
}
3. 인터페이스의 장점
다중 상속 이외의 인터페이스의 장점
1. 대규모 프로젝트 개발 시 일관성 있고 정형화된 개발을 위한 표준화가 가능
2. 클래스 작성과 인터페이스 구현을 동시에 진행할 수 있으므로 개발 시간 단축 가능
3. 클래스와 클래스 간의 관계를 인터페이스로 연결하면 클래스마다 독립적인 프로그래밍이 가능
1. Animal.java
// interface : 모든 method가 abstract method, 변수가 상수화(static final)
public interface Animal {
public void bark();
void eat(String feed);
}
2. Cat.java
// extends : class가 class 상속
// implements : class가 interface 상속
public class Cat implements Animal {
@Override public void bark() {
System.out.println("야옹");
}
@Override public void eat(String feed) {
System.out.println("고양이가 " + feed + "");
}
}
3. Dog.java
public class Dog implements Animal {
@Override public void bark() {
System.out.println("멍멍");
}
@Override public void eat(String feed) {
System.out.println("멍멍이가 " + feed + "먹는다.");
}
}
4. MTest.java
public class MTest {
public static void main(String[] args) {
Animal cat = new Cat();
cat.bark();
cat.eat("참치");
Animal dog = new Dog();
dog.bark();
dog.eat("갈비");
}
}
위의 코드를 보면 Animal이라는 인터페이스를 상속받은 Cat과 Dog 클래스가 있습니다.
Animal에서는 추상클래스만 존재하며 Cat과 Dog에서는 Animal의 추상클래스를 오버라이드 하였습니다.
MTest에서 Cat과 Dog 객체를 생성하고 메소드를 호출하였습니다.
실행하면 다음과 같은 결과가 나옵니다.
그림으로 보면 위와 같습니다.
Animal 인터페이스를 Cat과 Dog클래스가 상속받고 있습니다.
1. Animal.java
public abstract class Animal {
public abstract void bark();
public void eat(String feed) {
System.out.println(feed + "먹는다.");
}
}
2. Brid.java
public interface Bird {
public void fly();
}
3. Cat.java
public class Cat extends Animal {
@Override public void bark() {
System.out.println("야옹");
}
public void eat(String feed) {
System.out.println("야옹이가 " + feed + "먹는다.");
}
}
4. Dog.java
public class Dog extends Animal {
@Override public void bark() {
System.out.println("멍멍");
}
public void eat(String feed) {
System.out.println("멍멍이가 " + feed + "먹는다.");
}
}
5. Eagle.java
public class Eagle extends Animal implements Bird {
@Override public void fly() {
System.out.println("파닥파닥");
}
@Override public void bark() {
System.out.println("독수리가 어떻게 울지?");
}
}
6. MTest.java
public class MTest {
public static void main(String[] args) {
Cat cat = new Cat();
cat.bark();
cat.eat("참치");
Dog dog = new Dog();
dog.bark();
dog.eat("갈비");
Eagle eagle = new Eagle();
eagle.fly();
eagle.bark();
eagle.eat("쥐");
}
}
위의 코드는 조금 더 복잡해졌습니다.
추상메소드를 포함하고 있는 Animal클래스 즉 추상클래스인 Animal클래스를 Bird 인터페이스, Cat, Dog클래스가 상속받고 있습니다.
하지만 Bird는 클래스가 아니라 인터페이스 이기때문에 Bird를 상속받는 클래스에서 Bird의 내용을 구현해야 합니다.
위의 코드에서는 Eagle하나만 만들었지만 다른 여러 가지 새를 만들 수 있습니다.
또한 Cat과 Dog에서도 추상클래스 Animal에 있는 추상메소드를 구현해야 합니다.
해당 코드를 MTest에서 호출하도록 코드를 작성했습니다.
public class MTest {
public static void main(String[] args) {
TV ig = new IgTV(); // ig tv 구매
System.out.println(ig.volumeUp()); // 1
System.out.println(ig.volumeUp()); // 2
System.out.println(ig.volumeUp()); // 3
System.out.println(ig.volumeUp()); // 4
System.out.println();
System.out.println(ig.volumeDown()); // 3
System.out.println(ig.volumeDown()); // 2
System.out.println(ig.volumeDown()); // 1
System.out.println(ig.volumeDown()); // 0
System.out.println();
TV samsong = new SamsongTV(); // samsong tv 구매
System.out.println(samsong.volumeUp()); // 3
System.out.println(samsong.volumeUp()); // 6
System.out.println(samsong.volumeDown()); // 3
System.out.println(samsong.volumeDown()); // 0
}
}
해당 MTest를 출력했을 때 출력 결과가 주석과 같이 나오게 하려면 어떻게 해야 할까요?
위의 그림과 같이 만들어주세요!
1. TV.java
public interface TV {
int volumeUp();
int volumeDown();
}
2. IgTV.java
public class IgTV implements TV {
private int volume;
@Override public int volumeUp() {
volume++;
return volume;
}
@Override public int volumeDown() {
volume--;
if(volume < 0) {
volume = 0;
}
return volume;
}
public IgTV() {
System.out.println("아이지 TV 구매");
}
}
3. SamsongTV.java
public class SamsongTV implements TV {
private int volume;
@Override public int volumeUp() {
volume+=3;
return volume;
}
@Override public int volumeDown() {
volume-=3;
if(volume < 0) {
volume = 0;
}
return volume;
}
public SamsongTV() {
System.out.println("삼송 TV 구매");
}
}
인터페이스가 추상클래스와 가장 크게 다른 점이 다중 상속이라고 하였습니다.
그렇다면 인터페이스를 다중 상속받는 클래스를 만들어볼까요?
1. Display.java
public interface Display {
public void display();
}
2. Job.java
public interface Job {
public String JOB_ID = "IT";
public void jobLoc(String loc);
}
3. Profile.java
public class Profile {
private String name;
private String phone;
public Profile(String name, String phone) {
this.name = name; this.phone = phone;
}
public void print() {
System.out.println("이름 : " + name);
System.out.println("번호 : " + phone);
}
}
4. MyProfile.java
public class MyProfile extends Profile implements Display, Job {
private String loc;
public MyProfile(String name, String phone) {
super(name, phone);
}
@Override public void jobLoc(String loc) {
this.loc = loc;
}
@Override public void display() {
super.print();
System.out.println("주소 : " + loc);
System.out.println("직종 : " + JOB_ID);
}
}
5. MTest.java
public class MTest {
public static void main(String[] args) {
MyProfile my = new MyProfile("강씨네", "010-1111-2222");
my.jobLoc("서울시 강남구");
my.display();
}
}
다음과 같이 클래스는 여러 개의 인터페이스와 한 개의 클래스를 상속받을 수 있습니다.
'Java 관련 > Java' 카테고리의 다른 글
[Java] Calendar 클래스를 이용한 달력(calendar) (0) | 2021.10.27 |
---|---|
[Java] 달력(calendar) 만들기 (1) | 2021.10.26 |
[Java] 메소드(method) (0) | 2021.10.22 |
[Java] Random()을 이용한 로또 코드(lotto code) (0) | 2021.10.20 |
[Java] 얖은값 복사(Shallow copy), 깊은값 복사(Deep copy) (1) | 2021.10.19 |