특징
사용 이유? => 구현의 강제를 통해 프로그램의 안정성 향상
public interface MyInterface {
public static final int Member1 = 10;
int Member2 = 10;
public abstract void method1(int param);
void method2(int param);
}
인터페이스 extends를 이용해 상속가능(다중상속가능, 구현부가 없음)
객체 생성이 불가능
클래스가 인터페이스를 구현할 경우 extends 키워드가 아니라 implements 키워드를 이용
ex) interface Shape{} / class Circle implements Shape{}
인터페이스를 implements하는 하위 클래스는 추상 메소드를 반드시 오버라이딩 해야함
ex)
interface Chef{
void cook();
}
Class KFoodChef implements Chef {
@Override
public void cook(){
System.out.println("한식을 요리함.");
}
}
abstract class JfoodChef implements Chef {
}
- 인터페이스 다형성 적용
클래스 | 인터페이스 | |
---|---|---|
특징 | class 키워드를 사용해 정의 필드와 메서드, 생성자로 이루어짐 | interface 키워드를 사용해 정의 상수와 추상 메소드로 이루어짐 public static fianl생략, public abstract 생략 |
관계 | 인터페이스 구현함 | 클래스에 의해 구현 |
멤버 변수 | 선언 가능 | 상수만 가능 |
다중 상속 | 하나의 클래스만 상속가능 | 여러개의 인터페이스 상속 가능 |
다중 구현 | 여러 인터페이스로 다중구현 가능 | |
인스턴스 | 생성 가능 | 생성 불가 |
타입 | 타입으로 사용 가능 | 타입으로 사용가능 |
추상 클래스 | 인터페이스 | |
---|---|---|
객체 생성 | 불가 | 불가 |
일반 메소드 | 가능 | 불가 |
일반 필드 | 가능 | 불가(상수만 가능) |
메서드 | abstract를 붙여야만 추상 메서드 | 모든 메서드는 추상 메서드 |
언제 사용? | - 추상적 클래스의 성격을 가질 때, 서로 유사한 클래스 사이에 코드를 공유하고 싶을때 | - 서로 관련 없는 클래스 사이에 공통적으로 적용되는 인터페이스를 구현하고자 할때 ex) Comparable, Serializable, 객체(클래스)의 성격보다는 어떤 기능을 구현하고 있다는 약속의 성격 |
|공통점|특정 기능의 구현을 강제하고자 할 때|특정 기능의 구현을 강제하고자 할 때|
어떤 클래스의 특성을 그대로 갖는 새로운 클래스를 정의한 것
예시
public class Person {
String name;
int age;
public void eat() {
System.out.println("음식을 먹는다.");
}
}
public class Student {
String name;
int age;
String major;
public void eat() {
System.out.println("음식을 먹는다.");
}
public void study() {
System.out.println("공부를 한다.");
}
}
이처럼 Student는 person 클래스의 method와 속성값과 동일한 것을 가지고 있다. 이를 상속으로 해결하면
public class Student extends Person {
String major;
public void study() {
System.out.println("공부를한다");
}
}
public class Student extends Person {
String major;
public Student(String name, int age, String major) {
super(name,age);
this.major = major;
}
public void study() {
super.eat();
System.out.println("공부를한다");
}
public void eat() {
System.out.println("지식을 먹는다");
}
}
왼쪽이 오른쪽을 참조하는것
1. 왼쪽 조상(super) = 오른쪽 자식(child) => 묵시적 캐스팅
Person person = new Person();
Object obj = person;
Person person = new Student();
Student student = (Student)person;
형변환 생략 불가
고로 캡슐화의 가장큰 장점=> 정보 은닉
이 때문에 접근제한자가 필요함
수식어 | 클래스 내부 | 동일 패키지 | (다른 패키지내의) 하위클래스 | 다른 패키지 |
---|---|---|---|---|
private | O | |||
(default) | O | O | ||
protected | O | O | O | |
public | O | O | O | O |