Back/JAVA
상속 - 추상클래스(abstract class)
시월해
2021. 3. 12. 09:54
* 추상클래스(abstract class)?
1. 추상메서드를 포함하는 클래스.
2. 추상메서드는 본체(body)가 없는 메서드.
예) void display(); // { }가 없다.
3. 클래스 앞에 abstract 키워드가 온다.
4. 추상메서드를 재정의하지 않으면 error 발생.
==> 추상메서드 재정의 강제성.
5. 추상클래스는 객체 생성이 불가능.
==> 자식클래스를 대상으로 객체 생성.
6. 추상클래스는 추상메서드를 가진 클래스를 말함.
7. 물론 일반 멤버(멤버변수, 멤버메서드)를 가질 수 있음.
8. 그러나 한 개 이상의 추상메서드는 반드시 존재해야 함.
형식)
[접근제한] abstract class 클래스명 { }
9. 용도 : 응용프로그램에서 설계와 구현 부분을 분리해서 작업 시 사용됨.
추상클래스에서 error 발생 ==> 해결방법 2가지
1. 자식클래스에서 추상메서드를 재정의(O).
2. 자식클래스에서 재정의하지 않는 경우
==> 자식클래스 이름 앞에 abstract 키워드를 붙여야 함.
기본예제)
public abstract class Super { // 부모 클래스 - 추상클래스
int num1; // 인스턴스 멤버변수
int calc() { // 인스턴스 멤버메서드
int sum = num1 + 150;
return sum;
}
abstract void output(); // 추상메서드
}
public class Sub extends Super {
@Override
void output() {
System.out.println("추상메서드 재정의 했어요~~~");
}
}
public class Ex01_Super {
public static void main(String[] args) {
// 추상클래스이기 때문에 객체 생성이 불가능.
// Super super = new Super();
// 자식클래스로 객체 생성
Sub sub = new Sub();
sub.num1 = 133;
System.out.println("calc() 메서드 호출 >>> " + sub.calc());
sub.output(); // 추상메서드에서 재정의된 메서드 호출
}
}
예제1)
public abstract class Animal {
abstract void sound(); // 추상메서드
}
public class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹야옹~~~");
}
}
public class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍멍~~~");
}
}
public class Tiger extends Animal {
@Override
void sound() {
System.out.println("어흥어흥~~~");
}
}
public class Ex02_Animal {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
Tiger tiger = new Tiger();
dog.sound(); cat.sound(); tiger.sound();
}
}
예제2)
public abstract class SmartPhone {
// 공통적인 기능
String call = "전화";
String sns = "SNS";
String search = "인터넷 검색";
String game = "게임";
// 각각의 기계(단말기)들의 특성
String company, name, color, size, weight, price;
void purpose() {
System.out.println
("사용목적 : "+call+" / "+sns+" / "+search+" / "+game);
}
// 각각의 단말기(기계)들의 spec
abstract void spec(); // 추상메서드
}
public class Galaxy extends SmartPhone {
@Override
void spec() {
company = "삼성"; name = "Galaxy Note 20"; color = "화이트";
size = "20cm"; weight = "350g"; price = "150만원";
System.out.println
(company+" / "+name+" / "+color+" / "+size+" / "+weight+" / "+price);
}
}
public class IPhone extends SmartPhone {
@Override
void spec() {
company = "애플"; name = "IPhone 11"; color = "화이트";
size = "15cm"; weight = "200g"; price = "150만원";
System.out.println
(company+" / "+name+" / "+color+" / "+size+" / "+weight+" / "+price);
}
}
public class Ex03_SmartPhone {
public static void main(String[] args) {
Galaxy galaxy = new Galaxy();
galaxy.purpose();
galaxy.spec(); // 추상메서드 재정의한 메서드를 호출
System.out.println();
IPhone iPhone = new IPhone();
iPhone.purpose();
iPhone.spec(); // 추상메서드 재정의한 메서드를 호출
}
}