국비 20일차 다형성, 추상함수, 인터페이스
2021. 2. 1. 18:31
2021.02.01 국비교육 20일차
다형성
- 하나의 참조변수가 여러 다른 데이터형을 참조할 수 있는 능력
- 상속이 전제되고 형변환도 가능하다.
package com.test3;
class Employee{
String name;
int salary;
public String getEmployee(){
System.out.println("employee getEmployee 출력");
return name + "\t" + salary;
}
public Employee() {}
public Employee(String name, int salary) {
this.name = name;
this.salary = salary;
}
}
class Manager extends Employee{
String depart; // 자식의 유일한 변수
public void print() {
System.out.println("Manager Print");
}
public String getDepart() {// 자식의 유일함수
return depart;
}
public void setDepart(String depart) {
this.depart = depart;
}
@Override
public String getEmployee() {
System.out.println("manager getemployee 출력");
return super.getEmployee() + "\t" + depart;
}
public Manager() {}
public Manager(String name, int salary, String depart) {
super(name, salary);
this.depart = depart;
}
public Manager(String name, int salary) {
super(name, salary);
}
}
public class Ex06_7 {
public static void main(String[] args) {
// Employee e = new Employee("홍길동", 100);
// System.out.println(e.getEmployee());
//
// Manager m1 = new Manager("AA", 200, "서울");
// System.out.println(m1.getEmployee());
//
//다형성(poly) - 부모타입 변수로 자식객체 저장 가능
// Employee m2 = new Manager("bb", 300, "서울"); // 다형성 적용된 객체생성
// System.out.println(m2.getEmployee()); // 함수는 오버라이딩된 함수가 호출
//System.out.println(m2.print());//실제 객체만 Manager이고 타입 Employee이기 때문에 접근은 employee만 가능
//전체를 다 사용하려면 형변환(타입 캐스팅) : 부모 -> 자식으로변환 후 접근해야함
//Manager m3 = (Manager) m2;// 실제 객체 Manager이지만 타입이 employee여서 전체 사용 못함 그래서 부모 ->자식으로 변환
//System.out.println(m3.getDepart());
Employee a = new Manager("AA", 1, "제주"); // 다형성저장
System.out.println(a.getEmployee()); // 상속관계, 오버라이딩 된 함수 호출(자식 함수 호출)
//String loc = a.getDepart(); // 컴파일 에러 : 타입이 부모기 때문에 부모 클래스에 getDepart()함수없음
//부모타입 -> 자식타입으로 형변환완료 후에 자식에 있는 함수/변수 사용
Manager a1 = (Manager)a;// a-> Employee타입에서 Manager타입으로 변환 후 a1 저장
String name = a1.getDepart(); //자식의 유일 객체 접근
System.out.println(name);
}
}
추상클래스, 인터페이스
- 상속은 강제성이 없다(다형성, 오버라이딩)
- 객체지향의 재사용성, 유지보수 특성을 향상시키기 위해서 부모 메소드를 무조건 오버라이딩 해야할 필요성 등장
- 인터페이스와추상클래스를 통해서 하위 클래스들에게 부모의 메소드를 반드시 사용하게 강제할 수 있음
- abstract class
- body가 없는 메소드를 포함 할 수 있는 클래스
- 인터페이스
- 클래스가 아님
- 상수 및 추상메소드만 갖는다.
- 객체 생성 불가(new 불가)
- static final을 붙여주지 않아도 자동으로 상수로 지정됨
- 메소드 또한 public abstract 자동 지정됨
인터페이스를 통해 반복을 줄이고 강제성을 활용한 통일성을 확보하는 것이 목적이다.
- 인터페이스 기준 설계
package com.dao;
public interface DBDAO {
public abstract void connect();
public abstract void insert();
}
DB 접속을 위한 인터페이스를 생성한다.
1-2 DB의 종류가 MySQL, Oracle 혹은 이후에 그 이상이 될 수 있으므로 기능을 인터페이스로 통일한다.
1-3 이 인터페이스를 통해 각 DB에 맞게 다형성 작업을 해줄것이다.
package com.dao;
public class MySQLDAO implements DBDAO {
@Override
public void connect() {
System.out.println("MySQLDAO.connect");
}
@Override
public void insert() {
System.out.println("MySQLDAO.insert");
}
}
package com.dao;
public class OracleDAO implements DBDAO{
@Override
public void connect() {
System.out.println("OracleDAO.connect");
}
@Override
public void insert() {
System.out.println("OracleDAO.insert");
}
}
DBDAO를 부모로하는 두개의 자식 OracleDAO, MySQLDAO 생성
2-1 inteface에서 implemnets 했기 때문에 메소드(connect, insert)를 오버라이딩 해주었다.
2-2 각각의 DB에 맞게 출력값이 다르게 설정되었다.
package com.service;
import com.dao.DBDAO;
public class DBService {
DBDAO dao;
public void setDAO(DBDAO dao) {//매개변수 interface type
this.dao = dao;
dao.connect();
}
public void insert() {
dao.insert();
}
}
main과 이어주기 위한 중간다리 역할인 DBService 클래스를 생성해준다.
3-1 DBService를 통해 main에서 받아온 매개변수를 알맞은 위치에 할당하기 위한 목적이다.
import com.dao.MySQLDAO;
import com.dao.OracleDAO;
import com.service.DBService;
public class DBMain {
public static void main(String[] args) {
DBService service = new DBService();
//MySQLDAO 사용
service.setDAO(new MySQLDAO());
service.insert();
//OracleDAO 사용
service.setDAO(new OracleDAO());
service.insert();
}
}
- main 에서 DBService객체를 생성하여 명령을 내린다.
'ETC > 국비교육' 카테고리의 다른 글
국비 22일차 throw, 예제 (0) | 2021.02.03 |
---|---|
국비 21일차 JAVA(중첩, Comparator, DecimalFormat, 문자열 나누기, StringTokenizer, StringBuffer, Wrapper(오토박싱, 언박싱), Random, Calander, SimpledataFormat, Array API, ENUM, 예외(try-catch, finally)) (0) | 2021.02.02 |
국비 19일차 상속, 오버라이드 (0) | 2021.01.29 |
국비 18일차 JAVA 초기화블록, 싱글톤, final, vargars (0) | 2021.01.28 |
국비 17일차 static (0) | 2021.01.27 |