추상 클래스
객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면, 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 하며, 추상 클래스와 실체 클래스는 상속의 관계를 가지고 있음.
추상 클래스가 부모, 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고, 추가적인 특성(필드와 메소드)을 가질 수 있음.
공통된 필드와 메소드의 이름을 통일할 목적으로 사용하고, 실체 클래스를 작성할 때 시간을 절약하는 용도로 사용함.
추상 클래스 선언
추상 클래스를 선언할 때에는 클래스 선언에 abstract키워드를 붙여야 하며, abstract를 붙이면 new 연산자를 이용해서 객체를 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있음.
public abstract class 클래스 {
// 필드
// 생성자
// 메소드
}
* 추상 클래스도 일반 클래스와 마찬가지로 필드, 생성자, 메소드 선언을 할 수 있으며, new 연산자로 직접 생성자를 호출할 수는 없지만 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 함.
// 추상 클래스
package sec03.exam01;
public abstract class Phone {
// 필드
public String owner;
// 생성자
public Phone(String owner) {
this.owner = owner;
}
// 메소드
public void turnOn() {
System.out.println("폰 전원을 켭니다.");
}
public void turnOff() {
System.out.println("폰 전원을 끕니다.");
}
}
// 실체 클래스
package sec03.exam01;
public class SmartPhone extends Phone {
// 생성자
public SmartPhone(String owner) {
super(owner);
}
// 메소드
public void internetSearch() {
System.out.println("인터넷 검색을 합니다.");
}
}
// 실행 클래스
package sec03.exam01;
public class PhoneExample {
public static void main(String[] args) {
//Phone phone = new Phone();
SmartPhone smartPhone = new SmartPhone("홍길동");
smartPhone.turnOn(); // Phone의 메소드
smartPhone.internetSearch();
smartPhone.turnOff(); // Phone의 메소드
}
}
// 실행 결과
// 폰 전원을 켭니다.
// 인터넷 검색을 합니다.
// 폰 전원을 끕니다.
추상 메소드와 재정의
[public | protected] abstract 리턴타입 메소드이름(매개변수,...);
* 추상 메소드는 abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 { }가 없는 메소드를 말함.
// 추상 메소드 선언
package sec03.exam02;
public abstract class Animal { // 추상 클래스
public String kind;
public void breathe() {
System.out.println("숨을 쉽니다.");
}
public abstract void sound(); // 추상 메소드
}
// 추상 메소드 재정의
package sec03.exam02;
public class Dog extends Animal {
public Dog() {
this.kind = "포유류";
}
@Override // 추상 메소드 재정의
public void sound() {
System.out.println("멍멍");
}
}
// 추상 메소드 재정의
package sec03.exam02;
public class Cat extends Animal {
public Cat() {
this.kind = "포유류";
}
@Override // 추상 메소드 재정의
public void sound() {
System.out.println("야옹");
}
}
// 실행 클래스
package sec03.exam02;
public class AnimalExample {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.sound();
cat.sound();
System.out.println("---------");
// 변수의 자동 타입 변환
Animal animal = null;
animal = new Dog(); // 자동 타입 변환 및 재정의된 메소드 호출
animal.sound();
animal = new Cat(); // 자동 타입 변환 및 재정의된 메소드 호출
animal.sound();
System.out.println("---------");
// 메소드의 다형성
animalSound(new Dog()); // 자동 타입 변환
animalSound(new Cat()); // 자동 타입 변환
}
public static void animalSound( Animal animal ) {
animal.sound(); // 재정의된 메소드 호출
}
}
🔘 추상 클래스: 클래스들의 공통적인 필드와 메소드를 추출해서 선언한 클래스
🔘 추상 메소드: 추상 클래스에서만 선언할 수 있고, 메소드의 선언부만 있는 메소드를 말하며, 추상 메소드는 자식 클래스에서 재정의되어 실행 내용을 결정해야 함.
'Java' 카테고리의 다른 글
| [Java] 타입 변환과 다형성 (0) | 2025.11.14 |
|---|---|
| [Java] 인터페이스 (0) | 2025.11.14 |
| [Java] 타입 변환과 다형성 (0) | 2025.11.12 |
| [Java] 상속 (0) | 2025.11.10 |
| [Java] 패키지와 접근 제한자 (0) | 2025.11.10 |