JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter3

인터페이스(interface)

giggs 2022. 1. 4. 16:44

 

 

인터페이스란?

  • 모든 메서드가 추상 메서드로 선언됨 public abstract
  • 모든 변수는 상수로 선언됨 public static final
interface 인터페이스 이름{

    public static final float pi = 3.14F;
    public void makeSomething();
}

아무것도 안쓴다고해도 public abstract, public static final 로 적용

 

자바 8부터 디폴트 메서드(default method)와 정적 메서드(static method) 기능의 제공으로 일부 구현 코드가 있음

 


인터페이스 정의와 구현

 

클래스가 인터페이스를 구현한다. Calculator ---> Calc 점선 화살표

 

 

Calc interface 생성

 

 


 

Calc - interface 구현한 Calculator - class 생성

 

 


 

Calc - interface 구현한 Calculator - class를 상속받은 CompleteCalc - class 생성

 


 

test class ----

 

calc 타입으로 만들어서 calc 메서드 들만 사용할 수 있다.

 

CompleteCalc는 Calc 타입이 구현된 타입 상속

인터페이스형의 메서드 적용돼서 출력 잘 됨을 확인

 

구현 상속이 아닌 타입 상속 - 인터페이스의 타입이다.

인터페이스는 구현부가 없다. 따라서 모호성이 없다.

다중 class 상속 가능

 


 

인터페이스 구현과 형 변환

 

  • 인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환할 수 있음

      Calc calc = new CompleteCalc();

  • 상속에서의 형 변환과 동일한 의미
  • 클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현할 수 있음 ( cf. extends)
  • 형 변환되는 경우 인터페이스에 선언된 메서드만을 사용 가능함

 

 

 


 

인터페이스는 왜 쓰는가?

리모컨 같은 것도 인터페이스. TV와 사람을 연결해주는 통로 어떤 연결 점을 인터페이스 ( 추상적 )

 

인터페이스가 하는 일

  • 클래스나 프로그램이 제공하는 기능을 명시적으로 선언
  • 일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세(specification)
  • 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있음
  • 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미임
  • 인터페이스를 구현한 다양한 객체를 사용함 - 다형성
  • 예) JDBC 인터페이스

Calc - interface 구현한 Calculator - class를 상속받은 CompleteCalc - class 생성

 

사용하는 쪽 프로그램을 클라이언트

제공하는 쪽은 서버 혹은 모듈이라 함 

 

서버를 쓰는 방법을 적어 놓은 인터페이스  - Calc

 

클라이언트는 서버가 어떻게 구현되어있는지 알 필요 없다.

- Calculator와 CompleteCalc로 구현되었는지 코드는 어떻게 구현되었는지 알 필요 없다.

 

쓰는 방법인 인터페이스만 보고 사용한다.

- Calc 인터페이스의 add, substract, times, divide 사용 법만 보고 사용한다.

 

 

인터페이스를 구현한 클래스가 여러 개일 수 있지만

- Calculator(add, substract 구현), CompleteCalc(times, divide 구현)

 

클라이언트가 쓸 때 사용하는 방법이 바뀌진 않는다.

- Calc 인터페이스의 add, substract, times, divide 사용 법만 보고 사용한다

 

인터페이스에 있는 명시된 방식으로만 쓰면 된다.

int add(int num1, int num2);
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);

 


 

 

인터페이스를 활용한 다형성 구현 (dao 구현하기)

 

 

 

버전 다르게 사용하거나 여러 버전 사용할 때 

각각 코드 만들어서 관리하면 overhead 

버전 관리 / 기능 추가 / 디버깅하기도 어렵다.

 

하나의 코드 소스 안에서 해결하면 좋다. 

방법은 1개의 인스턴스를 정의해 놓고

그거를 오라클 버전으로 mysql 버전으로 등으로 구현해서 관리한다.

 

하나의 솔루션에서 리플레이스 가능하고 여러 가지 값을 읽어드리고 할 수 있다.

 

똑같은 인터페이스를 통하여 메서드를 호출하지만 버전에 맞는 인스턴스 메서드에 따라 돌아가고 출력된다!

 


  • DB에 회원 정보를 넣는 dao(data access object)를 여러 DB 제품이 지원될 수 있게 구현함
  • 환경 파일(db.properties)에서 database의 종류에 대한 정보를 읽고 그 정보에 맞게 dao 인스턴스를 생성하여 실행될 수 있게 함
  • source hierarchy

 

 

사용자 정보 넣고 빼고 할 거니까 UserInfo에 대한 java파일

dao class 크게 2개 mysql / oracle 연결은 아니고 콘솔 아웃까지만

 

 얘네들을 쓰는 클라이언트 프로그램을 웹 쪽으로

userinfo.web으로 메인으로 돌려본다. 실제 웹 화면이 없으므로

 

 

 

 

 

패키지는 hierarchy를 가지고 있다.

지금까지는 패키지를 소스의 구분, 단위 구분에만 썼었는데

실제로는 hierarchy를 가지면서 어떤 식으로 관리를 하느냐의 고민이 필요하다

프로젝트 시작하고 설계할 때 어드 코드를 어디에 두고 할지.

 


 

review

인터페이스
모든 메서드는 추상 메서드 / 모든 변수는 상수
클래스가 인터페이스를 구현한다는 개념
클라이언트에게 서버를 사용할 수 있게 알려주는 명세

클래스를 상속받아 확장하고 재정의하고 했었는데
인터페이스라는 구현 코드가 없고 사용하는 방법만 나와있는 것을 배웠다.
사용자는 알려준 방법대로만 사용하면 어떻게 구현되고 구성되어있는지 알 필요는 없다.
플랫폼들이 이런 것들이었구나 생각이 들었다.
입력하라는 곳에 입력하고 클릭해서 쉽게 사용하고 했는데
그 뒤에는 구현된 코드들과 여러 클래스들이 작동하고 있는 것이었다.

인터페이스의 기능들을 작동하게 구현하는 것이 백엔드 개발자!
나도 능력을 쑥쑥 키워서 백엔드 개발자가 되고 싶다.