/*
* 사물(유형) 개념(무형)
*
* 생물 무생물
*
* 동물 식물
*
* 척추 무척추
*
* 양서류 포유류 파충류 어류 조류
*
* 개구리 고양이
*/
package inheritance;
class Pos { // 2차원의 좌표를 표현할 수 있는 객체를 만들기 위한 클래스 Pos
int x;
int y;
Pos(int x, int y) {
this.x = x;
this.y = y;
}
void showPos() {
System.out.printf("x : %d, y : %d\n", x, y);
}
}
//class Pos3D { // 상속을 사용하지 않고, 3차원의 좌표를 표현하기 위한 클래스를 작성
// int x;
// int y;
// int z;
//
// Pos3D(int x, int y, int z) {
// this.x = x;
// this.y = y;
// this.z = z;
// }
// void showPos() {
// System.out.printf("x : %d, y : %d, z : %d\n", x, y, z);
// }
//}
class Pos3D extends Pos {
// int x; // Pos 클래스에서 물려받아서 안보이지만 가지고 있음
// int y; // Pos 클래스에서 물려받아서 안보이지만 가지고 있음
int z;
Pos3D(int x, int y, int z) {
super(x, y); // Pos(x, y)
this.z = z;
}
// void showPos() { // Pos 클래스에서 물려받아서 안보이지만 가지고 있음
// System.out.printf("x : %d, y : %d\n", x, y);
// }
@Override // 이 함수는 오버라이딩 되었습니다
void showPos() { // 상속받은 메서드와 형식이 일치하고, 내용은 새로 작성되었습니다
System.out.printf("x : %d, y : %d, z : %d\n", x, y, z);
}
}
public class Ex02 {
public static void main(String[] args) {
Pos ob1 = new Pos(2, 3);
ob1.showPos();
Pos3D ob2 = new Pos3D(5, 8, 7);
ob2.showPos();
}
}
package inheritance;
// 클래스의 상속관계를 이용하여 공통 속성은 슈퍼클래스에,
// 개별 속성은 각각의 서브 클래스에 만들어준다
class Human {
String name;
int age;
Human(String name, int age) {
this.name = name;
this.age = age;
}
void show() {
System.out.printf("이름 : %s, 나이 : %d살\n", name, age);
}
}
class Student extends Human {
int score;
Student(String name, int age, int score) {
super(name, age);
this.score = score;
}
@Override
void show() {
System.out.printf("이름 : %s, 나이 : %d, 점수 : %d\n", name, age, score);
}
}
class Doctor extends Human {
String major;
Doctor(String name, int age, String major) {
super(name, age);
this.major = major;
}
@Override
void show() {
System.out.printf("%s 의사 %s, %d살\n", major, name, age);
}
// Doctor 클래스의 고유 기능 (치료), 오버라이딩이 아님
void heal(Human other) {
System.out.printf("%s가 %s를 치료합니다\n", this.name, other.name);
}
}
public class Ex04 {
public static void main(String[] args) {
Student st1 = new Student("이지은", 30, 99);
Student st2 = new Student("홍진호", 41, 22);
Doctor d1 = new Doctor("김재준", 36, "신경외과");
Doctor d2 = new Doctor("김사부", 45, "내과");
st1.show();
st2.show();
d1.show();
d2.show();
Human h1 = st1; // 학생은 사람이다
Human h2 = st2;
Human h3 = d1; // 의사는 사람이다
Human h4 = d2;
System.out.println(h1.name);
System.out.println(h2.name);
System.out.println(h3.name);
System.out.println(h4.name);
// System.out.println(h1.score); // score cannot be resolved or is not a field
System.out.println(((Student)h2).score); // 강제 형변환
// System.out.println(h3.major);
System.out.println(((Doctor)h4).major);
// 다형성에 의해 서로 다른 타입으로 참조할 수 있지만, 타입에 따라 참조가능한 필드 범위가 달라진다
h1.show(); // show() 메서드는 Human 타입에 정의되어 있어서 호출이 가능하다
h2.show(); // 각 객체의 메서드는 서브클래스에 의해 오버라이딩(덮어씌우기)되어 있다
h3.show(); // 호출이 가능하지만, 호출한 후 실행되는 내용은 덮어씌운 내용으로 실행된다
h4.show(); // 강제 형변환이 없어도 서브 클래스의 내용대로 실행된다
((Doctor)h4).heal(h2); // 오버라이딩이 아니라서 강제 형변환이 필요하다
// 같은 자료형의 여러데이터를 묶어서 저장하는 구조 : 배열
Human[] arr = { h1, h2, h3, h4 };
for(int i = 0; i < arr.length; i++) {
arr[i].show();
}
}
}
위 코드를 보며 프로그램의 상속 관계를 이해하고 자식 클래스의 내부 함수를 업캐스팅 된 클래스에서 어떻게 실행시킬 수 있는지를 파악한다.
package animalHospital;
public abstract class Animal {
String name;
int age;
Animal(String name, int age) {
this.name = name;
this.age = age;
}
// 추상 메서드. 함수 내용이 없다
public abstract void bark(); // 울음소리
}