다형성
분명히 안다고 생각했는데 면접때 제대로 대답을 못해서 다시 정리하는
다형성이란?
다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.
자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조 할 수 있도록 하여 구현하고 있습니다.
다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다.
자바에서 다형성 구현 종류
상속 클래스 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Parent {
public String name;
Parent() {
this.name = "";
}
Parent(String name) {
this.name = name;
}
void print() {
System.out.println("I'm Parent");
}
}
class Child extends Parent {
Child(String name) {
super(name);
}
}
메소드 오버라이딩
오버라이딩 : 상위 클래스의 메서드를 하위 클래스에서 재정의하는 행위를 의미한다.
오버라이딩 개념도 꼭!! 기억하자 왜 하나도 비슷하지 않은데 이름만 비슷해서 맨날 헷갈려
1
2
3
4
5
6
7
8
9
10
11
12
13
class Child extends Parent {
Child(String name) {
super(name);
}
@Override
void print() {
System.out.println("I'm Child");
}
}
업캐스팅하여 객체 선언
업캐스팅 : 자식 클래스 객체를 부모 클래스로 형변환한다.
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
class Animal {
public void speak() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
public void speak() {
System.out.println("멍멍!");
}
}
class Cat extends Animal {
public void speak() {
System.out.println("야옹!");
}
}
public class Main {
public static void main(String[] args) {
// 업캐스팅하여 객체 선언
Animal animal1 = new Dog(); // Dog 클래스 객체를 Animal 클래스 타입으로 업캐스팅
Animal animal2 = new Cat(); // Cat 클래스 객체를 Animal 클래스 타입으로 업캐스팅
// Animal 클래스의 메소드 호출
animal1.speak(); // 출력: "멍멍!"
animal2.speak(); // 출력: "야옹!"
}
}
부모 클래스 객체로 자식 메소드 호출
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
class Parent {
public void show() {
System.out.println("부모 클래스의 메소드입니다.");
}
}
class Child extends Parent {
@Override
public void show() {
System.out.println("자식 클래스의 메소드입니다.");
}
}
public class Main {
public static void main(String[] args) {
// 부모 클래스 객체 생성
Parent parentObj = new Parent();
// 자식 클래스 객체 생성
Child childObj = new Child();
// 부모 클래스 객체로 자식 클래스의 메소드 호출
parentObj.show(); // 출력: "부모 클래스의 메소드입니다."
// 자식 클래스 객체로 자식 클래스의 메소드 호출
childObj.show(); // 출력: "자식 클래스의 메소드입니다."
}
}
장점
유연성과 확장성을 제공한다는 것이 장점!
동일한 메소드를 여러 클래스에서 다르게 구현할 수 있으므로, 코드를 재사용하고 확장하기가 훨씬 쉬워집니다.
단점
실행 시간에 객체의 실제 타입을 확인해야 하므로 약간의 오버헤드가 발생할 수 있습니다.
이는 성능에 영향을 줄 수 있다고 한다.
This post is licensed under CC BY 4.0 by the author.