티스토리 뷰

📌 230802 TIL : 자바 인터페이스 정리 

 


1. 인터페이스는 왜 쓰는가. 

인터페이스의 모든 변수는 final로 선언된다. 

클래스나 프로그램이 제공하는 기능을 명시적으로 선언하기 때문에, 일종의 클라이언트 코드와의 약속이다. 

클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있다. 

 

또한 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메소드를 구현했다는 뜻이다. 

 

 

2. Jdbc 인터페이스?

오라클 DB나 MYSQL 같은 데이터베이스와 자바와 연결하기 위해서는 connection이라는 인터페이스가 필요하다.

자바는 connection 인터페이스를 선언해놓고, 오라클같은 데이터베이스 기업은 그 인터페이스의 기능을 구현한다. 

이렇듯 인터페이스는 매우 중요하다!

 


3. 인터페이스 예제 : Dao 구현해보기.

하위의 구조로 UserInfoDao를 구현하였다. 

 

📝 UserInfo 정보

private String userId, password, userName;

 

📝 UserInfo 인터페이스, 그를 구현한 오라클/MYSQL 클래스

//UserInfoDao 인터페이스
public interface UserInfoDao {
    void insertUserInfo(UserInfo userInfo);
    void updateUserInfo(UserInfo userInfo);
    void deleteUserInfo(UserInfo userInfo);
}

//위 인터페이스를 구현한 오라클 메소드 
public class UserInfoOracleDao implements UserInfoDao {
    @Override
    public void insertUserInfo(UserInfo userInfo) {
        System.out.println("Insert into Oracle Db user = " + userInfo.toString());
    }

    @Override
    public void updateUserInfo(UserInfo userInfo) {
        System.out.println("Update into Oracle Db user = " + userInfo.toString());
    }

    @Override
    public void deleteUserInfo(UserInfo userInfo) {
        System.out.println("Delete into Oracle Db user = " + userInfo.toString());
    }
}

//위 인터페이스를 구현한 MYSQL 인터페이스 
public class UserInfoMySqlDao implements UserInfoDao {
    @Override
    public void insertUserInfo(UserInfo userInfo) {
        System.out.println("Insert into MySql Db user = " + userInfo.toString());
    }
    @Override
    public void updateUserInfo(UserInfo userInfo) {
        System.out.println("Update into MySql Db user = " + userInfo.toString());
    }
    @Override
    public void deleteUserInfo(UserInfo userInfo) {
        System.out.println("Delete into MySql Db user = " + userInfo.toString());
    }
}

 

📝 db.properties 파일: 테스트 용으로 임시로 만들어주었다. (💡 src 폴더 밖에 두어야한다! )

 

📝 UserInfoClinet.class 테스트 코드 

public class UserInfoClient {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("db.properties");
        Properties prop = new Properties();
        prop.load(fis);

        String dbType = prop.getProperty("DBTYPE");

        UserInfo userInfo = new UserInfo();
        userInfo.setUserId("1000");
        userInfo.setUserName("송강");
        userInfo.setPassword("12345678");

        UserInfoDao userInfoDao = null;

        if (dbType.equals("ORACLE")) {
            userInfoDao = new UserInfoOracleDao();
        } else if (dbType.equals("MYSQL")){
            userInfoDao = new UserInfoMySqlDao();
        } else {
            System.out.println("db error!");
            return;
        }

        userInfoDao.insertUserInfo(userInfo);
        userInfoDao.updateUserInfo(userInfo);
        userInfoDao.deleteUserInfo(userInfo);

    }
}

오라클 DB를 인식하여, UserInfoOracleDao 가 실행됨을 알 수 있다.

 

 

4. 인터페이스의 Default Method, Static Method, private Method

 

💡 디폴트 메소드란

메소드 앞에 디폴트가 붙는다. 인터페이스에서 구현이 가능한 부분으로 해당 인터페이스를 구현하는 클래스들은 공통으로 사용이 가능하다. 또한 재정의도 가능하다. 

자바 8부터 사용이 가능해졌는데, 왜 필요하냐면, 만약 인터페이스에 추상메소드를 하나 더 추가하면 모든 구현 클래스에서 구현을 해야한다. 이러한 번거로움을 막기 위해 default method 를 추가하면 구현 클래스에서 추가적인 구현을 안 해도 된다. 

 

💡 Static 메소드란

인스턴스 생성과 상관 없는 인터페이스 타입으로 사용할 수 있는 메소드이다.

재정의가 불가능하며, 보통 디폴트 메소드를 돕는 역할을 함. (helper method라고도 함)

 

💡 private 메소드란

디폴트나 static 메소드에서 사용하기 위한 메소드로, 재정의가 불가능하다. 오로지 인터페이스 내에서만 사용이 가능하다.

 

📝 코드 예시 Calc interface


public interface Calc {
    double PI = 3.14;
    int ERROR = -999999999;
    int add(int n1, int n2);
    int sub(int n1, int n2);
    int mul(int n1, int n2);
    int div(int n1, int n2);
    
    default void description() {
        myMethod(); //private method
        myStaticMethod(); //private static method
        System.out.println("정수의 사칙연산을 제공합니다. ");
    }
    static int total(int[] arr) {
        return Arrays.stream(arr).sum();
    }
    
    //재정의 x 단지 인터페이스 내에서만 사용이 가능함.
    private void myMethod() {
        System.out.println("Calc.myMethod");
    }
    private static void myStaticMethod() {
        System.out.println("Calc.myStaticMethod");
    }
}

 

📝 Test Code

public class CalcTest {
    public static void main(String[] args) {
        Calc calc = new CompleteCalc(); //Calc 인터페이스를 구현함. 
        calc.description(); //디폴트 메소드
        System.out.println("1+2+3 = " + Calc.total(new int[] {1,2,3})); //static 메소드
    }
}