[Java] 10. 상속 - 부모 클래스와 자식 클래스
1. 상속 (Inheritance)
부모 클래스와 자식 클래스라니.. 말 그대로 상위 클래스와 하위 클래스로 사용하는 의미입니다
일단 상속을 왜 쓰는지 비유하며 간단하게 설명하자면
동물 클래스(Animal)이 있을 때, 동물의 공통되는 점을 변수나 메서드로 사용하게 될 것입니다
그러나 동물 중에서도 ‘새’, ‘고양이’, ‘물고기’ 등 조금 더 세부적인 범주로 들어가면 원래는 따로 클래스를 써야하죠
하지만 ‘상속’을 이용한다면 어떤 동물이든 ‘동물’로서의 공통점을 공유하며 사용할 수 있게 될 것입니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Animal Class
public class Animal {
protected String name;
protected int age;
public void sleep() {
System.out.println(name + "은/는 자는 중...");
}
public void print() {
System.out.println("[정보] 이름 : " + name + ", 나이 : " + age);
}
}
// Dog Class
public class Dog extends Animal {
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public void bark() {
System.out.println(name + " : 왈왈!");
}
}
// Main Class
public class Main {
public static void main(String[] args) {
Dog d = new Dog("바둑이", 10);
d.print();
d.bark();
d.sleep();
// [정보] 이름 : 바둑이, 나이 : 10
// 바둑이 : 왈왈!
// 바둑이은 자는 중...
}
}
뭔가 바둑이라 하니까 시골 느낌이지만 넘어갑시다
Dog
는 Animal
의 특징을 상속받았기 때문에, Dog
클래스에는 ‘print’와 ‘sleep’ 메서드가 없어도 사용할 수 있게 됩니다
그리고 Dog
만의 고유한 ‘bark’ 메서드를 추가해서 사용하는 것도 가능합니다
Dog
가Animal
클래스를 상속받음Animal
: 부모 클래스Dog
: 자식 클래스 부모 클래스와 자식 클래스는 이렇게 구분하시면 됩니다
2. 상속 관계에서의 형변환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// 동물 클래스 (부모 클래스)
public class Animal {
private String name;
private int age;
Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void printInfo() {
System.out.println("[Animal Class] 이름 : " + name + ", 나이 : " + age);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
// 강아지 클래스 (자식 클래스)
public class Dog extends Animal {
private String barkSound;
Dog(String name, int age, String barkSound) {
super(name, age);
this.barkSound = barkSound;
}
public void bark() {
System.out.println(barkSound);
}
}
// 고양이 클래스 (자식 클래스)
public class Cat extends Animal {
private String cryingSound;
Cat(String name, int age, String cryingSound) {
super(name, age);
this.cryingSound = cryingSound;
}
public void crying() {
System.out.println(cryingSound);
}
}
// 메인 클래스
public class Main {
public static void printAnimalInfo(Animal animal) {
System.out.println("[Main Class] 이름 : " + animal.getName() + ", 나이 : "+animal.getAge());
if (animal instanceof Cat) {((Cat) animal).crying();}
}
public static void main(String[] args) {
Dog myPet1 = new Dog("바둑이", 10, "왈왈!");
Cat myPet2 = new Cat("꽃순이", 6, "야옹~");
printAnimalInfo(myPet1);
printAnimalInfo(myPet2);
// 출력 결과 :
// [Main Class] 이름 : 바둑이, 나이 : 10
// [Main Class] 이름 : 꽃순이, 나이 : 6
// 야옹~
}
}
super에 관한 내용은 뒤에서 보고, 일단 나머지 내용도 조금 긴 것 같으니 요약해서 봅시다
- [27, 43] : Animal 클래스를 상속받는 Dog, Cat 클래스
- [36, 52] : Dog와 Cat은 각각 bark, crying 메서드가 있음
- [61 ~ 65] : Animal 객체를 매개변수로 정보를 출력하는 printAnimalInfo 메서드
- [64] :
instanceof
로 어떤 클래스의 인스턴스인지 확인
여기서 printAnimalInfo
에는 Dog
객체와 Cat
객체 둘 다 넣을 수 있습니다, 둘 다 Animal을 상속 받으니까요
이러면은 정보를 작성하는 Dog를 받는 메서드와 Cat을 받는 메서드를 따로 쓸 필요가 없습니다
게다가 instanceof
를 통해 Animal
객체가 매개변수여도 어떤 클래스의 인스턴스인지 확인할 수 있습니다
형변환(casting)은 업캐스팅과 다운캐스팅, 두 종류가 있습니다
- 업캐스팅(UpCasting) : 자식 클래스 -> 부모 클래스로 형변환
- 다운캐스팅(DownCasting) : 부모 클래스 -> 자식 클래스로 형변환
위 예시의 printAnimalInfo
의 인자에 ‘Dog’나 ‘Cat’의 인스턴스를 넣으면 ‘Animal’로 업캐스팅되어 사용합니다
반대로 고양이의 특유한 울음 메서드를 쓰기 위해 다시 ‘Animal’에서 ‘Cat’으로 다운캐스팅하여 사용하였습니다
단, Animal 객체를 만든 뒤 다운 캐스팅을 하고 crying
메서드를 사용하면 문법 오류가 발생합니다
3. super() 그리고 super
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Animal 클래스의 생성자
Animal(String name, int age) {
this.name = name;
this.age = age;
}
// Cat 클래스의 생성자
Cat(String name, int age, String cryingSound) {
super(name, age);
this.cryingSound = cryingSound;
}
// Dog 클래스의 생성자
Dog(String name, int age, String barkSound) {
super(name, age);
this.barkSound = barkSound;
}
super()
Dog
와Cat
의 생성자에 부모 클래스의 생성자를 호출하는super()
를 사용했습니다
즉, 부모 클래스의 생성자를 호출할 때에는 ‘super()’를 사용해주시면 됩니다super
예시에는 없지만 super 키워드를 통해 부모 클래스의 멤버에 접근할 수도 있습니다
어쨌든 상속받았으니 this 키워드를 사용할 수도 있지만 부모와 자식 클래스의 구분을 위해 사용됩니다