[객체지향] 인터페이스

2024. 7. 8. 10:24

✅ 인터페이스

  • 인터페이스
    • 인터페이스란?
      → 개발 코드와 객체가 서로 통신하는 접점의 역할을 한다
      → 클라이언트 코드는 인터페이스를 보고 개발 진행 구현부는 알 필요가 없음
    • 모든 메서드가 추상 메서드로 선언된다 public abstract
      → 따로 선언하지 않아도 컴파일 과정에서 컴파일러가 자동으로 선언해준다
      → 자바 8부터 디폴드 메서드와 정적(Static) 메서드 기능의 제공으로 일부 구현 코드가 존재하긴함
    • 모든 변수는 상수로 선언된다
      → public static final, 데이터가 변경되지 않는다
      → 따로 선언하지 않아도 컴파일 과정에서 컴파일러가 자동으로 선언해준다
    • 구현 객체(클래스)에서 implements 키워드를 통해 인터페이스를 구현하는 클래스임을 알려준다
    • 인터페이스 메서드는 기본적으로 public 접근 제한자를 갖기 때문에 구현 클래스의 메서드 작성 시
      public 보다 낮은 접근 제한자는 사용이 불가능하다
    • 인터페이스간 상속은 클래스와 달리 다중 상속(extends)을 지원한다.
      또한 구현 코드의 상속이 아니므로 타입 상속이라 함
    • 클래스 상속(extends)과 인터페이스 구현(implements)이 동시에 사용 가능하다
      (다만, 클래스 상속은 단일 상속만 지원함 )
public interface 인터페이스 이름 {
	
	//변수 선언
	(public static final) float pi = 3.14F;
	
	//메서드 선언
	(public abstract) void makeSomething();
	
}

 

❗️ 인터페이스 내 메서드

  • 디폴트 메서드(자바8 이후)
    • 구현을 가지는 메서드로 인터페이스를 구현하는 클래스에서 공통으로 사용할 수 있는 기본 메서드
    • default 키워드 사용 → default void 메서드명(){..}
    • 기본적으로 public으로 선언되며, 필요에 따라 접근 제어자 변경 가능하다
    • 구현 객체(클래스)에서 재정의 가능
    • 디폴트 메서드가 중복 되는 경우는 구현하는 클래스에서 재정의 해야 한다
  • 정적(Static) 메서드(자바8 이후)
    • 인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드
  • private 메서드(자바9 이후)
    • 인터페이스를 구현한 클래스에서 사용하거나 재정의할 수 없다
    • 인터페이스 내부에서만 사용하기 위해 구현하는 메서드
    • default 메서드나 static 메서드에서 사용 
  • 인터페이스 예시코드 

public interface Calc {
	
	double PI = 3.14;
	int ERROR = -99999999;
	
	int add(int num1, int num2);
	int substract(int num1, int num2);
	int times(int num1, int num2);
	int divide(int num1, int num2);
	
}
public abstract class Calulator implements Calc{
	@Override
	public int add(int num1, int num2){
		return num1 + num2;
	}
	
	@Override
	public int abstract(int num1, int num2){
		return num1 - num2;
	}
}
public class CompleteCalc extends Calculator{
	
	@Override
	public int times(int num1, int num2){
		return num1 * num2;
	}
	
