1. 인터페이스란?
추상메서드의 집합, 구현된 것이 하나도 없는 설계도, 껍데기(모든 멤버가 public)
추상메서드는 앞의 블로그에 설명되어 있다.
- 2024.01.13 - [자바] - [자바] 추상클래스(Abstract Class)
[JAVA] 추상클래스(Abstract Class)
목차 추상클래스란? 추상클래스의 특징 추상클래스 작성 추상클래스는 왜필요한가? 1. 추상클래스란? 미완성 설계도 추상메서드를 하나 이상 갖고 있는 클래스 추상메서드 abstract + 리턴타입 +
goharry.tistory.com
interface 인터페이스이름{
//public, static, final 생략 가능
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
예외 없이 인터페이스의 메서드는 항상 public이고 abstract이다.
상수도 항상 public, static, final이다.
2. 인터페이스 - 상속
인터페이스의 조상은 인터페이스만 가능하다.
다중상속이 가능하다(추상메서드는 충돌해도 문제없음)
interface Fightable extends Movable, Attackable{}
interface Movable{
void move(int x, int y);
}
interface Attackable{
void attack(Unit u);
}
자바에서 다중상속이 안 되는 이유는 선언부가 같고 내용부가 다르면 어느 것을 선택할지 결정할 수 없다.
인터페이스는 추상메서드로 이루어져 있어서 선언부가 같아도 몸통이 없기 때문에 충돌문제가 발생하지 않는다.
3. 인터페이스 - 구현
인터페이스에 정의된 추상메서드를 완성하는 것.
class 클래스이름 implements 인터페이스이름{
//인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}
interface Fightable{
void move(int x, int y);
void attack(Unit u);
}
class Fighter implements Fightable{
public void move(int x, int y) {
System.out.println(x+","+y+"로 이동한다.");
}
public void attack(Unit u) {
/*내용생략*/
};
}
추상메서드의 {} 부분을 완성하는 것을 말한다.
일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 한다.
4. 추상클래스와 공통점과 차이점
공통점
- 자기 자신이 new를 통해 객체를 생성할 수 없고, 오로지 자식만이 객체를 생성할 수 있다.
- 둘 다 추상메서드를 갖는다.
- 둘 다 하위 클래스에서 추상 클래스를 모두 구현해야 한다.
차이점
추상클래스 | 인터페이스 |
상속하여 공통된 기능을 만들고 확장하기 위함 | 구현하는 객체들이 같은 동작을 보장하기 위함 |
다중상속 불가능 | 다중상속 가능 |
생성자와 일반변수 모두 가질 수 있다. | 생성자와 일반변수를 가질 수 없다. |
메서드를 부분적으로 구현할 수 있다. | 메서드 선언만 가능 |
extends 키워드를 사용한다 | implements 키워드를 사용한다. |
5. 다형성
조상의 참조변수로 자손객체를 가리키는 것
오버로딩, 오버라이딩, 업캐스팅, 다운캐스팅, 인터페이스, 추상메서드, 추상클래스 방법이 모두 다형성에 속한다고 보면 된다.
즉, 다형성은 클래스가 상속관계에 있을 때 나타나는 다채로운 성질이다.
5-1. 인터페이스도 구현 클래스의 부모인가?
맞다. 인터페이스는 엄밀히 따지면 부모는 아니지만 거의 부모나 다름없다.
f1, f2 둘다 가능하지만 인터페이스로 선언하면 Fighter에 메서드가 많아도 인터페이스에 있는 추상메서드만 사용 가능하다. 그래서 f2.stop()은 빨간 줄이 그이는 것이다.
5-2. 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
6. 인터페이스의 장점
장점 1
- 사람이 직접 기계를 조작하는 것보다 껍데기를 통해 조작하는 것이 쉽다.
- 대상 2가 다른 대상으로 바뀌어도 대상 1에게는 영향이 거의 없다.
- 변경에 유리하고 소통에 도움이 된다.
장점 2
예를 들어 선언과 구현을 동시에 처리했을 때 B를 C로 바꾸고 싶으면 B를 사용하는 A의 코드까지 수정이 불가피하다.
선언과 구현을 인터페이스를 통해서 분리시키면 A는 인터페이스 I I를 사용하기 때문에A에 대한 코드수정을 할 필요가 없다.
장점 3 - 개발시간을 단축할 수 있다.
B가 완성될 때까지 A는 완성하지 못하고 기다려야 한다.
이때 A는 인터페이스를 사용해서 미리 완성할 수 있다. 추상메서드로 호출이 가능하기 때문에
장점 4 - 표준화가 가능하다.
예를 들어보자.
오라클을 쓰다가 가격이 올라서 MySQL로 바꾸려고 할 때, JDBC가 중간에 껴있기 때문에 내 애플리케이션은 거의 변경하지 않아도 된다.
JDBC는 자바 데이터베이스 표준으로 표준인터페이스에 맞게 개발을 한다.
장점 5 - 서로 관계없는 클래스들끼리도 관계를 맺어줄 수 있다.
상속계층도 속에서 공통점을 찾을 수 없을 때 특정 클래스들을 인터페이스를 구현하게 바꿔주면 그들끼리 관계를 맺어 줄 수 있다.
7. default 메서드
인터페이스의 원칙
인터페이스는 추상메서드만 가질 수 있다.
but static 메서드, default 메서드를 JDK 1.8부터 추가했다.
static은 원래 독립적, 인스턴트 변수도 쓰지 않아서 자체가 독립적이라 인터페이스 어디에도 포함되지 못할 이유가 없었는데 인터페이스의 원칙을 단순화하려고 뺐던 것이다.
인터페이스의 문제점
인터페이스에 새로운 추상메서드를 추가하면 해당 인터페이스를 구현하고 있는 클래스들 전부 다 수정이 불가피하다.
해결책 - 디폴트 메서드
- 1번 문제에 대한 해결방법은 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야 한다.
- 2번 문제는 조상클래스의 메서드가 상속되고 디폴트 메서드는 무시된다.
- 결국 직접 오버라이딩 하면 해결된다.
오버라이딩이란 상속관계에 있는 클래스에서 상위클래스의 메서드를 하위클래스에서 재정의 하는 것을 말한다.
이것 또한 오래전에 공부했던 내용이라 복습 겸 포스팅해 봤다.
바로바로 올려야 더 정리가 잘 될 것 같다.
앞전 포스팅인
2024.01.13 - [자바] - [자바] 추상클래스(Abstract Class)
[JAVA] 추상클래스(Abstract Class)
목차 추상클래스란? 추상클래스의 특징 추상클래스 작성 추상클래스는 왜필요한가? 1. 추상클래스란? 미완성 설계도 추상메서드를 하나 이상 갖고 있는 클래스 추상메서드 abstract + 리턴타입 +
goharry.tistory.com
이거랑 잘 비교해서 정리하면 좋을 것 같다.
'자바' 카테고리의 다른 글
[JAVA] 단언문 Assert (0) | 2024.12.24 |
---|---|
[Java] for문 - 향상된 for문 (0) | 2024.02.03 |
[Java] 원 만들기 (0) | 2024.02.01 |
[JAVA] 추상클래스(Abstract Class) (1) | 2024.01.13 |