백엔드/JAVA

객체 지향 프로그래밍 이론(6)

두개의 문 2023. 5. 16. 12:22
인터페이스

 

- 인터페이스 ( Interface ) : 객체의 사용방법을 정의한 것

 · 일종의 추상클래스 

 · 추상클래스보다 추상화 정도가 높음 → 오직 추상메서드와 상수만을 멤버로 가질 수 있음

 

- 추상클래스와의 비교

 · 추상클래스 : 부분적으로만 완성된 '미완성 설계도'

 · 인터페이스 : 구현된 것은 아무것도 없고 밑그림만 그려져 있는 '기본 설계도'

  → 다른 클래스를 작성하는데 도움 줄 목적으로 작성

 

 

▷ 인터페이스 선언

  - class 대신 interface 키워드 사용

[ public ] interface 인터페이스이름 {
         
           // ① 상수 필드
              public static final 타입 상수이름 = 값 ;          
             → 생략 가능 ( 생략된 제어자는 컴파일 시, 컴파일러가 자동적으로 추가시킴 )
           // ② 추상클래스 : 메서드의 선언부만 있고, 구현부는 없는 상태 ( 미완성 클래스 )
              public abstract 메서드이름 ( 매개변수 목록 ) ;
             → 생략 가능 ( 생략된 제어자는 컴파일 시, 컴파일러가 자동적으로 추가시킴 )
              ※ static메서드와 디폴트 메서드는 예외 ( JDK1.8부터 )
}

  - 인터페이스의 경우, 추상클래스를 포함하고 있으므로 객체 생성 불가

    ∴ 생성자 가질 수 없음

 

 ① 상수 필드 선언

 - 인터페이스는 객체 사용 방법을 정의한 것이므로 실행 시 데이터를 저장할 수 있는 필드 선언 불가

    단, 상수 필드 선언 가능 → 인터페이스의 고정된 값이므로 실행 시에 변경 불가

 -  인터페이스에서 선언된 필드는 모두 public static final의 특성을 가짐

    → 생략 시, 컴파일 과정에서 자동으로 추가됨

[ public static final ] 타입 상수이름 = 값 ;

 

 ② 추상 메소드 선언

 - 인터페이스에 선언된 추상 메소드는 모두 public abstract의 특성을 가짐

    → 생략 시, 컴파일 과정에서 자동으로 추가됨

  [ public abstract ] 리턴타입 메소드이름 ( 매겨변수,  ... ) ;

 


▷ 인터페이스 구현클래스

 - 인터페이스 그 자체로는 인스턴스를 생성할 수 없음 → 추상메서드의 구현부를 만들어주는 클래스가 필요

 - 객체는 인터페이스에서 정의된 추상메서드와 동일한 메서드 이름, 매개타입, 리턴 타입을 가진 실체 메소드를 반드시 가

지고 있어야 함

 - 인터페이스를 구현한다는 의미에서  'implements'를 사용

[ public ] class 클래스이름 implements 인터페이스 이름 {
              // The type CCalc must implement the inherited abstract method ICalc.add(double, double)
                 → 상속받은 추상클래스의 구현부를 완성시켜야 한다는 의미
 
                 빨간 에러표시줄 → add umimplemented methods 클릭 → 자동생성
                 또는 직접 작성
}

 

※ 구현 클래스에서 인터페이스의 추상 메소드에 대한 실체 메소드 작성 시 주의할 점

    - 인터페이스의 모든 메소드는 기본적으로 public 접근 제한 가짐

      → public 보다 더 낮은 접근 제한으로 작성될 수 없음

    - public 생략 시, 컴파일 에러 발생 ( Cannot reduce the visibility of the inherited method )

 

※ 구현 클래스에서 인터페이스의 메서드 중 일부만 구현할 경우, abstract를 붙여서 추상클래스로 선언해야 함

 

▷ 실행 클래스 

 - 인터페이스로 구현 객체를 사용하려면, 인터페이스 변수를 선언 후, 구현 객체를 대입해야 함

  → 인터페이스 변수는 참조변수이므로, 구현 객체의 주소가 저장됨

인터페이스 변수 = 구현객체 ; 
ex ) RemoteControl rc = new Tv();

 

 

▷ 인터페이스를 이용한 다형성

 ① 인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스 참조 가능 / 인터페이스 타입으로의 형변환도 가능

Fightable f = ( Fightable ) new Fighter();

 ② 메서드의 매개변수의 타입으로 사용

void attack ( Fightable f ){
             // 생략
}

→ 메서드 호출 시, 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 함

 

 ③ 메서드의 리턴타입으로 지정

Fightable method() {
          Fightable f = new Figher( );
          return f ;
}

// Fighter 클래스가 Fightable 인터페이스를 구현했다는 가정

리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것

  ∴ return문에서 인터페이스를 구현한 클래스의 객체 주소를 반환함

 

 

▷ 인터페이스의 장점

 - 개발시간 단축 가능

 - 표준화 가능

 - 서로 관계없는 클래스들에게 관계를 맺어줄 수 있음

 - 독립적인 프로그래밍 가능

'백엔드 > JAVA' 카테고리의 다른 글

H2 데이터베이스 연결 (1)  (0) 2023.05.22
👉🏻 에러의 종류 및 에러 처리  (0) 2023.05.18
13일차 수업 기록  (0) 2023.05.15
객체 지향 프로그래밍 이론(4)  (0) 2023.05.12
MVC 패턴 개념  (0) 2023.05.11