일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 알버트
- AI
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
- albert
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online
- 한번에끝내는Java/Spring웹개발마스터초격차패키지
- 패스트캠퍼스후기
- R
- 직장인인강
- SKT
- 직장인자기계발
- 패스트캠퍼스
- 패캠챌린지
- Today
- Total
제주 탈출 일지
패스트캠퍼스 챌린지 20일차 본문
오늘 객체지향 핵심을 마무리할 예정.

그럼 레스고
13. 인터페이스를 활용한 다형성 구현 (dao 구현하기)
인터페이스와 다형성
똑같은 인터페이스를 활용해서 메소드를 호출하지만, 여러가지 implement를 가질수 있도록 함.

수행한 예제 화면을 봤을 때, 어마어마한 패키지 계층구조의 악수가..
소스코드 구조가 좀 복잡하다.
간단하게 정리를 좀 해보자면.. 패키지를 domain.userinfo / web.userinfo로 나눌 수 있다.
domain.userinfo는 구현부
web.userinfo는 구현부를 동작시키기 위한 코드들이다.
domain.userinfo에는 dao패키지와 UserInfo.java로 되어있는데 Userinfo패키지에는 User의 정보와 getter/setter 메서드가 포함되어 있다. 유저의 어떤 정보들을 가지고 있을지 결정하는 클래스..
dao에서 실제 인터페이스와 그 인터페이스를 구현할 클래스가 있다.
UserInfoDao 인터페이스를 UserInfoMysqlDao.java와 UserInfoOracleDao.java 두 클래스가 각각 다르게 구현을 해두고 있다. 이를 통해 사용하는 사람은 그냥 db종류에 상관없이 그냥 사용하기만 하면 된다. (인터페이스 구현의 의의)
web.userInfo클래스 아래의 UserInfoClient.java에서 dbtype에 따라서 다르게 사용할 필요가 없다는 말, 왜냐? 인터페이스를 상속받았고, 어쨌든 그 인터페이스의 메소드들을 모두 구현하였기 때문에..
+ db.properties파일은 dbtype을 적어둔 파일이다. UserinfoClient에서 db.properties 파일을 읽고 dbtype을 읽어서 그에 맞는 처리를 할 수 있게 함.
UserInfo 클래스
package ch13.domain.userinfo;
public class UserInfo {
private String userId;
private String password;
private String userName;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
UserInfoDao 인터페이스
package ch13.domain.userinfo.dao;
import ch13.domain.userinfo.UserInfo;
public interface UserInfoDao {
void insertUserInfo(UserInfo userInfo);
void updateUserInfo(UserInfo userInfo);
void deleteUserInfo(UserInfo userInfo);
}
UserInfoMysqlDao 클래스
package ch13.domain.userinfo.dao.mysql;
import ch13.domain.userinfo.UserInfo;
import ch13.domain.userinfo.dao.UserInfoDao;
public class UserInfoMySqlDao implements UserInfoDao {
@Override
public void insertUserInfo(UserInfo userInfo) {
System.out.println("Insert into MySQL DB userID = " + userInfo.getUserId());
}
@Override
public void updateUserInfo(UserInfo userInfo) {
System.out.println("Update into MySQL DB userID = " + userInfo.getUserId());
}
@Override
public void deleteUserInfo(UserInfo userInfo) {
System.out.println("Delete from MySQL DB userID = " + userInfo.getUserId());
}
}
UserInfoOracleDao 클래스
package ch13.domain.userinfo.dao.oracle;
import ch13.domain.userinfo.UserInfo;
import ch13.domain.userinfo.dao.UserInfoDao;
public class UserInfoOracleDao implements UserInfoDao {
@Override
public void insertUserInfo(UserInfo userInfo) {
System.out.println("Insert into Oracle DB userID = " + userInfo.getUserId());
}
@Override
public void updateUserInfo(UserInfo userInfo) {
System.out.println("Update into Oracle DB userID = " + userInfo.getUserId());
}
@Override
public void deleteUserInfo(UserInfo userInfo) {
System.out.println("Delete from Oracle DB userID = " + userInfo.getUserId());
}
}
db.properties
DBTYPE=ORACLE
UserInfoClient 클래스
package ch13.web.userinfo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import ch13.domain.userinfo.UserInfo;
import ch13.domain.userinfo.dao.UserInfoDao;
import ch13.domain.userinfo.dao.mysql.UserInfoMySqlDao;
import ch13.domain.userinfo.dao.oracle.UserInfoOracleDao;
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"); // value를 반환.
UserInfo userinfo = new UserInfo();
userinfo.setUserId("12345");
userinfo.setPassword("!@#$%^");
userinfo.setUserName("Lee");
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);
}
}
UserInfoClient 코드가 좀 복잡하다.
처음보는 클래스형들이 나오는데, FileInputStream, Properties 인데, FileInputStream은 이제 어떤 파일을 읽어들이는데 사용하는 클래스이고, Properties는 짝을 맞춰주는? 그런 클래스라고 한다. 조사가 필요하다. 차후 정리를 하여 이 포스팅을 수정하도록 하겠음
프로그램 실행결과는 다음과 같다.

properties가 DBTYPE=ORACLE 이라면 위와 같이 나온다

