**바인딩(Binding)**은 메서드 호출이 코드와 연결되는 시점을 의미합니다. 자바에서는 크게 **정적 바인딩(Static Binding)**과 **동적 바인딩(Dynamic Binding)**이 있으며, 이 두 개념은 객체 지향 프로그래밍에서 매우 중요합니다. 🚀
1️⃣ 정적 바인딩 (Static Binding) ✨
정적 바인딩은 컴파일 타임에 메서드 호출이 결정되는 방식입니다. 자바에서는 private, static, final 메서드가 여기에 해당합니다.
특징
- 컴파일러가 호출할 메서드를 미리 결정!
- 성능이 빠름 (런타임에 추가 처리가 필요 없음).
- 다형성(Polymorphism)이 적용되지 않음.
✏️ 예제: 정적 바인딩
class Animal {
static void sound() {
System.out.println("Animal makes a sound 🐾");
}
}
class Dog extends Animal {
static void sound() {
System.out.println("Dog barks 🐶");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.sound(); // Animal makes a sound 🐾
}
}
🔍 분석
- sound() 메서드는 static으로 선언되었기 때문에 정적 바인딩이 적용됩니다.
- 변수 타입인 Animal을 기준으로 컴파일 타임에 Animal 클래스의 메서드가 호출됩니다.
- 즉, 객체가 Dog 타입이더라도 동적 바인딩은 적용되지 않습니다.
2️⃣ 동적 바인딩 (Dynamic Binding) 🌟
동적 바인딩은 런타임에 메서드 호출이 결정되는 방식입니다. 오버라이딩된 메서드를 호출할 때 주로 사용되며, 자바의 다형성을 구현하는 핵심 요소입니다.
특징
- 실행 중에 객체의 실제 타입을 기준으로 메서드 호출을 결정!
- 객체 지향 프로그래밍의 다형성을 지원.
- 약간의 성능 비용 발생 (런타임에 판단하기 때문).
✏️ 예제: 동적 바인딩
class Animal {
void sound() {
System.out.println("Animal makes a sound 🐾");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Dog barks 🐶");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("Cat meows 🐱");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal;
myAnimal = new Dog();
myAnimal.sound(); // Dog barks 🐶
myAnimal = new Cat();
myAnimal.sound(); // Cat meows 🐱
}
}
🔍 분석
- 메서드 sound()는 오버라이딩되었으며, 동적 바인딩이 적용됩니다.
- 변수 myAnimal의 실제 객체 타입에 따라 호출되는 메서드가 달라집니다.
- Dog와 Cat 클래스의 메서드가 각각 런타임에 선택됩니다.
3️⃣ 정리 📝
구분정적 바인딩동적 바인딩결정 시점 | 컴파일 타임 | 런타임 |
대상 | static, private, final 메서드 | 오버라이딩된 메서드 |
속도 | 빠름 | 다소 느림 (추가 처리 필요) |
다형성 지원 | ❌ | ✅ |
4️⃣ 적절히 섞어 보기 🍹
둘을 함께 사용하는 코드에서 어떤 바인딩이 적용되는지 이해해 봅시다!
✏️ 혼합 예제
class Animal {
static void staticMethod() {
System.out.println("Animal static method 🐾");
}
void instanceMethod() {
System.out.println("Animal instance method 🐾");
}
}
class Dog extends Animal {
static void staticMethod() {
System.out.println("Dog static method 🐶");
}
@Override
void instanceMethod() {
System.out.println("Dog instance method 🐶");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog();
myAnimal.staticMethod(); // Animal static method 🐾 (정적 바인딩)
myAnimal.instanceMethod(); // Dog instance method 🐶 (동적 바인딩)
}
}
🔍 분석
- staticMethod()는 정적 바인딩이 적용되어 변수 타입인 Animal 기준으로 호출됩니다.
- 반면, instanceMethod()는 동적 바인딩이 적용되어 실제 객체 타입인 Dog 기준으로 호출됩니다.
결론 🎉
자바의 정적 바인딩과 동적 바인딩은 각각 상황에 맞게 사용되며, 특히 동적 바인딩은 다형성 구현의 핵심입니다. 코드 작성 시 어떤 바인딩이 적용될지를 명확히 이해하면 더욱 깔끔하고 효율적인 프로그램을 만들 수 있습니다. ✨
'IT 개발 라이프 > Back_End' 카테고리의 다른 글
JWT(JSON Web Token) (0) | 2024.12.05 |
---|---|
자바 Stream 이란? 🚀 (0) | 2024.12.04 |
Feign Client란? 🤔 (0) | 2024.12.03 |
필드 주입과 생성자 주입 – 무엇이 더 나은 선택일까? 🌍 (1) | 2024.12.02 |
REST API란 무엇인가? 🌐 (0) | 2024.12.02 |