추상 클래스
실체 클래스에 반드시 존재해야할 필드와 메소드를 선언한다.
실체 클래스에는 공통된 내용은 빠르게 물려받고, 다른 점만 선언하면 되므로 시간이 절약된다.
출처 : 혼자 공부하는 자바
추상 클래스는 abstract를 통해서 선언할 수 있다.
예시로 메소드를 추상타입으로 선언하면 자식 클래스에서 재정의해서 실행 내용을 채울 수 있다.
참고로 abstracte void study(); 와 같이 중괄호가 없이 메소드를 작성한다.
출처 : 혼자 공부하는 자바
실습 문제
실습문제 7-7. (추상클래스) Person 위의 최상위 클래스로 추상클래스 Animal을 구현함.
+ 추가적으로 7-6의 내용은 이전 자바 포스팅을 참고하면 된다.
(1) Animal 클래스에 추상메소드 speak()를 구현함.
(2) static 메소드 animalSpeak(Animal animal)을 구현하여 animal.speak()를 실행하도록 함. 문제 7-6번의 p1, p2, p3 객체들을 매개변수로 전달하여 메소드 다형성을 확인함.
(3) 7-6번의 main() 메소드 내용에 강제 형변환 테스트로써 p3를 할당받은 pAny 를 Student 클래스 변수 pStu 로 강제타입변환을 하여 study() 메소드를 실행함. 이때, pAny 가 Student 클래스의 인스턴스인지를 먼저 확인하고 진행함.
(4) 추상클래스 필드 다형성 테스트로써 Aniaml 클래스 변수 a1 에 pAny를 할당하고 a1.speak()를 실행하여 자식클래스의 메소드가 오버라이딩 되어 실행되는 것을 확인함.
(5) 출력예:
7장 종합 테스트 ====
제 이름은 감자바 나이는 30살입니다.
제 이름은 김영희 나이는 20살입니다.
== 그리고 학번은 123456 입니다.
== 자바를 열심히 공부합니다.
제 이름은 배철수 나이는 22살입니다.
== 그리고 학번은 234567 입니다.
== 그리고 월급은 200만원입니다.
== 열심히 알바도 합니다.
---- 필드 다형성 테스트 ----
제 이름은 김영희 나이는 20살입니다.
== 그리고 학번은 123456 입니다.
제 이름은 배철수 나이는 22살입니다.
== 그리고 학번은 234567 입니다.
== 그리고 월급은 200만원입니다.
---- 강제형변환 테스트 ----
== 자바를 열심히 공부합니다.
---- 추상클래스 테스트 ----
제 이름은 배철수 나이는 22살입니다.
== 그리고 학번은 234567 입니다.
== 그리고 월급은 200만원입니다.
---- 메소드 다형성 테스트 ----
제 이름은 감자바 나이는 30살입니다.
제 이름은 김영희 나이는 20살입니다.
== 그리고 학번은 123456 입니다.
제 이름은 배철수 나이는 22살입니다.
== 그리고 학번은 234567 입니다.
== 그리고 월급은 200만원입니다.
정답 코드 :
package AnimalEx;
public class PersonEx {
static void animalSpeak(Animal animal) {
animal.speak();
}
public static void main(String[] args) {
Person p1 = new Person("감자바",30);
Student p2 = new Student("김영희",20,123456);
StudentWorker p3 = new StudentWorker("배철수",22,234567,200);
System.out.println("7장 종합 테스트 ====");
p1.speak();
p2.speak();
p2.study();
p3.speak();
p3.work();
System.out.println("\n필드 다형성 테스트 ----");
Person pAny = p2;
p2.speak();
pAny= p3;
p3.speak();
System.out.println("\n---- 강제형변환 테스트 ----");
if(pAny instanceof Student) {
Student pStu = (Student) pAny;
pStu.study();
}
System.out.println("\n---- 추상클래스 테스트 ----");
Animal a1 = pAny;
a1.speak();
System.out.println("\n---- 메소드 다형성 테스트 ----");
animalSpeak(p1);
animalSpeak(p2);
animalSpeak(p3);
}
}
abstract class Animal {
abstract void speak();
}
class Person extends Animal {
private String name;
private int age;
Person(String name, int age){
this.name=name;
this.age=age;
}
@Override
void speak() {
System.out.printf("제 이름은 %s 나이는 %d살입니다.\n",this.name,this.age);
}
}
class Student extends Person{
int studentNo;
Student(String name, int age, int studentNo) {
super(name, age);
this.studentNo = studentNo;
}
@Override
void speak() {
super.speak();
System.out.printf("== 그리고 학번은 %d 입니다.\n",studentNo);
}
void study() {
System.out.println("== 자바를 열심히 공부합니다.");
}
}
class StudentWorker extends Student{
int salary;
StudentWorker(String name, int age, int studentNo, int salary) {
super(name, age, studentNo);
this.salary = salary;
// TODO Auto-generated constructor stub
}
@Override
void speak() {
super.speak();
System.out.printf("== 그리고 월급은 %d만원입니다.\n",salary);
}
void work() {
System.out.println("== 열심히 알바도 합니다.");
}
}
'대학교' 카테고리의 다른 글
데이터구조 - (10) 해시 테이블 (1) | 2023.11.29 |
---|---|
한국 근현대사 - (9) 제 4공화국, 제 5공화국 (1) | 2023.11.29 |
자바 - (10) 타입 변환과 다형성 (1) | 2023.11.24 |
파이썬 - (7) 클래스와 객체 (0) | 2023.11.24 |
데이터구조 - (9) 색인과 이진 검색 트리 (1) | 2023.11.22 |