오버로딩이란?
같은 이름을 가진 메서드 또는 연산자를 매개변수의 형태를 다르게 정의해 여러 버전으로 정의하는것을 의미합니다.
연산자의 오버로딩이란 무엇인가요?
기존에 기본적으로 정의되어있던 연산자(+,-,== 등) 동작방식을
사용자가 정의한 타입에 대해 별도로 새롭게 정의하는 방식입니다.
예를들어 '내 타입끼리 +를 하게되면 이런식으로 계산해' 와 같이 새로운 규칙을 추가하거나, 개념을 덧붙이는 것을 의미합니다.
대신 연산자의 의미와 너무 다르게 동작할 경우 코드의 가독성이 떨어질 수 있어 주의해야 합니다.
public static Vector2 operator +(Vector2 a, Vector2 b)
{ return new Vector2(a.x + b.x , a.y+b.y) }
오버로딩은 어떻게, 이렇게 동작할 수 있는건가요?
여러개로 나눠진 오버로딩된 메서드는 서로 독립적인 메서드로 구분되며,
컴파일 시, 컴파일러가 메서드의 시그니처를 확인해 그에 맞게 호출되어야할 메서드를 연결시켜둡니다.
*시그니쳐 : 메서드 이름,매개변수 타입, 개수, 순서로 메서드를 구별하는 기준. 리턴 타입은 제외
오버라이드란 무엇인가요?
부모클래스에서 정의된 메서드를 자식클래스에서 재정의 해 다르게 동작하게 만드는 것을 의미합니다.
이러한 기능은 부모클래스가 정의한 동작이 자식클래스에선 다르게 동작해야할 필요가 있을때 활용될 수 있습니다.
오버라이드는 어떻게 이렇게 동작할 수 있나요?
오버라이드는 런타임에 객체의 실제 타입을 확인하고 가상테이블을 통해 올바른 메서드를 찾아 호출하는 방식입니다.
좀 더 구체적으로 설명해주세요
컴파일 시 부모클래스 내에 virtual 키워드가 정의된 메서드가 있을때, 컴파일러는 오버라이드의 가능성을 염두하기 위해
해당 클래스를 포함한 모든 파생클래스는 전부 가상메서드를 관리, 접근하기 위한 가상테이블을 추가적으로 관리하게 되며
해당 테이블은 코드영역의 주소값을 저장하게 됩니다.
이후 파생클래스 또한 같은 주소값의 복사본을 가지고 있다가 오버라이드 메서드를 만나게 될 경우 저장되어있던 가상테이블의 메서드 주소값을 덮어 씌우게 됩니다.
그로인해, 런타임중 실제 객체의 메서드 동작시 가상테이블의 주소값을 확인해 이에 맞는 메서드를 호출 할 수 있습니다.
'CS' 카테고리의 다른 글
| 컴파일의 각 단계 파고들기 (0) | 2025.04.22 |
|---|---|
| 컴파일 파고들기 (0) | 2025.04.22 |
| Static 파고들기 (0) | 2025.04.18 |
| 절차지향 프로그래밍 POP (0) | 2025.02.13 |
| 객체지향 프로그래밍 OOP (0) | 2025.02.13 |