ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클래스 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

    댓글

Designed by Tistory.