추상 클래스와 인터페이스
추상 함수
public abstract void move();
Java
복사
•
내용 구현 안 하는 메소드
추상 클래스
public abstract class Animal{
public abstract void move();
}
Java
복사
•
추상메소드가 1개 이상 있을 때 class앞에 abstract가 붙는다.
•
추상클래스는 객체 생성이 안된다.
•
추상클래스의 메소드를 사용할려면
◦
자손이 추상클래스를 상속받는다.
◦
메소드를 오버라이딩을 한다.
인터페이스
인터페이스의 역할
•
인터페이스는 객체의 사용 방법을 정의한 타입
•
다형성을 구현하는 매우 중요한 역할을 한다.
인터페이스 선언
[public] interface 인터페이스 이름 {...}
Java
복사
•
class 이름 작명하는 것과 비슷하다.
•
인터페이스는 상수와 메소드만을 구성요소로 가진다.
◦
데이터를 저장하는 필드는 가질 수 없다.
•
객체를 생성할 수 없다.
◦
생성자를 작성할 수 없다.
•
자바 8버전부터 디폴트 메소드와 정적 메소드도 선언 가능
인터페이스 구성 요소
1.
상수필드
a.
상수는 public static final 타입 상수명 = 값으로 선언
b.
무조건 초기화 해야한다.
2.
추상 메소드
a.
인터페이스의 추상 메소드는 public abstract의 특성을 가지기 때문에 생략을 해도 컴파일 과정에서 붙게 된다.
3.
디폴트 메소드
a.
클래스 인스턴스 메소드와 동일 (객체의 메소드라고 생각하면 된다.)
b.
public 특성을 갖기때문에 생략해도 컴파일 과정에서 붙게 된다.
4.
정적 메소드
a.
public 특성을 갖기때문에 생략해도 컴파일 과정에서 붙게 된다.
b.
선언한 인터페이스 이름으로 바로 호출할 수 있다.
interface Name{
static void function1(){.....}
}
main(){
Nmae.function1 //이렇게 바로 호출이 가능하다.
}
Java
복사
인터페이스 구현
•
인터페이스의 추상메소드를 구현하는 클래스를 구현 클래스라고 한다.
•
구현 클래스로 생성한 객체는 구현 객체라고 한다.
public class 구현클래스명 implements 인터페이스명{....}
Java
복사
•
구현 클래스에서 인터페이스의 추상 메소드들에 대한 실체 메소드를 작성할 때는 public보다 낮은 접근 제한자를 사용할 수 없다.
•
추상 메소드를 오버라이딩하지 않으면 구현 클래스는 추상 클래스가 된다. 따라서 abstract를 붙여줘야 한다.
인터페이스 추상메소드 사용
interface Printable {
public abstract void print(String doc);
}
class SPrinterDriver implements Printable {
@Override
public void print(String doc) {
System.out.println("삼성프린터입니다.");
System.out.println(doc);
}
}
class LPrinterDriver implements Printable{
@Override
public void print(String doc) {
System.out.println("엘쥐 프린터 입니다.");
System.out.println(doc);
}
}
public class InterfaceTest {
public static void main(String[] args) {
Printable prn = new SPrinterDriver(); // 이러한 방식으로 추상메소드를 사용한다.
prn.print("출력해 주세요.");
}
}
Java
복사
•
인터페이스의 추상 메소드를 사용하기 위해서는 인터페이스 타입의 변수에 구현 객체를 대입해야 한다.
인터페이스 변수 = new 인터페이스(){
추상메소드 오버라이딩
}
Pintable prn = new Printable(){
@Override
추상메소드를 오버라이딩한다.
}
Java
복사
•
인터페이스 추상 메소드를 사용하기 위해 일회성 클래스를 만드는 것은 비효율적
•
구현 클래스를 만들지 않고 위같이 구현 객체를 바로 만들고 대입할 수 있다.
•
이것을 익명 구현 객체라고 한다.
•
익명 구현 객체를 생성하면 컴파일 시 자동으로 .class파일이 생성
디폴트 메소드 사용
•
디폴트 메소드는 인스턴스 메소드이기 때문에 구현 객체가 있어야 사용이 가능하다.
•
즉 Interface이름.디폴트메소드 직접 호출이 불가하다.
정적 메소드 사용
•
인터페이스 타입으로 바로 호출 가능
◦
ex) Interface이름.정적메소드
디폴트 메소드를 인터페이스에 추가하는 이유
•
인터페이스를 확장시키고 싶지만 추상 메소드를 추가할 경우 여러 구현 클래스에서 오류가 난다.
◦
추상메소드를 오버라이딩하지 않았기 때문이다.
•
이러한 문제로 디폴트 메소드를 추가하여 문제없이 확장시키기 위해 디폴트 메소드를 사용한다.
//이것은 자바다 책을 참고했습니다…..