다형성과 타입 변화
다형성(polymorphism)은 프로그래밍에서 여러 가지 형태를 가질 수 있는 능력을 가리킵니다. 객체 지향 프로그래밍에서 다형성은 한 가지 인터페이스나 추상 클래스를 여러 개의 클래스가 구현하거나 상속받을 수 있는 능력을 의미합니다. 이는 코드의 재사용성을 높이고 유연성을 확보하는 데 도움이 됩니다.
타입 변환(type conversion)은 데이터의 타입을 변환하는 과정을 의미합니다. 여기에는 암시적인 변환과 명시적인 변환이 있습니다.
- 다형성(Polymorphism):
- 정적 다형성(Static Polymorphism): 컴파일 시간에 결정되는 다형성입니다. 메소드 오버로딩이 이에 해당하며, 같은 이름의 메소드가 매개변수의 개수나 타입에 따라 다르게 동작하는 것을 말합니다
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}
* 동적 다형성(Dynamic Polymorphism): 실행 시간에 결정되는 다형성입니다. 메소드 오버라이딩과 인터페이스 구현을 통해 이 루어집니다.
// 동적 다형성의 예시
class Animal {
void makeSound() {
System.out.println("Some generic sound");
}
}
class Dog extends Animal {
void makeSound() {
System.out.println("Bark");
}
}
class Cat extends Animal {
void makeSound() {
System.out.println("Meow");
}
}
// 실행 시간에 어떤 객체가 메소드를 호출할지 결정됨
Animal myDog = new Dog();
myDog.makeSound(); // "Bark" 출력
타입 변환(Type Conversion):
- 암시적 변환(Implicit Conversion): 컴파일러가 자동으로 타입을 변환하는 것을 말합니다. 작은 데이터 타입에서 큰 데이터
타입으로의 변환 등이 여기에 해당합니다.
int x = 10;
double y = x; // 암시적 변환 발생
* 명시적 변환(Explicit Conversion): 프로그래머가 명시적으로 타입을 변환하는 것을 의미합니다. 이를 캐스팅(casting)이라고도
부릅니다.
double y = 10.5;
int x = (int) y; // 명시적 변환 발생
타입 변환은 데이터의 손실이 발생할 수 있으므로 주의가 필요합니다. 다형성과 타입 변환은 프로그래밍에서 중요한 개념으로, 객체 지향 언어에서 자주 활용됩니다.
2. instanceof 연산자
instanceof 연산자는 객체가 특정 클래스의 인스턴스인지를 확인하는 데 사용됩니다. 이 연산자는 주로 조건문에서 객체의 타입을 체크하거나, 다형성을 활용한 코드에서 특정 타입의 객체인지 확인할 때 유용하게 사용됩니다.
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
if (myDog instanceof Dog) {
System.out.println("myDog is an instance of Dog");
} else if (myDog instanceof Cat) {
System.out.println("myDog is an instance of Cat");
} else {
System.out.println("myDog is an instance of Animal");
}
}
}
이 코드에서 myDog instanceof Dog는 true를 반환하므로, "myDog is an instance of Dog"이라는 메시지가 출력됩니다. instanceof는 다형성을 활용하여 실행 시간에 객체의 타입을 확인하는 데 도움을 줍니다.
3. 오버라이딩과 오버로딩
오버로딩과 오버라이딩
-오버로딩과 오버라이딩은 자바의 탄생부터 지금까지 다음과 같은 특징들 때문에 프로그래밍 입문자들이 혼동하기 쉬운 용어이다.
▷메서드 이름이 같다
▷용어 생김새가 비슷하다
-오버로딩 : 자바는 매개변수의 자료형/개수/순서를 기반으로 메서드를 구별하므로 하나의 클래스 안에서 같은 이름의 메서드를 여러 개 구현하고
필요에 따라 메서드를 선택해 사용할 수 있다.
-오버라이딩 : 부모 클래스에게 상속받은 메서드를 재정의하여 자식 클래스용 메서드를 구현하고 자식 객체를 통해 메서드를 호출하면
오버라이딩된 메서드가 호출된다.
-간단히 정리하면 오버로딩은 새로운 메서드를 정의하는 것이며, 오버라이딩은 상속받은 기존의 메서드를 재정의하는 것을 말한다.