표준
이 있는 이유와 같다.한 개의 클래스, 여러개의 인터페이스
// 🚀 "동물의 기본 기능" 인터페이스
interface Animal {
void eat();
}
// ✈ "나는 기능" 인터페이스
interface Flyable {
void fly();
}
// ✅ 다중 구현
class Bird implements Animal, Flyable {
public void eat() { ... }
public void fly() { ... }
// 추가적으로 land() 메서드도 가능하지만 필수는 아님
public void land() { ... }
}
한 개의 인터페이스, 여러개의 인터페이스
// 1. 기본 인터페이스: 동물의 기본 기능
interface Animal {
void eat();
}
// 2. 추가 인터페이스: 나는 기능
interface Flyable {
void fly();
}
// 3. ✅ 다중 상속새로운 인터페이스: 동물 + 나는 기능
interface FlyableAnimal extends Animal, Flyable {
void land(); // 추가 기능
}
public static final
로 선언된다.static
으로 선언되기 때문에 인스턴스화 하지 않아도 사용 가능하다.public interface Config {
int POPULATION = 100; // public static final 로 선언됩니다.
}
접근제어자
를 통해 구현 가능💡 접근제어자 ?
- 접근제어자는 클래스, 변수, 메서드, 생성자의 접근 범위를 제한하는 키워드
extends
키워드를 사용abstract
키워드 사용고양이 → 동물 → 생명체
와 같이 계층적 특징을 활용하여 유지보수성을 높임부모타입
으로 자식타입
을 다룰 수 있는 이유는 자동으로 형변환(Casting)
이 발생했기 때문이다.
자식타입 → 부모타입: 업캐스팅(UpCasting
)
업캐스팅은 자식 클래스의 고유기능을 활용할 수 없다.
따라서, 자식 클래스의 고유 기능을 사용하려면 다운캐스팅
이 필요하다.
public class Main {
public static void main(String[] args) {
// 다형성 활용
Animal animal = new Cat(); // ✅ 자동 형 변환
animal.exist(); // ✅
animal.makeSound(); // ✅
animal.scratch(); // ❌ 사용 불가
}
}
부모타입 → 자식타입: 다운캐스팅(DownCasting
)
다운캐스팅으로 자식 클래스의 고유 메서드를 사용할 수 있다.
단, 잘못된 다운캐스팅은 컴파일단계에서 감지할 수 없으므로 반드시 instanceof
키워드를 사용해야 한다.
public class Main {
public static void main(String[] args) {
Animal animal2 = new Dog();
if (animal2 instanceof Cat) {
Cat cat = (Cat) animal2; // ✅ 다운캐스팅 (부모Animal -> 자식Cat)
cat.scratch(); // ✅ 자식 클래스의 기능 활용 가능
} else {
System.out.println("객체가 고양이가 아닙니다.");
}
}
}
출처
스파르타 코딩클럽 자바 문법 종합반 2주차