[JAVA] 14-2. 인터페이스의 상속 및 다형성

Re_Go·2024년 5월 27일
0

JAVA

목록 보기
18/37
post-thumbnail

1. 인터페이스도 상속이 가능하나요?

가능합니다. 그 이유는 인터페이스나 클래스나 결국 똑같은 객체 이기 때문이죠.

물론 클래스상속 간 자동 타입 변환과 강제 타입 또한 가능합니다.

public interface childInF extends ParantInf1, ParantInf1{
}

이때 인터페이스와 그 안의 필드 멤버 및 메서드는 물론, 인터페이스를 구현하는 클래스 쪽에서도 구현 할 멤버 메서드의 접근 제한자를 임의로 private이나 protected로 변경하는 것을 허용하지 않는 점(인터페이스의 특성을 고려하면 public에서 다른 접근 제한자로 변경되는 것은 말이 안됩니다만.)을 유념해야 합니다.

// 인터페이스 정의
public interface Vehicle {
    // 인터페이스의 상수
    int MAX_SPEED = 100; // public static final int MAX_SPEED = 100; 로 처리됨

    // 인터페이스의 메서드
    void start(); // public abstract void start(); 로 처리됨
    void stop();  // public abstract void stop(); 로 처리됨
}

// 인터페이스를 구현하는 클래스
public class Car implements Vehicle {
    // Vehicle 인터페이스의 상수 및 메서드 구현
    @Override
    public void start() {
        System.out.println("Car started");
    }

    @Override
    public void stop() {
        System.out.println("Car stopped");
    }

    // 상속 받은 메서드를 protected로 변경할 수 없음
    protected void start() { ... } // 에러: 인터페이스의 메서드는 protected가 될 수 없습니다.
}

2. 인터페이스에서의 다형성이란?

앞서 소개해드린 클래스의 다형성은 상속을 통해서 구현이 가능하다고 했는데요. 인터페이스의 다형성도 유사한 방식을 사용할 수 있습니다.

아래의 코드는 자동 형변환과 다형성을 설명하는 예시 코드입니다.

interface Act{
	void study();
}

class Student{
	//Act 인터페이스 타입의 student를 매개변수로 받으면 해당 매개변수를 받게되면 각각의 인스턴스들으니 Act 인터페이스타입으로 자동 형변환 되는데, 이때 해당 객체의 각각의 study 메서드를 호출합니다.
	void read(Act student) {
		student.study();
	}
}

class Cheolsu implements Act{
	public void study() {
		System.out.println("철수가 공부를 합니다.");
	}
}
class Younghee implements Act{
	public void study() {
		System.out.println("영희가 공부를 합니다.");
	}
}

public class school {
	public static void main(String[] args) {
	
	Student student = new Student();
	
	Cheolsu cheolsu = new Cheolsu();
	Younghee younghee = new Younghee();
	
	// 아래와 같이 타입 변환을 주지 않아도 각각의 객체에서 재정의 된 추상 메서드를 호출할 수 있지만
	cheolsu.study();
	younghee.study();
	// Student 클래스의 구현처럼 상속을 받는 공통의 인터페이스로 타입 변환을 한 뒤 해당 객체들의 메서드를 호출하게 할 수 있습니다.
	student.read(cheolsu);
	student.read(younghee);
    // 위의 코드들은 아래의 코드를 단축한 코드이기도 합니다.
    // Act student = new Cheolsu();
    // Act student = new younghee();
	}
}

그 외에 인스턴스 확인법이나 기타 사항들은 클래스의 상속과 유사합니다.

profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글