웹개발 교육/Java

[35일] Java (38) - 추상 클래스

ewok 2022. 9. 15. 15:07

추상 클래스

우리가 지금까지 만든 필드, 생성자 함수, 메소드가 있는 클래스를 실체 클래스라고 한다. 추상 클래스는 이러한 실체 클래스들의 공통적인 특성을 추출해서 선언한 클래스이다.

 

추상 클래스는 미완성 클래스라고 할 수 있으며, 객체를 생성할 수 없다. 또한 new 연산자를 직접 사용할 수 없다.

추상 메소드가 1개라도 있으면 추상 클래스이며, 일반 메소드와 추상 메소드를 같이 선언할 수 있다.

 

추상 클래스는 다음과 같이 선언한다.

public abstract class 클래스 {
    //필드
    //생성자
    //메소드
}

 

추상 클래스는 new 연산자로 직접 객체를 생성할 수 없다.

Animal ani = new Animal();  //에러

 

추상 메소드

추상 메소드는 메소드의 선언부(리턴형, 함수명, (매개변수))만 있고 { }가 없는 메소드이다.

접근제한자 abstract 리턴타입 메소드명(매개변수, ...);

 

abstract class Animal {      //추상 클래스
	String name;
	void view() {}           //일반 메소드
	abstract void disp();    //추상 메소드(미완성)
}//class end

 

 

추상 클래스를 상속받은 자식 클래스는 반드시 추상 메소드를 완성해야 한다.

//추상클래스는 부모 역할만 주로 한다
class Elephant extends Animal {
	@Override
	void disp() {
		System.out.println("점보");		
	}
}//class end

class Tuna extends Animal {
	@Override
	void disp() {
		System.out.println("니모");
	}
}//class end

 

추상 클래스인 Animal은 new 연산자로 직접 객체를 생성할 수 없지만, 그 자식 클래스인 Elephant와 Tuna는 실체 클래스이므로 객체를 생성할 수 있고 부모 클래스인 Animal로 형 변환이 가능하다.

//다형성
Animal animal = new Elephant();
animal.disp();

animal = new Tuna();
animal.disp();

 

아래 예제를 통해 추상 클래스와 다형성을 살펴보자

package oop0915;

abstract class Travel {  //추상 클래스
	void view() {}//일반 메소드
	abstract String travelWhere();  //추상 메소드
}//class end

class TypeA extends Travel {
	@Override
	String travelWhere() {		
		return "제주도 올레길";
	}
}//class end

class TypeB extends Travel {
	@Override
	String travelWhere() {		
		return "여의도 벚꽃축제";
	}
}//class end

class TypeC extends Travel {
	@Override
	String travelWhere() {		
		return "지리산 둘레길";
	}	
}//class end

public class Test05_abstract {

	public static void main(String[] args) {
		// 추상클래스와 다형성
		
		Travel tour = new TypeA();
		System.out.println(tour.travelWhere());
		
		tour = new TypeB();
		System.out.println(tour.travelWhere());
		
		tour = new TypeC();
		System.out.println(tour.travelWhere());

	}//main() end

}//class end