자바 상속과 다형성 개념 정리
자바 상속과 다형성 요약
1. 상속의 기본
- 부모 클래스 (Super Class): 다른 클래스에 의해 상속되는 클래스
- 자식 클래스 (Sub Class): 다른 클래스에서 속성과 메서드를 상속받는 클래스
- 메서드 오버라이딩 (Method Overriding): 자식 클래스가 부모 클래스의 메서드를 재정의하는 것
- 메서드 오버로딩 (Method Overloading): 동일한 클래스 내에서 동일한 이름의 메서드를 매개변수의 타입이나 개수를 다르게 하여 여러 번 정의하는 것
예제
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
public class InheritanceDemo extends Object {
public static void main(String[] args) {
Horse h = new Horse();
h.display();
System.out.println(h.toString());
}
}
class Mammal {
public void display() {
System.out.println("나는 포유류");
}
}
class Horse extends Mammal {
@Override
public String toString() {
return "나는 제주말이야";
}
@Override
public void display() {
System.out.println("나는 제주말이야.");
}
}
2. private 멤버
- private 멤버는 상속되지 않는다. private 멤버에 접근하려면 getter와 setter 메서드를 사용해야 한다.
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class InheritanceDemo1 {
public static void main(String[] args) {
Frog f = new Frog();
// f.name = "개구리"; // private이기 때문에 불가
}
}
class Amphibia {
private String name;
int weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Frog extends Amphibia {
}
3. static 멤버
- static 멤버는 상속되지 않는다. 하지만 자식 클래스에서 접근할 수 있다.
예제
1
2
3
4
5
6
7
8
9
10
11
12
public class InheritanceDemo2 {
public static void main(String[] args) {
System.out.println(Student.age);
}
}
class Person {
static int age = 30;
}
class Student extends Person {
}
4. 생성자
- 생성자는 상속되지 않습니다. 자식 클래스의 생성자는 부모 클래스의 생성자를 명시적으로 호출해야 한다.
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class InheritanceDemo3 {
public static void main(String[] args) {
Sonata sonata = new Sonata("EF Sonata", 30_000_000);
System.out.printf("%,d", sonata.price);
}
}
class Car {
String name;
public Car(String name) {
this.name = name;
}
}
class Sonata extends Car {
int price;
public Sonata(String name, int price) {
super(name);
this.price = price;
System.out.println("나는 자식의 생성자");
}
}
5. 다형성 (Polymorphism)
- 다형성은 부모 클래스 타입의 참조 변수를 통해 자식 클래스 객체를 참조하는 것입니다.
예제
1
2
3
4
5
6
7
8
public class PolyMorphiDemo1 {
public static void main(String[] args) {
String str = "Hello, World!";
Object original = str; // 자식이 부모형으로 자동 형변환
if(original instanceof String) System.out.println("된다.");
else System.out.println("안된다");
}
}
배열을 사용한 예제
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
public class PolymorphiDemo3 {
public static void main(String[] args) {
Mammal[] array = new Mammal[4];
array[0] = new Dog();
array[1] = new Cat();
array[2] = new American();
array[3] = new Korean();
for (Mammal m : array) {
System.out.println(m);
m.sayThing();
}
}
}
abstract class Mammal {
abstract void sayThing();
}
class Dog extends Mammal {
@Override
void sayThing() {
System.out.println("멍멍!");
}
@Override
public String toString() {
return "Dog";
}
}
class Cat extends Mammal {
@Override
void sayThing() {
System.out.println("야옹!");
}
@Override
public String toString() {
return "Cat";
}
}
class American extends Mammal {
@Override
void sayThing() {
System.out.println("Hello!");
}
@Override
public String toString() {
return "American";
}
}
class Korean extends Mammal {
@Override
void sayThing() {
System.out.println("안녕하세요!");
}
@Override
public String toString() {
return "Korean";
}
}
6. 추상 클래스와 추상 메서드
- 추상 클래스는 추상 메서드(구현부가 없는 메서드)와 일반 메서드(구현부가 있는 메서드)를 모두 가질 수 있다.
- 추상 메서드는 하위 클래스가 반드시 구현해야 한다.
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class AbstractDemo {
public static void main(String[] args) {
Tiger t = new Lion();
t.display();
}
}
abstract class Tiger {
public void print() {
System.out.println("나는 정상적인 메소드");
}
public abstract void display();
}
class Lion extends Tiger {
@Override
public void display() {
System.out.println("나는 자식 메소드");
}
}
This post is licensed under CC BY 4.0 by the author.