추상 클래스
추상 클래스(abstract class)란 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스이다.
- 추상 메소드는 선언만 있고 구현이 없는 메서드이며 선언부에 'abstract' 라는 키워드를 붙인다.
- 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에도 'abstract' 키워드를 붙여야 한다.
- 추상 클래스는 추상 메서드를 포함하고 객체화 할 수 없다는 점만 제외하고 일반 클래스와 다르지 않으며 생성자, 멤버변수와 일반 메서드를 가질 수 있다.
- 추상 클래스는 다른 클래스들에게서 공통으로 가져야하는 메소드들의 원형을 정의하고 그것을 상속받아서 구현토록 하는데 사용된다.
- 해당 추상클래스를 상속받는 자식 클래스들은 반드시 추상메서드를 상속받아 재정의(오버라이딩)해야 한다.
public abstract class 클래스명 {
필드
생성자
메서드
추상메서드
}
package ex_abstract;
public abstract class Animal { // 추상 클래스(abstract class)란 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스 // 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에도 'abstract' 키워드를 붙여야 한다. public String aType; public void move() { System.out.println("동물이 어슬렁 어슬렁 움직인다."); } abstract void sound(); // 추상(abstract) 메서드는 선언만 있고 구현이 없는 메서드 }
|
package ex_abstract;
public class Dog extends Animal { public void move() { System.out.println("노곤하개"); } @Override void sound() { // 추상클래스를 상속받는 자식 클래스들은 반드시 추상메서드를 상속받아 재정의(오버라이딩)해야한다. System.out.println("노곤하개 컹컹"); } }
|
package ex_abstract;
public class Cat extends Animal { public Cat() { this.aType ="고양이과 동물"; }
@Override void sound() { // 추상클래스를 상속받는 자식 클래스들은 반드시 추상메서드를 상속받아 재정의(오버라이딩)해야한다. System.out.println("고양이 냐옹"); }
}
|
package ex_abstract;
public class Main {
public static void main(String[] args) { Dog dog = new Dog(); Cat cat = new Cat(); dog.move(); // 오버라이드된 메소드 호출 ==> 노곤하개 cat.move(); // 추상클래스 메소드 호출 ==> 동물이 어슬렁 어슬렁 거린다. dog.sound(); // 자식 클래스의 구현된 메소드 호출 ==> 노곤하개 컹컹 cat.sound(); // 자식 클래스의 구현된 메소드 호출 ==> 고양이 냐옹 } }
|
ㅇ 부모 클래스의 생성자를 호출하려면 super 키워드를 사용해야 한다.
package ex_abstract;
public abstract class Animal { // 추상 클래스(abstract class)란 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스 // 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에도 'abstract' 키워드를 붙여야 한다. public String name; public Animal() { super(); } public Animal(String name) { this.name = name; } public void move() { System.out.println("동물이 어슬렁 어슬렁 움직인다."); } abstract void sound(); // 추상(abstract) 메서드는 선언만 있고 구현이 없는 메서드 }
|
package ex_abstract;
public class Cat extends Animal { public Cat(String name) { super(name); // 부모 클래스의 생성자를 호출하려면 super 키워드를 사용해야 한다. }
@Override void sound() { // 추상클래스를 상속받는 자식 클래스들은 반드시 추상메서드를 상속받아 재정의(오버라이딩)해야한다. System.out.println("고양이 냐옹"); }
}
|
package ex_abstract;
public class Dog extends Animal { public Dog() { super(); // 부모 클래스의 생성자를 호출하려면 super 키워드를 사용해야 한다. }
public Dog(String name) { super(name); // 부모 클래스의 생성자를 호출하려면 super 키워드를 사용해야 한다. }
public void move() { System.out.println("노곤하개"); } @Override void sound() { // 추상클래스를 상속받는 자식 클래스들은 반드시 추상메서드를 상속받아 재정의(오버라이딩)해야한다. System.out.println("노곤하개 컹컹"); } }
|
package ex_abstract;
public class Main {
public static void main(String[] args) { Dog dog = new Dog("송백구"); Cat cat = new Cat("조나비"); dog.move(); // 오버라이드된 메소드 호출 cat.move(); // 추상클래스 메소드 호출 dog.sound(); // 자식 클래스의 구현된 메소드 호출 cat.sound(); // 자식 클래스의 구현된 메소드 호출 System.out.println("고양이의 이름은 : " + cat.name); System.out.println("진돗개의 이름은 : " + dog.name); } }
|