[객체지향] 인터페이스
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 |