properties가 DBTYPE=MYSQL 이라면 위처럼 나오게 된다.
14. 인터페이스의 여러가지 요소
상수
추상 메서드
디폴드 메서드(자바 8이후) -> 인터페이스를 implement하는 클래스들이 동일한 메소드를 구현하는 경우가 많아서 지원
(재정의도 가능)
정적 메서드(자바 8이후) -> 인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드
private 메서드 (자바 9 이후) -> 인터페이스 내부에서만 사용하기 위해 제공되는 메소드
Calc 인터페이스
package ch14;
public interface Calc {
double PI = 3.14;
int ERROR = -999999999;
int add(int num1, int num2);
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);
default void description() { // 디폴트 메서드
System.out.println("정수의 사칙연산을 제공합니다.");
myMethod();
}
static int total(int[] arr) { // 정적 메서드
int total = 0;
for(int num : arr) {
total += num;
}
myStaticMethod();
return total;
}
private void myMethod () {
System.out.println("myMethod");
}
private static void myStaticMethod() {
System.out.println("myStaticMethod");
}
}
예전에 했던 예제인 Calc이다. default, static, priavte 메소드가 추가되었다.
default 메소드는 구현 클래스에서 재정의 할 수 있다.
static 메소드는 인터페이스 인스턴스 없이 호출 가능 하다.
private 메소드는 상속 혹은 재정의가 가능하지 않다. 무조건 인터페이스 내부에서만 동작하기 위한 메소드
15. 여러 인터페이스 구현하기, 인터페이스의 상속
여러 인터페이스를 구현하거나, 인터페이스 + 클래스를 동시에 상속하는 경우도 가능
인터페이스 간 상속도 가능함.
자바의 다중상속이 되지 않는 이유는 다이아몬드 문제이다.
(C++은 가능함)
자바는 모호성을 없애기 위해 클래스의 안정성을 택함.
디폴트 메서드가 중복 되는 경우는 구현 하는 클래스에서 재정의 하여야 함.(모호하기 때문)
여러 인터페이스를 구현한 클래스는 인터페이스 타입으로 형 변환 되는 경우 해당 인터페이스에 선언된 메서드만 사용 가능 함.
인터페이스 간 상속을 할때는 extends 키워드를 사용.
동일하게 해당 타입상속을 받은 인터페이스를 구현한 클래스를 사용할 때, 인터페이스 타입으로 형변환 된다면 해당 인터페이스에 선언된 메서드만 사용가능하다.
예제1
Buy 인터페이스
package ch15;
public interface Buy {
void buy();
default void order() {
System.out.println("buy order");
}
}
Sell 인터페이스
package ch15;
public interface Sell {
void sell();
default void order() {
System.out.println("sell order");
}
}
Customer 클래스
package ch15;
public class Customer implements Buy, Sell {
@Override
public void sell() {
// TODO Auto-generated method stub
System.out.println("customer sell");
}
@Override
public void buy() {
// TODO Auto-generated method stub
System.out.println("customer buy");
}
//1. Sell의 인터페이스의 디폴트 메서드를 사용해라
// @Override
// public void order() {
// // TODO Auto-generated method stub
// Sell.super.order();
// }
//2. Buy의 인터페이스의 디폴트 메서드를 사용해라
// @Override
// public void order() {
// // TODO Auto-generated method stub
// Buy.super.order();
// }
//3. 아예 새로 재정의 해라.
public void order() {
System.out.println("customer order");
}
public void hello() {
System.out.println("hello");
}
}
CustomerTest 클래스
package ch15;
public class CustomerTest {
public static void main(String[] args) {
Customer customer = new Customer();
customer.buy();
customer.sell();
customer.order();
customer.hello();
Buy buyer = customer;
buyer.buy();
buyer.order();
Sell seller = customer;
seller.sell();
seller.order();
}
}
예제 2
Queue 인터페이스
package ch15;
public interface Queue {
void enQueue(String title);
String deQueue();
int getSize();
}
Shelf 클래스
package ch15;
import java.util.ArrayList;
public class Shelf {
protected ArrayList<String> shelf;
public Shelf() {
shelf = new ArrayList<>();
}
public ArrayList<String> getShelf() {
return shelf;
}
public int getCount() {
return shelf.size();
}
}
BookShelf 클래스
package ch15;
public class BookShelf extends Shelf implements Queue {
@Override
public void enQueue(String title) {
// TODO Auto-generated method stub
shelf.add(title);
}
@Override
public String deQueue() {
// TODO Auto-generated method stub
return shelf.remove(0);
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return getCount();
}
}
BookShelfTest 클래스
package ch15;
public class BookShelfTest {
public static void main(String[] args) {
Queue bookQueue = new BookShelf();
bookQueue.enQueue("토지1");
bookQueue.enQueue("토지2");
bookQueue.enQueue("토지3");
bookQueue.enQueue("토지4");
bookQueue.enQueue("토지5");
System.out.println(bookQueue.getSize());
System.out.println(bookQueue.deQueue());
System.out.println(bookQueue.deQueue());
System.out.println(bookQueue.deQueue());
System.out.println(bookQueue.deQueue());
System.out.println(bookQueue.deQueue());
}
}
예제는 한번 어떻게 구성되어 있는지 확인해보면 될것이다.
다음 강의가 하나 남아있으나 단순 복습이라, 따로 정리는 하지 않을 예정이다.
그럼 객체지향 끝.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'패스트캠퍼스 챌린지!' 카테고리의 다른 글
패스트캠퍼스 챌린지 22일차 (0) | 2021.09.27 |
---|---|
패스트캠퍼스 챌린지 21일차 (0) | 2021.09.26 |
패스트캠퍼스 챌린지 19일차 (0) | 2021.09.24 |
패스트캠퍼스 챌린지 18일차 (0) | 2021.09.23 |
패스트캠퍼스 챌린지 17일차 (0) | 2021.09.22 |