Day15 :) 추상화

다형성발현의 필수사항

  • 자식클래스들의 부모가 같아야함
  • 부모클래스에서 받은 메서드를 자식클래스들이 오버라이딩해야함
  • 사용하는 클래스에서 부모타입의 참조변수로 메서드를 사용해야 함
  • 사용하는 클래스에서 생성자, Setter메서드를 통해 필요 객체를 제공받아야 함

추상화

  • 공통된 속성과 기능을 추출하는 것
  • 자바에서는 공통된 속성과 기능을 모아 추상클래스나 인터페이스를 정의하는 것을 의미

추상클래스

abstract class 클래스명{}

  • 미완성 메서드인 추상메서드를 포함하고 있으며, 인스턴스는 생성 불가
  • 상속을 통해 자손클래스에서만 완성 될 수 있음
  • 생성자가 있으며 멤버변수나 메서드도 가질 수 있음
abstract class A{
    public abstract int b();		// 추상메서드
    public void d(){
        System.out.println("world");	// 멤버변수 가질 수 있음
    }
    // 인스턴스생성불가하므로 오류
    //public abstract int c(){System.out.println("Hello")}
}

추상메서드

abstract 리턴타입 메서드이름();

  • 메서드의 선언부만 있는 것이 추상메서드
  • 추상메서드를 상속받는 자식클래스는 오버라이딩을 통해 추상메서드를 모두 구현해주어야함
1. 추상클래스와 추상메서드
abstract class Parent{
	abstract void sample1 (int x, int y);
    abstract int sample2 ();
}
2. 자식클래스
class child1 extends Parent{
	void sample1(int x, int y){ 수행문 입력 }
    int sample2(){ 수행문 입력 }
}

class child2 extends Parent{
	void sample1(int x, int y){ 수행문 입력 }
    int sample2(){ 수행문 입력 }
}

추상클래스의 작성

  • 기존 클래스와의 공통부분을 뽑아내어 부모클래스 작성
  • 공통 특성을 한번에 관리하기 쉬우며, 배열화에도 용이
abstract class Unit{
	abstract void move (int x, int y);
    void stop();
}


class Marine extends Unit{
	void move(int x, int y)	// 추상클래스의 추상메서드(오버라이딩 해야함)
    void stimPack();		//Marine의 고유 특성
    						// void stop()도 상속 된 상태
}    

인터페이스

interface 인터페이스이름{}

  • 추상클래스의 일종으로 추상화정도가 추상클래스보다 높음
  • 오로지 추상메서드와 상수만 멤버로 가질 수 있음
  • 접근제어자로 public과 default만 사용 가능
interface PlayingCard{
	// 모든 멤버변수는 public static final~로 구성되어 있으며, 생략 가능함
    public static final int SPADE = 4;
    final int HEART = 3;	// public static final int HEART
    static int DIAMOND = 2;	// public static final int DIAMOND
    int CLOVER = 1;	// public static final int CLOVER
    
    // 모든 메서드는 public abstract~로 구성되어 있으며, 생략 가능함
    public abstract String getCardNumber();
    String getCardKind();	// public abstract String getCardKind
}

인터페이스의 구현

  • implements 키워드 이용
interface Fightable {
	/* 각 인터페이스에 정의된 추상메서드 전부 재정의
     하나라도 재정의 되어있지 않으면 컴파일 에러 발생 */
    void move(int x, int y);	// public abstract void move
    void attack(Unit u);
}
    
    
class Fighter implements Fightable{
	public void move(int x, int y){}
    public void attack(Unit u){}
}
  • abstract키워드로 추상클래스로 선언하면 메서드 일부만 구현 가능
abstract class Fighter implements Fightable{
	public void attack(Unit u){}
}
  • 상속과 구현 동시에 가능
class Fighter extends Unit implemetns Fightable{
	public void move(int x, int y){}
    public void attack(Unit u){}
}

클래스와 인터페이스

구현클래스

  • 하나 이상의 인터페이스를 구현한 클래스
  • 인터페이스 내의 구현부 없는 메서드가 전부 재정의 되어야 함
  • 인터페이스는 클래스간 결합을 느슨하게 만드므로, 확장에는 열려있고 변화에는 닫혀있음

좋은 웹페이지 즐겨찾기