1.추상 클래스, Abstract


추상 클래스는 클래스나 메소드 선언시에 접근제한자 뒤에 abstract를 입력하여 표시하고 다른 클래스에서 객체화를 할 수 없다.


추상 메소드는 바디를 가지지 않고 다음과 같이 사용한다. public abstract int abcde ( );


{ } -> 바디를 사용하지 않으며 [접근제한자] [abstract] [리턴타입] [함수이름] [매개변수];로 이루어진다.


하지만 모든 변수와 메소드에 추상화를 하지 않아도 된다.


추상 메소드는 바디가 없기 때문에 사용하기 위해서는 오버라이드를 통해서 기능을 설정해야 하고


다른 클래스와 같이 메소드를 선언하여 사용하는것도 가능하다. 이것이 인터페이스와 차이점 중 하나이다.


추상 클래스는 다형성을 통해 선언은 가능하지만 객체화는 불가능하므로 자식 클래스로 객체화 해 주어야 한다.


그리고 상속관계가 있어야 사용이 가능하다.


추상 클래스는 부모클래스로 사용하여 많은 자식클래스들의 공통 될 메소드를 예측하고 틀을 만들어두어 


오버라이드 해서 사용하는 경우가 많고 초기화는 자식 클래스의 객체화시 사용되는 생성자를 통해서 해야한다.


다음 예제를 통해 확인해보자.



먼저 추상 클래스인 세탁기이다. 기본 세탁기 기능을 선언

package chap06.exam02.absmethod;

public abstract class Laundry {
	// 무조건 만들어야 하는 기능들
	public abstract void 세탁하기();
	public abstract void 헹구기();
	public abstract void 탈수();
	
	public void 건조하기() {
		System.out.println("건조 시킵니다.");
	}
}


다음은 세탁기를 상속받는 드럼세탁기 클래스, Alt + Shift + S를 누르면 오버라이드를 자동으로 잡아주는 기능으로 간편하게 할 수 있다.


package chap06.exam02.absmethod;

public class DrumLaundry extends Laundry {
	// 추상 클래스 상속하여 자동 생성된 추상 메서드들
	@Override
	public void 세탁하기() {
		// TODO Auto-generated method stub
		System.out.println("세탁하기");
	}

	@Override
	public void 헹구기() {
		// TODO Auto-generated method stub
		System.out.println("헹구기");
	}

	@Override
	public void 탈수() {
		// TODO Auto-generated method stub
		System.out.println("탈수");
	}

}


마지막으로 메인 클래스


package chap06.exam02.absmethod;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DrumLaundry drum = new DrumLaundry(); // Laundry로 다형성으로 생성해도 되지만 새로운걸 추가 할 수 없으므로 왠만하면 자식 클래스를 쓰는게 좋음
		drum.세탁하기();
		drum.탈수();
		drum.헹구기();
		// 추상 클래스의 일반 메서드 호출
		drum.건조하기();
	}

}



2.인터페이스, Interface


추상 클래스가 추상메소드를 선언하고 싶다면 하고 안하고 싶으면 안하는데


인터페이스는 안에 작성된 메소드가 전부 추상화가 된다.


인터페이스의 큰 장점은 상속의 경우 다중 상속이 불가능하여 클래스 하나만 상속이 가능한데


인터페이스를 사용하면 Implements를 사용하여 불러오고 콤마(, )를 사용하여 여러개의 인터페이스를 불러올 수 있다.


자손 클래스에서 인터페이스를 사용하면 인터페이스에 명시한 메소드들을 구현해 두어야 한다.


추상 클래스와 매우 유사한데 다음 표와 예제를 보고 숙지하자.


표는 작성중...



클릭 이벤트 인터페이스 (실제로 클릭 이벤트 담당이 아닌 인터페이스 예를 위한 예제)


package chap06.exam03.inter;

public interface MouseEvent { // 인터페이스
	// 인터페이스에서는 추상메서드에 abstract를 붙이지 않는다.
	public void click(int btn);
	public void dblClick(int btn);
	public double[] move();
	// 인터페이스에서는 일반 메서드를 사용 할 수 없었다.
	// 인터페이스는 jdk 1.8부터 사용가능
	
//	public void wheel(int i) {  //  default/static을 사용하지 않으면 오류발생
//		
//	}
	
	public default void wheel(int i) {   // default를 사용하지 않으면 오류발생
		if(i==1) {
			System.out.println("윗 방향으로 스크롤");
		}else {
			System.out.println("아랫방향으로 스크롤");
		}
	}
	
	public static void setDpi(int dpi) {
		System.out.println("감도 조절 : " + dpi);
	}
}


마우스 이벤트를 받는 Window


package chap06.exam03.inter;
// implements == 구현이라고 부름, 인터페이스만 대상으로 한다.
public class Window implements MouseEvent {

	@Override
	public void click(int btn) {
		System.out.println(btn + "번 버튼 클릭");
	}

	@Override
	public void dblClick(int btn) {
		System.out.println(btn + "번 버튼 더블 클릭");
	}

	@Override
	public double[] move() {
		return null;
	}

}


메인에서 Window를 사용


package chap06.exam03.inter;

public class Main {

	public static void main(String[] args) {
		Window click = new Window();

		click.dblClick(3);
		click.click(1);

		Linux click2 = new Linux();

		click.dblClick(5);
		click.click(4);


		Mac click3 = new Mac();

		click.dblClick(2);
		click.click(8);
		
		// static 사용
		MouseEvent.setDpi(11);
		// 일반(디폴트) 메서드 
		click.wheel(3);


		// 다형성을 이용한 호출 (chap06.exam04.impl)
		MouseEvent aaa;
		aaa = new Window();
		aaa.dblClick(2222);
		aaa = new Linux();
		aaa.dblClick(13);
		aaa = new Mac();
		aaa.wheel(3);
	}

}



'개념 및 코딩 > 05.상속' 카테고리의 다른 글

[JAVA]05-06.익명객체, 결합도  (0) 2018.08.30
[JAVA]05-04.다형성 배열, 활용  (0) 2018.08.29
[JAVA]05-03.다형성  (0) 2018.08.29
[JAVA]05-02.오버라이드  (0) 2018.08.27
[JAVA]05-01.상속  (0) 2018.08.24

+ Recent posts