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();

}
  1. 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");
    }

}
  1. 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();
    }
}
  1. 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();

    }
}
  1. main 에서 DBService객체를 생성하여 명령을 내린다.

+ Recent posts