3) 특징
- 불완전한 클래스이다. 따라서 객체생성이 불가능하다. ( new 불가 )
- 불완전한 클래스인 자신은 인스턴스가 안되지만
상속을 통해서 자식 클래스를 이용해서 추상클래스의 구성요소를
인스턴스화 할 수 있다.
=> 문법:
추상클래스:
public abstract class AAA {
- 변수
- 생성자
- 메서드
- 추상메서드: public abstract void a ( );
}
AAA x = new AAA( ); // 에러발생
자식클래스:
public class BBB extends AAA {
// 부모의 변수 사용
// 부모의 메서드 사용
// 부모의 생성자 사용불가 ( 생성자는 상속안됨 )
// 부모의 추상메서를 반드시 오버라이딩( overriding ) 해야하는 제약이
붙는다. 만약에 추상메서드를 오버라이딩 하지 않으면 에러가 발생된다.
}
- 추상클래스는 불완전한 클래스이지만 상속관계이기 때문에
자식클래스보다 큰 타입이다. 따라서 다형성을 적용할 수 있다.
ex)
AAA x = new BBB( ); // 다형성
- abstract 는 이탤릭체( 기울어진글씨체 )로 표현.
< 추상클래스 적용전 >
package exam15_추상클래스2_적용전;
public class TestMain7 {
public static void main(String[] args) {
Engineer7 eng = new Engineer7("홍길동",100,"JAVA");
Manager7 m = new Manager7("이순신", 200, "인사");
Secretary7 s = new Secretary7("유관순", 200);
System.out.println(eng.getEngineer());
System.out.println(m.getManager());
System.out.println(s.getSecretary());
}
}
package exam15_추상클래스2_적용전;
// Engineer, Secretary, Manager 클래스들의
// 공통적인 속성과 메서드를 뽑아서
// 더 큰 개념의 클래스를 만들자...
public class Employee7 {
String name;
int salary;
// getter, setter
public String getEmployee() {
return name+"\t"+salary;
}
}
package exam15_추상클래스2_적용전;
// 엔지니어 클래스
//'Engineer is a Employee' 성립이 되면 상속이 가능
public class Engineer7 extends Employee7 {
String skill;
public Engineer7(String name, int salary, String skill) {
this.name = name;
this.salary = salary;
this.skill = skill;
}
// getter & setter 작성
// 3가지 변수를 한번에 리턴해주는 메서드 작성
public String getEngineer() {
return name+"\t"+salary+"\t"+skill;
}
}
package exam15_추상클래스2_적용전;
// 관리자 클래스
public class Manager7 extends Employee7 {
String depart; // 부서명
public Manager7(String name, int salary, String depart) {
this.name = name;
this.salary = salary;
this.depart = depart;
}
// getter & setter 작성
// 3가지 변수를 한번에 리턴해주는 메서드 작성
public String getManager() {
return name+"\t"+salary+"\t"+depart;
}
}
package exam15_추상클래스2_적용전;
// 비서 클래스
public class Secretary7 extends Employee7 {
String name;
int salary;
public Secretary7(String name, int salary) {
this.name = name;
this.salary = salary;
}
// getter & setter 작성
// 2가지 변수를 한번에 리턴해주는 메서드 작성
public String getSecretary() {
return name+"\t"+salary;
}
}
<추상클래스적용후>
package exam15_추상클래스3_적용후;
public class TestMain8 {
public static void main(String[] args) {
Employee8 eng = new Engineer8("홍길동",100,"JAVA");
Employee8 m = new Manager8("이순신", 200, "인사");
Employee8 s = new Secretary8("유관순", 200);
System.out.println(eng.getEmployee());
System.out.println(m.getEmployee());
System.out.println(s.getEmployee());
}
}
package exam15_추상클래스3_적용후;
// Engineer, Secretary, Manager 클래스들의
// 공통적인 속성과 메서드를 뽑아서
// 더 큰 개념의 클래스를 만들자...
public abstract class Employee8 { // 추상메서드가 하나라도 있으면 추상클래스로 바꿔줘야한다.
String name;
int salary;
// getter, setter
public abstract String getEmployee(); // 추상메서드
}
package exam15_추상클래스3_적용후;
// 엔지니어 클래스
//'Engineer is a Employee' 성립이 되면 상속이 가능
public class Engineer8 extends Employee8 {
String skill;
public Engineer8(String name, int salary, String skill) {
this.name = name;
this.salary = salary;
this.skill = skill;
}
// getter & setter 작성
// 3가지 변수를 한번에 리턴해주는 메서드 작성
@Override // 재정의
public String getEmployee() {
return name+"\t"+salary+"\t"+skill;
}
}
package exam15_추상클래스3_적용후;
// 관리자 클래스
public class Manager8 extends Employee8 {
String depart; // 부서명
public Manager8(String name, int salary, String depart) {
this.name = name;
this.salary = salary;
this.depart = depart;
}
// getter & setter 작성
// 3가지 변수를 한번에 리턴해주는 메서드 작성
@Override // 재정의
public String getEmployee() {
return name+"\t"+salary+"\t"+depart;
}
}
package exam15_추상클래스3_적용후;
// 비서 클래스
public class Secretary8 extends Employee8 {
String name;
int salary;
public Secretary8(String name, int salary) {
this.name = name;
this.salary = salary;
}
// getter & setter 작성
// 2가지 변수를 한번에 리턴해주는 메서드 작성
@Override // 재정의
public String getEmployee() {
return name+"\t"+salary;
}
}
부모의 추상메서를 반드시 자식클래스에서
오버라이딩( overriding ) 해야하는 제약을 갖도록 하는 것이다. ( 메서드강제 )
+ 부모의 변수/메서드( concrete method ) 를 자식이 상속받아서 재사용.
ex)
버전1: 일반 클래스 Pet 인 경우
Pet
- name, age
- eat( ){ }
// 자식인 Cat, Dog, Bird, ... 에서 eat 기능의 메서드를 마음대로 작성가능.
관리어려움
Cat
eatCat( ) { s.o.u("쩝쩝"); }
Dog
eatDog( ) { s.o.u("냠냠"); }
Bird
@Override
eat( ) { s.o.u("짹짹"); }
ex)
버전2: 추상 클래스 Pet 인경우
// 자식인 Cat, Dog, Bird,... 에서 eat( ) 메서드로만 사용하도록 강제.
abstract Pet
- name, age
- abstract eat( ){ }
Cat
@Override
eat( ) { s.o.u("쩝쩝"); }
Dog
@Override
eat( ) { s.o.u("냠냠"); }
Bird
@Override
eat( ) { s.o.u("짹짹"); }
'Programming > JAVA(eclipse)' 카테고리의 다른 글
java 10일차 _ 9일차 정리 (0) | 2024.03.21 |
---|---|
java 9일차 _05. 인터페이스 (0) | 2024.03.20 |
java 9일차 _04. 추상클래스 (0) | 2024.03.20 |
java 9일차 _03. 접근지정자 (0) | 2024.03.20 |
java 9일차 _02. Object 의 toString( ) (0) | 2024.03.20 |