[java] 인터페이스와 제네릭

young-gue Park·2023년 7월 25일
0

Java

목록 보기
7/11
post-thumbnail

⚡ 인터페이스와 제네릭


📌 인터페이스(interface)

🔷 서로 다른 장치들을 연결시켜 주는 규격

⭐ 인터페이스 특징

  • 완벽히 추상화된 설계도
  • 클래스와 유사하게 작성이 가능 (class 대신 interface 키워드 사용)
  • 모든 변수는 상수이다.
  • 모든 메서드가 추상 메서드 (JDK8부터 default method, static method 추가)
public interface interName {
	public static final int NUMBER1 = 100;
    /*    (생략가능)  */ int NUMBER2 = 100;

	public abstract void method1(String str);
    /* (생략가능) */ void method2(int number);
}

🌟 상수에 붙는 public static final과 메서드에 붙는 public abstract는 필수적이지만 작성 시 생략은 가능하다.

  • 다중 상속이 가능하다!
  • 메서드의 구현부가 없기 때문에 모호함의 걱정이 없다.
  • 인터페이스는 그 자체로 인스턴스를 생성할 수 없음.
  • 인터페이스 내에 있는 메서드를 구현할 클래스가 필요하며 extends 대신 implements 키워드를 사용하여 구현 클래스 작성
class Circle implements Shape {}

⭐ 인터페이스 구현

  • 인터페이스를 구현하는 클래스는 추상 메소드를 반드시 오버라이딩해야 한다.

    ❗ 구현하지 않을 경우 abstract 클래스로 표시해야한다.

  • extends를 이용하여 상속이 가능하며 다중 상속이 가능
interface Chef extends Movable, Cookable {
	// ...
}

JFoodChef j = new JFoodChef();
Chef ch = new JFoodChef(); // 다형성 적용

🌟 extendsimplements 동시 사용이 가능하다.

  • default method
    • 인터페이스에 구현부가 있는 메서드를 작성할 수 있음.
    • 메서드 앞에 default라는 키워드를 작성 해야함.
    • public 접근제한자를 사용해야 하며 생략 가능.
interface Chef extends movable, Cookable {
	public default void info() {//...};
}
  • 디폴트 메서드의 문제점
  1. 여러 인터페이스가 이름이 중복될 수 있다.
  2. 조상 클래스의 메서드와 이름이 겹칠 수 있다.

    ❗ 그래서 무조건 오버라이딩을 해야한다.

  • static method
  • 클래스의 static 메서드와 사용방법이 동일함.
  • 인터페이스 이름으로 메서드에 접근하여 사용
interface Chef extends movable, Cookable {
	public static void info() {//...};
}

// Test
Chef.info();

⭐ 인터페이스의 필요성

  1. 표준화 처리 가능
  2. 개발 기간 단축 가능
  3. 서로 관계가 없는 클래스들에게 인터페이스를 통해 관계를 맺을 수 있음.
  4. 인터페이스를 통한 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원
  5. 독립적 프로그래밍 가능

⭐ 클래스와 인터페이스의 차이

클래스인터페이스
특징class 키워드를 사용하여 정의, 필드와 메서드, 생성자로 이루어짐interface 키워드를 사용하여 정의, 상수와 추상메소드로 이루어짐.
관계인터페이스를 구현함클래스에 의해 구현됨
멤버 변수선언 가능상수만 가능
다중 상속클래스는 하나의 클래스만 상속 가능인터페이스는 여러 개의 인터페이스 상속 가능
다중 구현클래스는 여러 개의 인터페이스를 다중으로 구현 가능
인스턴스생성 가능생성 불가
타입타입으로 사용 가능타입으로 사용 가능

⭐ 추상클래스와 인터페이스의 차이

추상클래스인터페이스
객체 생성불가불가
일반 메소드가능불가
일반 필드가능불가(상수만 가능)
메서드abstract를 붙여야만 추상 메소드모든 메서드는 추상 메서드
사용추상적인 클래스의 성격을 가질 때, 서로 유사한 클래스 사이에 코드를 공유하고 싶을 때서로 관련 없는 클래스 사이에 공통으로 적용되는 인터페이스를 구현하기를 원할 때, 객체의 성격이라기보다 어떤 기능을 구현하고 있다는 약속의 성격이 있을 때
공통점특정 기능의 구현을 강제하고 싶을 때

📌 제네릭(Generic)

🔷 다양한 종류의 객체들을 다루는 메서드나 컬렉션 클래스에서 컴파일 시 타입을 체크해주는 기능

  • 객체의 타입 안정성을 제공한다.
  • 형 변환의 번거로움이 없어지므로 코드가 간결해진다.
  • 제네릭 클래스
  • 클래스를 정의할 때 클래스 안에서 자료형을 구체적으로 명시하지 않고 T와 같이 타입 매개변수를 이용하는 클래스

    🌟 타입 파라미터
    특별한 의미의 알파벳 보다는 단순히 임의의 참조형 타입을 말한다.

  • 선언 방법
    • 클래스 또는 인터페이스 선언 시 <>에 타입 매개변수 표시
class Box<T> {
	// ...
}

class Box<Red> {
	// ...
}
  • 제네릭 클래스 객체 생성
    • 변수와 생성 쪽의 타입은 반드시 일치해야 한다. (상속 관계에 있어도 마찬가지)
    Box<Student> box = new Box<Student>();
    • 추정이 가능한 경우 타입 생략 가능
    Box<Student>box = new Box<>();
    • 제네릭 타입을 지정하지 않고 생성이 가능하지만 권장 X

      🌟 자동으로 T는 Object가 됨.

 class Box<T> {
	private T t;
	
	public T getT() {
		return t;
	}
	
	public void setT (T t) {
		this.t = t;
	}
}

public class BoxTest {

	public static void main(String[] args) {
		Box<String> box = new Box<>();
		
		box.setT("HELLLO");
	}

}
  • 제한된 제네릭 클래스
    • 타입 문자를 사용할 타입을 명시하였지만 역시 모든 타입을 사용할 수 있는 문제가 발생
    • 구체적인 타입의 제한이 필요할 때 extends 키워드를 사용할 수 있음.
    • 클래스가 아닌 인터페이스로 제한할 경우도 extends 키워드 사용
    • 클래스와 함께 인터페이스 제약 조건을 이용할 경우 &로 연결
 class Box<T extends Person> { // person의 자손만 타입 지정 가능
	private T t;
	
	public T getT() {
		return t;
	}
	
	public void setT (T t) {
		this.t = t;
	}
}
  • 와일드 카드 이용
    • generic type에서 구체적인 타입 대신 사용
표현설명
Generic type<?>타입에 제한이 없음
Generic type<? extends T>T와 T를 상속받은 타입들만 사용 가능
Generic type<? super T>T와 T의 조상 타입만 사용 가능
profile
Hodie mihi, Cras tibi

0개의 댓글