서론
객체 지향의 특징 4가지를 정리할 예정입니다.
1. 캡슐화
2. 추상화
3. 상속
4. 다형성
다형성이란
다형성(Polymorphism) : 동일한 인터페이스나 상위 클래스(상속)에서 정의된 메서드를 여러 하위 클래스에서 각기 다르게 구현할 수 있게 하는 기능
다형성의 이점
- 코드의 유연성: 동일한 인터페이스를 구현하거나 동일한 상위 클래스를 상속받는 객체들이 동일한 메시지(메서드 호출)에 대해 각기 다른 방식으로 반응할 수 있습니다.
- 확장성: 새로운 클래스가 추가되더라도 기존 코드를 수정할 필요 없이 확장할 수 있습니다.
- 재사용성: 상위 클래스나 인터페이스를 기반으로 다양한 하위 클래스를 생성하여 코드의 재사용성을 높입니다.
- 유지 보수성: 코드의 유지 보수가 용이해지며, 버그를 줄이고 수정 시 영향을 최소화할 수 있습니다.
다형성의 종류
다형성의 종류로는 2가지가 존재합니다.
1. 정적 다형성 = 컴파일타임 다형성
2. 동적 다형성 = 런타임 다형성
1. 정적 다형성 = 컴파일타임 다형성 : 메서드 오버로딩(Method Overloading)
같은 클래스 내에서 동일한 이름의 메서드를 매개변수의 타입이나 개수에 따라 다르게 정의하는 것.
말 그대로 프로그램이 컴파일 될 때 발생하며 컴파일러가 메서드 호출을 어떤 메서드로 연결할 지 결정함.
class MathUtils {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
}
2. 동적 다형성 = 런타임 다형성 : 메서드 오버라이딩(Method Overriding)
상위 클래스의 메서드를 하위 클래스가 재정의(오버라이딩)하여, 동적 바인딩을 통해 실행 시점에 호출되는 메서드가 결정되는 것.
class Animal {
void makeSound() {
System.out.println("Some sound...");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // Outputs: Bark
myCat.makeSound(); // Outputs: Meow
}
}
동적 다형성 구현 방법
클래스 상속을 통한 구현 방법 (기존 메서드 오버라이딩 예시와 동일)
class Animal {
void makeSound() {
System.out.println("Some sound...");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // Outputs: Bark
myCat.makeSound(); // Outputs: Meow
}
}
인터페이스 구현을 통한 구현 방법
interface Shape {
void draw();
}
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a circle");
}
}
class Square implements Shape {
@Override
public void draw() {
System.out.println("Drawing a square");
}
}
public class Main {
public static void main(String[] args) {
Shape myCircle = new Circle();
Shape mySquare = new Square();
myCircle.draw(); // Outputs: Drawing a circle
mySquare.draw(); // Outputs: Drawing a square
}
}
정리
다형성으로 인해 우리는 객체 지향 프로그래밍에서 코드의 유연성과 재사용성을 극대화할 수 있습니다.
동일한 인터페이스나 상위 클래스를 사용하여 다양한 객체들이 동일한 방식으로 상호작용하게 하면서도 각기 다른 구현을 제공할 수 있습니다.
다형성은 메서드 오버로딩(정적 다형성)과 메서드 오버라이딩(동적 다형성)을 통해 구현되며,
상속과 인터페이스를 활용하여 실현됩니다.
반응형
'JAVA > 기초개념' 카테고리의 다른 글
객체 지향의 설계 원칙 SOLID 법칙 (0) | 2024.05.29 |
---|---|
[Java] 객체 지향 언어의 특징 - 상속 (0) | 2024.05.28 |
[Java] 객체 지향 언어의 특징 - 추상화 (1) | 2024.05.17 |
[Java] 객체 지향 언어의 특징 - 캡슐화(Encapsulation) (0) | 2024.05.16 |