앞의 예제의 Manager Class는 제외함.
인터페이스를 이용해 메소드를 사용하고 또 더불어 다형성을 제공할 수도 있다. 예를 들어 운전자는 영업팀 직원일 수도 있고 영업팀팀장일 수도 있다. 앞서 클래스의 다형성을 이야기 할 때 설명한 것과 비슷한 내용이지만 결국 운전자는 때에 따라서 여러 형태로 보여질 수 있다는 의미이다. 만약 운전자를 나타내는 인터페이스 SmallDriver 인터페이스가 영업팀직원일 수도 있고 영업팀팀장을 나타낼 수도 있다면 프로그래밍을 하는 사람의 입장에서는 보다 유연한 프로그래밍을 제공받을 수 있을 것이다.
//인터페이스 선언
interface SmallDriver {
void driveSmallCar(); // 메소드 선언
}
abstract class Employee {
String name;
String id;
//생성자
public Employee(String name1, String id1) {
name = name1; id = id1;
}
public void gotoOffice() { System.out.println(name+"님 출근하였습니다..."); }
public void gotoHome() { System.out.println(name+"님 퇴근하였습니다..."); }
public String toString() { return "직원의 이름은 " + name + "이다."; }
abstract public void startJob();
}
//직원클래스를 상속한 영업팀직원 클래스
class SalesEmployee extends Employee implements SmallDriver{
//영업담당지역, 메소드내에서만 변수에 접근이 가능하다.
private String chargeArea;
public String carName="소나타";
public SalesEmployee(String newName,String newID,String newArea) {
super(newName, newID);
this.chargeArea = newArea;
}
// SmallDrive 인터페이스의 메소드 구현
public void driveSmallCar() {
System.out.println("영업팀 직원 " + name + "은 " + carName + "를 운전한다.");
}
public void startJob() {
System.out.println(super.name + "님이 " + this.chargeArea + " 지역으로 영업업무를 나갑니다...");
}
}
//영업팀직원 클래스를 상속한 영업팀장 클래스
class SalesChief extends SalesEmployee implements SmallDriver{
int salesTarget; //영업팀 목표 매출액
public String carName="그랜져";
public SalesChief(String newName,String newID,String newArea, int newSalesTarget) {
super(newName, newID, newArea);
this.salesTarget = newSalesTarget;
}
// SmallDrive 인터페이스의 메소드 구현
public void driveSmallCar() {
System.out.println("영업팀 팀장 " + name + "은 " + carName + "를 운전한다.");
}
//영업팀장의 업무는 더이상 확장이 안된다는 의미, 상속할수가 없다는 의미
final public void startJob() {
System.out.println(super.name + "님이 영업팀 직원을 관리한다...");
System.out.println(super.name + "님이 관리하는 영업팀의 매출목표는 "+ this.salesTarget + "만원 입니다...");
}
}
//Main Class
class InterfaceSample2 {
public static void main(String[] args) {
// 인터페이스가 클래스의 객체를 참조하도록...
SmallDriver sm1 = new SalesEmployee("홍길동", "11111","서울");
SmallDriver sm2 = new SalesChief("이순신", "22222", "개발부", 100000000);
sm1.driveSmallCar();
sm2.driveSmallCar();
SalesEmployee se = new SalesEmployee("차두리","23456","독일");
se.gotoOffice();
se.startJob();
se.carName="티코";
se.driveSmallCar();
}
}
추상메소드를 가지고 있고 이를 상속받거나 구현하는 클래스는 이 추상 메소드를 재정의하고 구현해야 한다는 점, 그리고 다형성을 구현하는 방법이라는 점, 메소드들이 동적으로 바인딩 된다는 점들은 비슷하다.
차이점
- 인터페이스는 서로 연관성이 없는 클래스들에 의해 구현될 수 있고 따라서 수평적인 구현이 가능하지만 추상클래스의 경우 단일 상속 개념 하에 수직적인 구조로 상속을 해야만 한다.
- 인터페이스에서는 메소드를 선언만 할 수 있으며 구현할 수 없다. 그리고 이 구현은 인터페이스를 구현하도록 설정된 클래스에서 가능하다. 하지만 추상클래스의 경우에는 추상 클래스 내부에서 메소드의 선언과 구현이 모두 가능하며 또한 이를 상속 받은 클래스에서도 재정의가 가능하다.
인터페이스를 이용해 메소드를 사용하고 또 더불어 다형성을 제공할 수도 있다. 예를 들어 운전자는 영업팀 직원일 수도 있고 영업팀팀장일 수도 있다. 앞서 클래스의 다형성을 이야기 할 때 설명한 것과 비슷한 내용이지만 결국 운전자는 때에 따라서 여러 형태로 보여질 수 있다는 의미이다. 만약 운전자를 나타내는 인터페이스 SmallDriver 인터페이스가 영업팀직원일 수도 있고 영업팀팀장을 나타낼 수도 있다면 프로그래밍을 하는 사람의 입장에서는 보다 유연한 프로그래밍을 제공받을 수 있을 것이다.
//인터페이스 선언
interface SmallDriver {
void driveSmallCar(); // 메소드 선언
}
abstract class Employee {
String name;
String id;
//생성자
public Employee(String name1, String id1) {
name = name1; id = id1;
}
public void gotoOffice() { System.out.println(name+"님 출근하였습니다..."); }
public void gotoHome() { System.out.println(name+"님 퇴근하였습니다..."); }
public String toString() { return "직원의 이름은 " + name + "이다."; }
abstract public void startJob();
}
//직원클래스를 상속한 영업팀직원 클래스
class SalesEmployee extends Employee implements SmallDriver{
//영업담당지역, 메소드내에서만 변수에 접근이 가능하다.
private String chargeArea;
public String carName="소나타";
public SalesEmployee(String newName,String newID,String newArea) {
super(newName, newID);
this.chargeArea = newArea;
}
// SmallDrive 인터페이스의 메소드 구현
public void driveSmallCar() {
System.out.println("영업팀 직원 " + name + "은 " + carName + "를 운전한다.");
}
public void startJob() {
System.out.println(super.name + "님이 " + this.chargeArea + " 지역으로 영업업무를 나갑니다...");
}
}
//영업팀직원 클래스를 상속한 영업팀장 클래스
class SalesChief extends SalesEmployee implements SmallDriver{
int salesTarget; //영업팀 목표 매출액
public String carName="그랜져";
public SalesChief(String newName,String newID,String newArea, int newSalesTarget) {
super(newName, newID, newArea);
this.salesTarget = newSalesTarget;
}
// SmallDrive 인터페이스의 메소드 구현
public void driveSmallCar() {
System.out.println("영업팀 팀장 " + name + "은 " + carName + "를 운전한다.");
}
//영업팀장의 업무는 더이상 확장이 안된다는 의미, 상속할수가 없다는 의미
final public void startJob() {
System.out.println(super.name + "님이 영업팀 직원을 관리한다...");
System.out.println(super.name + "님이 관리하는 영업팀의 매출목표는 "+ this.salesTarget + "만원 입니다...");
}
}
//Main Class
class InterfaceSample2 {
public static void main(String[] args) {
// 인터페이스가 클래스의 객체를 참조하도록...
SmallDriver sm1 = new SalesEmployee("홍길동", "11111","서울");
SmallDriver sm2 = new SalesChief("이순신", "22222", "개발부", 100000000);
sm1.driveSmallCar();
sm2.driveSmallCar();
SalesEmployee se = new SalesEmployee("차두리","23456","독일");
se.gotoOffice();
se.startJob();
se.carName="티코";
se.driveSmallCar();
}
}
추상메소드를 가지고 있고 이를 상속받거나 구현하는 클래스는 이 추상 메소드를 재정의하고 구현해야 한다는 점, 그리고 다형성을 구현하는 방법이라는 점, 메소드들이 동적으로 바인딩 된다는 점들은 비슷하다.
차이점
- 인터페이스는 서로 연관성이 없는 클래스들에 의해 구현될 수 있고 따라서 수평적인 구현이 가능하지만 추상클래스의 경우 단일 상속 개념 하에 수직적인 구조로 상속을 해야만 한다.
- 인터페이스에서는 메소드를 선언만 할 수 있으며 구현할 수 없다. 그리고 이 구현은 인터페이스를 구현하도록 설정된 클래스에서 가능하다. 하지만 추상클래스의 경우에는 추상 클래스 내부에서 메소드의 선언과 구현이 모두 가능하며 또한 이를 상속 받은 클래스에서도 재정의가 가능하다.
오라클자바커뮤니티교육센터, 개발자전문교육, 개인80%환급
www.oraclejavacommunity.com
평일주간(9:30~18:10) 개강
(7/21)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(7/21)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(7/21)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(7/21)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정
(7/28)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/28)[기업100%환급]안드로이드개발자과정
(7/28)[기업100%환급]SQL기초에서 Schema Object까지
평일야간(19:00~21:50) 개강
(7/16)Spring3.X, MyBatis, Hibernate실무과정
(7/21)웹퍼블리싱 마스터
(7/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(7/22)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(7/24)SQL기초에서실무까지
(7/29)안드로이드개발자과정
(8/05)MyBatis3.X, Hibernate4.X ORM실무과정
주말(10:00~17:50) 개강
(7/19)JSP,Ajax,jQUERY,Spring,MyBatis,Hibernate속성과정
(7/19)SQL초보에서 Schema Object까지
(7/19)C#,ASP.NET마스터
(7/19)Spring3.X, MyBatis, Hibernate실무과정
(7/19)웹퍼블리싱 마스터
(7/19)안드로이드개발자과정
(7/26)개발자를위한PLSQL,SQL튜닝,힌트
(8/02)MyBatis3.X, Hibernate4.X ORM실무과정
(8/09)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(8/23)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
주말저녁(18:30~22:20) 개강
(8/02)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지
www.oraclejavacommunity.com
평일주간(9:30~18:10) 개강
(7/21)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(7/21)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(7/21)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(7/21)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정
(7/28)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/28)[기업100%환급]안드로이드개발자과정
(7/28)[기업100%환급]SQL기초에서 Schema Object까지
평일야간(19:00~21:50) 개강
(7/16)Spring3.X, MyBatis, Hibernate실무과정
(7/21)웹퍼블리싱 마스터
(7/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(7/22)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(7/24)SQL기초에서실무까지
(7/29)안드로이드개발자과정
(8/05)MyBatis3.X, Hibernate4.X ORM실무과정
주말(10:00~17:50) 개강
(7/19)JSP,Ajax,jQUERY,Spring,MyBatis,Hibernate속성과정
(7/19)SQL초보에서 Schema Object까지
(7/19)C#,ASP.NET마스터
(7/19)Spring3.X, MyBatis, Hibernate실무과정
(7/19)웹퍼블리싱 마스터
(7/19)안드로이드개발자과정
(7/26)개발자를위한PLSQL,SQL튜닝,힌트
(8/02)MyBatis3.X, Hibernate4.X ORM실무과정
(8/09)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(8/23)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
주말저녁(18:30~22:20) 개강
(8/02)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지
댓글 없음:
댓글 쓰기