Interface

1c2·2024년 1월 19일
0

JAVA

목록 보기
8/13

추상 클래스 정의

  • 상속 관계 정의를 통한 클래스 정비
public class Vehicle {
	private int curX, curY;
	
	public void reportPosition() {
		System.out.printf("현재 위치: (%d, %d)\n)", curX, curY);
	}
	public void addFuel() {
        System.out.printf("모든 운송 수단은 연료가 필요");
    }
}

 public class ElectricCar extends Vehicle{
    private int curX, curY;
    @Override
    public void reportPosition() {
        System.out.printf("차종: %s: 현재 위치: (%d, %d)%n", this.getClass().getSimpleName(), curX, curY);
    }
    @Override
    public void addFuel() {
        System.out.printf("차종: %s: 연료 주입: %s%n", this.getClass().getSimpleName(), "충전");
    }
}

 public class DieselSUV extends Vehicle{
    private int curX, curY;
    @Override
    public void reportPosition() {
        System.out.printf("차종: %s: 현재 위치: (%d, %d)%n", this.getClass().getSimpleName(), curX, curY);
    }
    @Override
    public void addFuel() {
        System.out.printf("차종: %s: 연료 주입: %s%n", this.getClass().getSimpleName(), "경유");
    }
}

  • DieselSUV, ElectricCar는 모두 연료가 필요하므로 addFuel은 공통 모듈
    • 조상 클래스인 Vehicle에 정리하고 각 자손 클래스에서 override예정
    • Vehicle에서 힘들게 구현했지만 아무도 Vehicle의 addFuel()에 신경 쓰지 않음
      • addFuel()을 Vehicle에서 지우면?
    • 자손 클래스에서 반드시 재정의해서 사용되기 때문에 조상의 구현이 무의미한 메서드
      • 메서드의 선언부만 남기고 구현부는 ;으로 대체
      • 구현부가 없다는 의미로 abstract 키워드를 메서드 선언부에 추가
      • 객체를 생성할 수 없는 클래스라는 의미로 클래스 선언부에 abstract를 추가
abstract class Vehicle {
	private int curX, curY;
	
	public void reportPosition() {
		System.out.printf("현재 위치: (%d, %d)\n)", curX, curY);
	}
	public abstract void addFuel();
}

Vehicle.class를 위와 같이 수정한다.

  • abstract 클래스는 상속 전용 클래스
    • 클래스에 구현부가 없는 메서드가 있으므로 객체를 생성할 수 없음
    • 하지만상위 클래스 타입으로써 자식을 참조는 가능
// Vehicle v = new Vehicle(); <- 불가
Vehicle v = new DieselSUV(); <- 자식을 참조하는 것은 문제 없음
  • 조상 클래스에서 상속받은 abstract 메서드를 재정의 하지 않는 경우
    • 클래스 내부에 abstract 메서드가 있는 상황이므로 자식 클래스는 abstract 클래스로 선언되어야 함
    • 구현의 강제를 통해 프로그램을 안정시킴
      public class HorseCart extends Vehicle{
      	@Override
      	public void addFuel(){
      		System.out.println("건초를 줘야함");
      	}
      }

Interface

  • GUI
    • 프로그램과 사용자 사이의 접점

인터페이스 작성

  • 최고 수준의 추상화 단계 : 일반 메서드는 모두 abstract 형태
    • JDK 8 에서 default method와 static method 추가
  • 형태
    • 클래스와 유사하게 interface 선언
    • 멤버 구성
      • 모든 멤버변수는 public static final 이며 생략 가능
      • 모든 메서드는 public abstract 이며 생략 가능

인터페이스 상속

  • 클래스와 마찬가지로 인터페이스도 extends를 이용해 상속이 가능

  • 클래스와 다른 점은 인터페이스는 다중 상속이 가능

    • 헷갈릴 메서드 구현 자체가 없다.
    interface Fightable{
    	int fire();
    }
    
    interface Transformable{
    	void changeShape(boolean isHeroMode);
    }
    
    public interface Heroable extends Fightable, Transformable{
    	void upgrade();
    }

인터페이스 구현과 객체 참조

  • 클래스에서 implements 키워드를 사용해서 interface 구현
  • implements 한 클래스는
    • 모든 abstract 메서드를 override해서 구현하거나
    • 구현하지 않을 경우 abstract 클래스로 표시해야 함
  • 여러 개의 interface implements 가능
  • 다형성은 조상 클래스 뿐 아니라 조상 인터페이스에도 적용
public class IronManTest {
	public static void main(String[] args) {
		IronMan iman = new IronMan();
		Object obj = iman;
		
		Fightable f = iman;
		
		Transformable t = iman;
		Heroable h = iman;
	}
}
  • interface와의 관계도 is a 관계이지만 좀 더 세부적으로 is able to라고도 한다.
    • ~~할 수 있는 기능을 가지게 되는 관계
    • Serializable, Clonablem Comparable ...

Interface

Interface의 필요성

  • 구현의 강제로 표준화 처리 -> 손쉬운 모듈 교체 지원

    • abstract 메서드 사용
  • 인터페이스를 통하 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원

  • 서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장

  • 모듈 간 독립적 프로그래밍 가능 -> 개발 기간 단축

서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장

독립적인 프로그래밍으로 개발 기간 단축

  • 계산기를 구현하는 두 팀의 작업

default method

  • 인터페이스에 선언 된 구현부가 있는 일반 메서드
    • 메서드 선언부에 default modifier 추가 후 메서드 구현부 작성
      • 접근 제한자는 public으로 한정됨(생략 가능)
      interface DefaultMethodInterface{
      	void abstractMethod();
          
          default void defaultMethod(){
          	System.out.println("기본 메서드");
          }
      }
  • 필요성
    • 기본 interface 기반으로 동작하는 라이브러리의 interface에 추가해야 하는 기능이 발생
    • abstract 메서드는 모든 구현체들이 추가되는 메서드를 override 해야 함
    • default 메서드는 abstract가 아니므로 반드시 구현 해야 할 필요는 없어짐
  • default methid의 충돌
    • JDK 1.7이하의 java에서는 interface에 구현부가 없으므로 충돌이 없었음
    • 1.8부터 default method가 생기면서 동일한 이름을 갖는 구현부가 있는 메서드가 충돌
    • method 우선 순위
      • super class의 method 우선 : super class가 구쳐적인 메서드를 갖는 경우 default method는 무시됨
      • interface간의 충돌 : 하나의 interface에서 default method를 제공하고 다른 interface에서도 같은 이름의 메서드(default 유무와 무관)가 있을 때 subclass는 반드시 override해서 충돌 해결!

generics

generics

  • 다양한 타입의 객체를 다루는 매서드, 컬렉션 클래스에서 컴파일 시에 타입 체크

    • 미리 사용할 타입을 명시해서 형 변환을 하지 않아도 되게 함
      * 객체의 타입에 대한 안전성 향상 및 형 변환의 번거로움 감소
  • 클래스 또는 인터페이스선언 시 <>에 타입 파라미터 표시

    • Class_Name : Raw Type
    • Class_Name : Genegric Type
    public class Class_Name<T>{}
    public interface Interface_Name<T>{}
  • 타입

type 파라미터의 제한

  • 필요에 따라 구체적인 타입 제한 필요
    • 계산기 프로그램 구현 시 Number 이하의 타입(Byte, Short, Integer ... )로만 제한
      • type parameter 선언 뒤 extends와 함께 상위 타입 명시

0개의 댓글