-
Java abstract & interface쉽게 지나치는 개념/Java 2023. 1. 29. 23:59
public class Common { public static void main(String[] args) { Unit [] group = {new Marine(), new Tank(), new Dropship()}; for(int i=0; i < 3; i++) { group[i].move(100, 100); } } } abstract class Unit { int x,y; abstract void move (int x, int y); void stop() {/*"현재위치에 정지"*/}; } class Tank extends Unit { void move(int x, int y) { System.out.println(); } void siezeMode(){/*시즈모드 사용한다.*/}; } class Marine extends Unit{ void move(int x, int y) { System.out.println(); } void steamPack(){/*스팀팩을 사용한다.*/}; } class dropShip extends Unit{ void move(int x, int y) { System.out.println(); } void air(){/*공중을 난다.*/}; }
abstract class Unit { //미완성 클래스임.
int x,y;
abstract void move (int x, int y); // 자식 클래스들의 값들이 다르기 때문에 미완성 식으로 형성
void stop() {/*"현재위치에 정지"*/}; // 모두 동일한 값이 형성 되어있으므로 완전한 식으로 작성
}*완전한 클래스 작성시에 추상클래스에 작성되어 있는 미완성 메서드들이 없으면 완전한 클래스가 될수없다.
-완전한 클래스 작성을 위해서는 추상클래스에 있는 추상메서드 모두를 { }을 포함하여 완전한 메서드로 작성해주어야한다.
-위 코드에서 stop 은 공통적인 것이므로 빠져도 상관이 없고 상속 받았으므로 적용이 되어있음.
※ 인터페이스와 추상클래스의 차이점
-추상클래스는 일반 클래스인데 추상메서드를 가지고 있음 (일부 미완성)
-인터페이스는 완전 아무것도 없고 추상메서드만 가지고 있음 (완전 만들어져 있지않음)
인터페이스
인터페이스 : 추상메서드의 집합 -> 프로그래밍 관점
-구현된것이 전혀없는 설계도
-인터페이스는 다중상속이 가능하다.( 추상 메서드이므로, method의 몸체가 없기 때문이다.)
인터페이스의 구현 : 인터페이스에 정의된 추상메서드를 완성하는 것
class 클래스이름 implements 인터페이스 이름 {
//인터페이스에 정의된 추상메서드를 모두 구현해야한다.
}*만약 일부만 구현하는 경우에는 클래스 앞에 abstract를 붙여야 한다.
ex) class Fighter extends Unit implements Fightable{
//오버라이딩 규칙 : 조상 (public)보다 접근제어자가 범위가 좁으면 안된다.
public void move(int x, int y) { 내용생략 } // 오버라이딩 하는것인데 오버라이딩 규칙을 지켜주어야한다.
public void attack(Fightable f) { 내용생략 }
}
=> Unit클래스를 상속 받고 Fightable(부모는 아니지만 부모로 친다.) 인터페이스를 구현하고 있음
*다중상속문제가 발생할수 있으나, 인터페이스는 몸통부분이 없기때문에 다중상속 문제가 발생하지 않는다.
인터페이스의 장점
- 개발시간을 단축할수 있다.
- 변경에 유리한 유연한 설계가 가능하다.
- 표준화가 가능하다. ex) 데이터베이스 변경을 jdbc를 통해 용이하게 변경가능하다.
- 서로 관계없는 클래스들을 관계를 맺어줄수 있다.
default method
ex) interface MyInterface {
void method();
void newMethod();
}
↓
interface MyInterface {
void method();
default void newMethod() { } // 몸통생성
}
※ 디폴트메서드가 기존의 메서드와 충돌할 때의 해결책
1. 여러 인터페이스의 디폴트메서드간의 충돌
- 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 한다.
2. 디폴트 메서드와 조상클래스의 메서드간의 충돌
- 조상클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.