	@Override
	public int divide(int num1, int num2){
		if(num2 == 0)
			return ERROR;
		
		else 
			return num1 / num2;
	}
	public void showInfo(){
		System.out.println("모두 구현하였습니다");
	}
}
public class CalculatorTest{
	public static void main(String[] args){
		Calc calc = new CompleteCalc();
		int num1 = 10;
		int num2 = 2;
		
		System.out.println(num1 + "+" + num2 + "=" + calc.add(num1, num2));
		System.out.println(num1 + "-" + num2 + "=" + calc.substract(num1, num2));
		System.out.println(num1 + "*" + num2 + "=" + calc.times(num1, num2));
		System.out.println(num1 + "/" + num2 + "=" + calc.divide(num1, num2));
	}
}

 

 

  • 인터페이스 구현과 형 변환
    • 인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환 할 수 있다
    • 상속에서의 형 변환과 동일한 의미를 갖는다
    • 클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현 할 수 있다
      → implements 인터페이스1, 인터페이스2, ..
    • 형 변환 되는 경우 인터페이스에 선언된 메서드만 사용 가능하다
  • 인터페이스의 역할
    • 클래스나 프로그램이 제공하는 기능을 명시적으로 선언
    • 일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세
    • 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있다
      → 구현에 대한 부분은 신경 쓰지 않아도 된다 인터페이스를 보고 개발
    • 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현 했다는 의미
    • 인터페이스를 구현한 다양한 객체를 사용함
      •  다형성 : 하나의 인터페이스를 여러 객체가 구현하게 되면 클라이언트 프로그램은
         인터페이스의메서드를 활용하여 여러 객체의 구현을 사용할 수 있다
      •  다형성은 객체지향에서 가장 중요한 부분

 

  • 인터페이스 다형성을 이용한 DAO 예시코드 
public class UserInfo{
	private String userId;
	private String passwd;
	private String userName;
	
	public String getUserId(){
		return userId;
	}
	
	public void setUserId(String userId){
		this.userId = userId;
	}
	
	public String getPasswd(){
		return passwd;
	}
	
	public void setPasswd(String passwd){
		this.passwd = passwd;
	}
	
	public String getUserName(){
		return userName;
	}
	
	public void setUserName(String userName){
		this.userName = userName;
	}
	
}
public interface UserInfoDao{
	
	void insertUserInfo(UserInfo userInfo);
	void updateUserInfo(UserInfo userInfo);
	void deleteUserInfo(UserInfo userInfo);
	
}
public class UserInfoMySqlDao implements UserInfoDao{
	
	@Override
	public void insertUserInfo(UserInfo userInfo){
		System.out.println("insert into MySQL DB user =" + userInfo.getUserId());
	}
	
	@Override
	public void updateUserInfo(UserInfo userInfo){
		System.out.println("update into MySQL DB user =" + userInfo.getUserId());
	}
	
	@Override
	public void deleteUserInfo(UserInfo userInfo){
		System.out.println("delete from MySQL DB user =" + userInfo.getUserId());
	}
}
public class UserInfoOracleDao implements UserInfoDao{

	public void insertUserInfo(UserInfo userInfo){
		System.out.println("insert into ORACLE DB userId =" + userInfo.getUserId() );
	}
	
	public void updateUserInfo(UserInfo userInfo){
		System.out.println("update into ORACLE DB userId = " + userInfo.getUserId());
	}
	
	public void deleteUserInf(UserInfo userInfo){
		System.out.println("delete from ORACLE DB userId = " + userInfo.getUserId());
	}
}
public calss UserInfoClient{
	
	public static void main(String[] args){
			
			FileInputStream fis = new FileInputStream("db.properties");
			
			Properties prop = new Properties();
			prop.load(fis);
			
			String dbType = prop.getProperty("DBTYPE");
			
			UserInfo userInfo = new UserInfo();
			userInfo.setUserId("12345");
			userInfo.setPasswd("!@#$%");
			userInfo.setUserName("이순신");
			
			UserInfoDao userInfoDao = null;
			if(dbType.equals("ORACLE")){
				userInfoDao = new UserInfoOracleDao();
			}
			else if(dbType.endsWith("MYSQL")){
				userInfoDao = new UserInfoMySqlDao();
			}
			else{
				System.out.println("db support error");
			}
			
			userInfoDao.insertUserInfo(userInfo);
			userInfoDao.updateserInfo(userInfo);
			userInfoDao.deleteUserInfo(userInfo);
									
	}
}

'JAVA > 객체지향' 카테고리의 다른 글

[객체지향] 객체지향 이란?  (0) 2024.11.06
[객체지향] 자바의 유용한 클래스들  (0) 2024.07.09
[객체지향] 다형성  (0) 2024.06.26
[객체지향] Static  (0) 2024.06.26
[객체지향] 업캐스팅 다운캐스팅  (0) 2024.06.25

BELATED ARTICLES

more