42_JAVA Study 06

수빈·2021년 12월 10일
0

42JAVA

목록 보기
9/9
post-thumbnail

6주차 서브젝트

1. 인터페이스

#인터페이스 #인터페이스구현 #인터페이스란무엇인가? #인터페이스에선언된변수는? #인터페이스와다형성

2. 인터페이스의 여러 요소들

#상수 #디폴트메서드 #디폴트메서드 재정의 하기 #static메서드 #private메서드

인터페이스

동일한 목적 하에 동일한 기능을 수행하게 강제하는 것이 인터페이스의 역할이자 개념
자바의 다형성을 극대화하여 개발 코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 인터페이스를 사용한다

인터페이스는 interface 키워드를 통해 선언할 수 있으며 implements 키워드를 통해 일반 클래스에서 인터페이스를 구현할 수 있다

💡 또한, JAVA8 이전까지는 상수, 추상 메소드만 선언이 가능하지만 (상수, 추상 메소드만 가능하게 했다는 것을 통해 그만큼 강제성이 강했다는 것을 유추할 수 있다) JAVA8부터 디폴트메소드, 정적 메소드가 추가되었다 (디폴트메소드, 정적 메소드를 통해, 구현 강제성 안에 유연함을 심었다고 우선 이해하자)
public interface 인터페이스명 {
		//상수		
		타입 상수명 =; -> 인터페이서에서 값을 지정. 바꾸지 말고 제공한 값만 참고할 것 (절대적)
		
		//추상 메소드			
		타입 메소드명(매개변수, ... ); -> 가이드만 준다. 추상 메소드를 오버라이팅해서 재구현할 것 (강제적)
		
		//디폴트 메소드			
		default 타입 메소드명(매개변수, ... ){	-> 인터페이스에서 기본적으로 제공. 수정 가능 (선택적)
		  //구현부
		} 
		
		//정적 메소드			
		static 타입 메소드명(매개변수) {	-> 인터페이스에서 제공해 주는 것으로 무조건 사용해야 함 (절대적)	
		  //구현부			
		}
}

절대적 - 변경하면 안 된다
강제적 - 인터페이스를 implements하지 않으면 피할수는 있기에 강제적이라 표현

특징

  • class 가 아닌 interace 키워드 사용
    • 파일도 class가 아닌 interface로 생성 가능
    • public과 default 접근제어자 사용 가능
      • 클래스와 비슷한 속성
  • 멤버 변수는 항상 public static final 이다
    • 인터페이스에는 클래스 멤버 변수밖에 생성하지 못한다
    • 인터페이스는 객체를 생성하지 않기 때문에 객체 멤버 변수가 없다
      • 객체를 생성하지 않기 때문에 생성자도 없다
    • public static final 키워드는 생략 가능
  • 멤버 메소드는 항상 public abstract 이다
    • 정의상으로 모든 메서드가 추상 메소드인 클래스이기 때문에 당연함
    • 오버라이딩을 위한 메서드이기 때문에 private 메소드는 의미가 없다
    • public abstract는 생략 가능하다
  • 정적 메소드도 선언 가능하다
    • 정적 메소드는 추상 메소드가 될 수 없다
      • 정적 메소드는 구현부가 있어야 한다
    • 정적 메소드는 오버라이딩할 수 없다
  • 인터페이스의 상속은 implements 키워드를 사용한다
  • 클래스는 하나만 상속할 수 있으나 인터페이스는 여러 개를 구현 가능
    • extends 하고 하나의 클래스만 적을 수 있지만, 인터페이스는 implements하고 여러 클래스를 적을 수 있다
      • 이때 구현한 인터페이스들의 메소들을 구현 받은 클래스에서 모두 구현해야 함
    • 이를 통해 다중 상속처럼 사용할 수 있다
      • TVCR예제
  • 인터페이스명을 자료형으로 하여 구현체의 객체를 참조할 수 있다
    • 상속 관계의 경우와는 다르게 인터페이스의 객체는 생성되지 않는다
    • 그러나 메소드는 오버라이딩하기 때문에 가상 메소드 호출은 일어난다
    • 이를 통해 다형성을 구현할 수 있다
  • 추상 메소드가 없다면 구현체에서 메소드 구현을 안 해도 된다
  • 인터페이스는 객체를 생성할 수 없다
interface IFoo{
    public static final int MEMBER_VAR = 10; // (상수는 대문자와 '_'조합)
                                            // public static final 생략 가능

    public abstract void methodA(int param); // public abstract 생략가능
    void methodB(int param); // public abstract
}

class Foo implements IFoo{

    @Override
    public void methodA(int param) {
        System.out.println(param);
    }

    @Override
    public void methodB(int param) {
        System.out.println(param);
    }
}
  • 인터페이스의 이름 예시
    • 1) interface ifoo < class Foo
      • 상속하는 자식에서 부모쪽으로 화살표한다
    • 2) interface Printable ← class Bar
    • 1)과 같이 인터페이스명에 대문자 I를 붙여서 구분한다
      • 혹은 2)와 같이 형용사로 표현하기 좋은 이름은 그냥 제목으로 표현

썸네일: oneook

profile
42Seoul -soooh ~ 2022.04

0개의 댓글