추상클래스(abstracts class)
1. 추상메소드를 포함하는 클래스
2. 추상 메소드는 본체(body)가 없는 메소드
=> 선언은 되어 있으나 코드가 구현되지 않은 껍데기만 있는 메소드를 말함
예) void display(); // { }가 없다
3. 클래스 앞에 abstract 키워드가 온다
4. 추상메소드를 재정의하지 않으면 error발생
=> 추상메소드 재정의 강제성
5. 추상클래스는 객체 생성이 불가능
=> 자식 클래스를 대상으로 객체 생성
원칙적으로 자식클래스도 추상클래스임
이유는 추상메소드를 그대로 상속을 받았기 때문임
하지만 부모의 추상 메소드를 재정의 하게 되면 객체 생성이 가능함
6. 추상클래스는 추상메소드를 가진 클래스를 말함
7. 물론 일반 넘버(멤버변수, 멤버메소드)를 가질 수 있음
8. 그러나 한 개 이상의 추상메소드를 반드시 존재해야 함
형식)
[접근제한] abstract class 클래스명 { }
9. 용도 : 응용 프로그램에서 설계와 구현 부분을 정리해서 작업 시 사용됨.
추상클래스를 책의 목차에 비유하면, 서브클래스는 목차에 따라 완성된 책과 같음
책을 쓸 때도 목차를 잡아 놓고 책을 쓰면 훨씬 쉽고 빠르며 방향이 흐트러지지 않는 것처럼
추상 클래스를 이용하면 응용프로그램의 설계와 구현을 분리할 수 있음
추상클래스로 시본 방향을 잡아 놓고 서브클래스에서 구현하면 구현 작업이 쉬워짐
추상클래스에서 error 발생_2가지
1. 자식클래스에서 추상메소드를 재정의 (O)
2. 자식클래스에서 재정의 하지 않는 경우
=> 자식클래스 이름 앞에 abstract 키워드를 붙여야 함
예제01)
추상클래스 기본 예제
package abstracts;
//부모클래스 - 추상클래스
abstract class Super {
//멤버변수
int num1; // 인스턴스 멤버변수
int calc() { // 인스턴스 멤버메소드
int sum = num1 + 150;
return sum;
}
abstract void output() ; //추상매소드
}
// 자식클래스
class Sub extends Super {
@Override // 메서드 재정의
void output() {
System.out.println("추상메서드 재정의 했어요");
}
}
public class Ex01_Super {
public static void main(String[] args) {
// 추상클래스는 객체 생성이 불가능
// Super super = new Super(); (X)
// 자식클래스로 객체 생성
Sub sub = new Sub();
sub.num1 = 133;
System.out.println("calc() 메서드 호출 >>> " + sub.calc());
sub.output(); // 추상메서드에서 재정의된 메서드 호출
}
}
결과
calc() 메서드 호출 >>> 283
추상메서드 재정의 했어요
예제02)
추상클래스를 이용해서 갤럭시와 아이폰의 공통 기능, 각각의 스펙 등을 출력해보자
package abstracts;
// 부모클래스_추상클래스
abstract class SmartPhone {
// 멤버변수
// 공통적인 기능의 특성
String call = "전화";
String sns = "SNS";
String search = "인터넷 검색";
String game = "게임";
//각각의 기계(단말기)들의 특성
String company, name, color, size, weight, price;
// 인스턴스 메서드
void purpose() {
System.out.printf
("사용 목적 : %s / %s / %s / %s \n", call, sns, search, game);
}
// 추상메서드
// 각각의 단말기(기계)들의 spec
abstract void spec();
}
class Galaxy extends SmartPhone{
// 추상메서드 재정의
@Override
void spec() {
company = "삼성"; name = "Galaxy Note 20"; color = "white";
size = "20cm"; weight = "350g"; price = "150만원";
System.out.printf
("%s / %s / %s / %s / %s / %s\n", company, name, color, size, weight, price);
}
}
class IPhone extends SmartPhone {
// 추상메서드 재정의
@Override
void spec() {
company = "애플"; name = "IPhone 11"; color = "white";
size = "15cm"; weight = "200g"; price = "150만원";
System.out.printf
("%s / %s / %s / %s / %s / %s\n", 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(); // 추상메소드 재정의한 메서드를 호출
}
}
'Back-End > Java' 카테고리의 다른 글
[Java] 다형성(polymorphism) (0) | 2021.08.18 |
---|---|
[Java] 인터페이스(Interface) (0) | 2021.08.17 |
[Java] 상속_메소드 재정의(method overriding) (0) | 2021.08.17 |
[Java] 상속(inheritance) (0) | 2021.08.17 |
[Java] instance(인스턴스), static(스태틱, 정적) 변수/메소드 (0) | 2021.08.17 |
댓글