대학교

자바 - (11) 추상 클래스

매 석 2023. 11. 28. 21:23
반응형

추상 클래스

실체 클래스에 반드시 존재해야할 필드와 메소드를 선언한다.

실체 클래스에는 공통된 내용은 빠르게 물려받고, 다른 점만 선언하면 되므로 시간이 절약된다.

출처 : 혼자 공부하는 자바

추상 클래스는 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("== 열심히 알바도 합니다.");
	}
	
}