Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- hashcode
- Redis
- 레디스
- 파이썬 pip
- 깃허브
- 동등성
- maven 오류
- 알고리즘 입력받는 값
- Visual Studio Code 파이썬
- 신규 프로젝트 생성후 빌드시 오류
- 프라이탁 파이썬
- spring-boot-starter-parent
- 분산락
- 깃허브 방문자
- pip업그레이드
- 깃허브 뱃지
- setting.xml
- 깃허브 프로필
- 깃허브 리드미 꾸미기
- 파이썬 설치하기
- GitHub profile
- Redisson
- 깃허브 리드미
- 프라이탁
- 프라이탁 알림봇
- 윈도우10에 파이썬 설치
- 파이썬 설치
- 리드미 꾸미기
- Sanner와 BufferedReader의 차이점
- visual studio code
Archives
- Today
- Total
yeo72.devlog
[Java] 메서드 디스패치란? 본문
메서드 디스패치
메서드 호출 시 실제로 실행될 메서드를 결정하는 과정을 메서드 디스패치라고 합니다.
자바에서는 정적 디스패치(Static Dispatch)와 동적 디스패치(Dynamic Dispatch)의 두 가지 방법으로
메서드 디스패치를 구현할 수 있습니다.
메서드 디스패치가 왜 필요한가?
메서드 디스패치는 다형성을 구현하기 위한 기능으로, 여러 클래스가 동일한 메서드 이름을 가지고 있지만
객체의 실제 타입에 따라 다르게 동작할 수 있도록 합니다.
정적 디스패치
정적 디스패치는 컴파일 시간에 어떤 메서드를 호출할지 결정됩니다.
컴파일러는 호출할 메서드를 정확하게 알고 있는 경우에 정적 디스패치를 사용합니다.
컴파일 시점에 어떤 메서드를 호출할지 결정되기 때문에 런타임에는 메서드 디스패치가 필요하지 않습니다.
public class Print {
public void print(int x) {
System.out.println(x);
}
public static void main(String[] args) {
Print p = new Print();
p.print(10);
}
}
동적 디스패치
동적 디스패치는 런타임 시에 객체의 실제 타입을 확인하고 해당 타입에서 오버라이딩된 메서드를 호출합니다.
아래의 코드를 보면 animal.makeSound() 의 호출은 실제 객체가 Dog이기 때문에 Dog의 makeSound()메서드가 호출됩니다.
즉 컴파일 시점에 어떤 메서드를 호출해야 하는지 모르고 런타임 시점에 할당되는 객체의 메소드를 호출합니다.
class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.makeSound(); // 동적 디스패치, Dog 클래스의 makeSound() 메서드 호출
}
}
결론
메서드 디스패치는 다형성을 가능하게 하며, 코드의 유연성과 확장성을 높입니다.
정적 디스패치는 컴파일 시간에 결정되며, 동적 디스패치는 런타임 시간에 객체의 실제 타입을 기반으로 결정됩니다.
'Study > Java' 카테고리의 다른 글
[JAVA] 반복문 안에서 컬렉션 요소 변경하기 (0) | 2023.11.15 |
---|---|
[Java] 동일성과 동등성 (0) | 2023.11.12 |
ArrayList와 LinkedList는 언제 쓰면 좋을까? (0) | 2023.11.05 |
반복문(loop) 안에서 객체 생성과 성능 비교 (0) | 2023.10.18 |
[JAVA] 상속과 포함관계 (0) | 2023.09.12 |