-
클래스 05: 추상클래스컴퓨터/Java 2019. 9. 4. 15:45
출처 : 자바프로그래밍 입문(인프런)
HeadFirst Design Pattern
인터페이스와 비슷한 형태로 구체화되지 않은 멤버를 이용해서 클래스를 만들 수 있어
- 추상클래스(abstract class)란
클래스의 공통된 부분을 뽑아서 별도의 클래스로 만들어 놓고 이것을 상속해서 사용한다.
- 추상 클래스의 특징
1) 멤버변수, 생성자, 메서드, 추상 메서드를 가질 수 있다.
2) abstract 클래스를 상속하기 위해서는 extends를 이용한다.
3) abstract 메서드를 가지며 상속한 클래스에서 반드시 구현해야 한다. ( 인터페이스와 비슷 )
- 추상클래스 구현
package lec11Pjt001; public abstract class AbstractClassEx { int num; String str; public AbstractClassEx() { System.out.println("AbstractClassEx constructor"); } public AbstractClassEx(int i, String s) { System.out.println("AbstractClassEx constructor"); // 멤버변수 초기화 가능 this.num = i; this.str = s; } public void func1() { System.out.println("-- func1() START -- "); } public abstract void fun2(); }
package lec11Pjt001; public class ClassEx extends AbstractClassEx{ public ClassEx() { System.out.println("ClassEx constructor"); } public ClassEx(int i, String s) { super(i,s); } @Override public void fun2() { System.out.println(" -- fun2() START --"); } }
MainClass.java
package lec22Pjt001; public class MainClass{ public static void main(String[] args) { AbstractClassEx ex = new ClassEx(10,"java"); ex.fun1(); ex.fun2(); } }
- Bank 추상 클래스
package lec11Pjt001; public abstract class Bank { String name; String account; int totalAmount; public Bank() { System.out.println("Bank constructor"); } public Bank(String name, String account, int totalAmount) { System.out.println("Bank constructor"); this.name = name; this.account = account; this.totalAmount = totalAmount; } //예금 public void deposit() { System.out.println(" -- deposit() START --"); } // 출금 public void withdraw() { System.out.println(" -- withdraw() START -- "); } // 적금과 해약은 옵션 // 적금 public abstract void installmentSavings(); //해약 public abstract void cancellation(); public void getInfo() { System.out.printf("name : %s\n", name); System.out.printf("account : %s\n", account); System.out.printf("totalAmount : %d\n", totalAmount); } }
- 인터페이스 vs 추상클래스
공통점 : 추상 메서드를 가진다. 객체 생성이 불가하며 자료형으로 사용된다.
자바 8부터는 인터페이스도 디폴트 메서드를 제공할 수 있어 인스턴스 메서드를 구현 형태로 제공할 수 있다.
차이점:
인터페이스) 상수, 추상메서드만 가진다.
추상메서드를 구현만 하도록 한다.
다형성을 지원한다.
추상 클래스 ) 클래스가 가지는 모든 속성과 기능을 가진다.
반드시 추상 클래스의 하위 클래스가 되어야 한다.
기존 클래스 위에 새로운 추상 클래스를 끼워넣기는 어렵다.
추상 메서드 구현 및 상속의 기능을 가진다.
단일 상속만 지원한다.
- 추상 클래스 안에서 인터페이스 형식의 레퍼런스 변수를 선언할 수 있다.
package lec11Pjt001; public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck() { } public abstract void display(); // 행동 클래스에 위임한다 public void performFly() { flyBehavior.fly(); } public void performQuack() { quackBehavior.quack(); } public void swim() { System.out.println("모든 오리는 물에 뜹니다. 가짜 오리도 뜨죠."); } public void setFlyBehavior(FlyBehavior fb) { flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb) { quackBehavior = qb; } }
FlyBehavior를 구현한 FlyWithWings 클래스 객체를 생성한다.
package lec11Pjt001; public class MallardDuck extends Duck{ public MallardDuck() { quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); } public void display() { System.out.println("저는 물오리입니다"); } }
package lec11Pjt001; public class MiniDuckSimulator { public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performQuack(); mallard.performFly(); Duck model = new ModelDuck(); model.performFly(); model.setFlyBehavior(new FlyRocketPowered()); model.performFly(); } }
'컴퓨터 > Java' 카테고리의 다른 글
예외처리 (0) 2019.09.04 람다식 (0) 2019.09.04 클래스 04: 인터페이스 (0) 2019.09.04 클래스 03: 내부 클래스와 익명 클래스 (0) 2019.09.04 상속 (0) 2019.09.03