안녕하세요!
오늘은 객체지향 프로그래밍의 핵심 개념인 '자바의 오버라이딩과 오버로딩'에 대해서 포스팅하려고 합니다. 자바 언어는 객체지향적인 접근을 강조하며, 이에 따라 메서드의 다형성을 구현하기 위한 오버라이딩과 메서드의 다양한 사용을 위한 오버로딩이 두 가지 주요 개념입니다. 이러한 개념들은 코드의 재사용성과 유지보수성을 높이는데 큰 역할을 하며, 자바 프로그래밍을 효율적으로 하기 위해 반드시 이해해야 하는 중요한 내용입니다.
그럼 오버라이딩과 오버로딩은 어떤 특징과 차이점이 있는지 알아보도록 하겠습니다.
오버라이딩 (Overriding)
오버라이딩은 상속 관계에서 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것을 말합니다. 자식 클래스는 부모 클래스의 메서드를 동일한 이름으로 재정의하면, 자식 클래스의 객체에서 해당 메서드가 호출됩니다. 이 때, 오버라이딩된 메서드는 부모 클래스의 메서드와 동일한 시그니처(메서드 이름, 매개변수 타입 및 개수)를 가져야 합니다. 오버라이딩을 통해 자식 클래스는 부모 클래스의 메서드를 자신에 맞게 수정하여 사용할 수 있습니다.
특징
1. 메서드 시그니처 동일성
오버라이딩된 메서드는 메서드 시그니처(메서드의 이름, 파라미터 타입 및 개수)가 부모 클래스의 메서드와 동일해야 합니다. 다만, 리턴 타입은 동일하지 않아도 됩니다.
2. 메서드 재정의
자식 클래스에서 오버라이딩된 메서드는 부모 클래스의 메서드를 덮어쓰게 됩니다. 따라서 자식 클래스의 객체에서 해당 메서드를 호출하면, 부모 클래스의 메서드가 아니라 자식 클래스의 오버라이딩된 메서드가 실행됩니다.
3. 동적 바인딩
오버라이딩은 런타임 시에 메서드의 호출을 결정하는 동적 바인딩과 관련이 있습니다. 즉, 메서드가 호출될 때 객체의 실제 타입을 기반으로 어떤 메서드가 실행될지 결정됩니다.
4. 다형성 구현
오버라이딩은 다형성을 구현하는 핵심 메커니즘 중 하나입니다. 부모 클래스의 참조 변수를 사용하여 여러 종류의 자식 클래스 객체를 다룰 수 있으며, 이때 오버라이딩된 메서드를 통해 각 객체의 특징을 활용할 수 있습니다.
5. super 키워드
자식 클래스에서 오버라이딩한 메서드 내에서 super 키워드를 사용하면 부모 클래스의 메서드를 명시적으로 호출할 수 있습니다. 이를 통해 부모 클래스의 기능을 유지하면서 추가적인 기능을 확장할 수 있습니다.
예시 코드
class Animal {
void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.makeSound(); // 출력: Dog barks
}
}
1. Animal 클래스는 makeSound 메서드를 정의하고 있습니다. 이 메서드는 "Animal makes a sound"라는 메시지를 출력합니다.
2. Dog 클래스는 Animal 클래스를 상속받아서 makeSound 메서드를 오버라이딩합니다. 즉, 부모 클래스에 정의된 메서드를 자식 클래스에서 다시 구현하고 있습니다. 이렇게 오버라이딩된 메서드는 부모 클래스의 메서드를 덮어쓰게 됩니다.
3. Main 클래스에서는 Animal 클래스 타입의 변수 animal을 생성하고, new Dog()로 초기화합니다. 이렇게 하면 animal 변수는 Dog 클래스의 인스턴스를 가리키게 됩니다.
4. animal.makeSound() 호출은 실제로 Dog 클래스의 makeSound 메서드가 실행됩니다. 이는 오버라이딩 덕분에 가능한데, animal 변수는 Dog 클래스의 인스턴스를 가리키고 있기 때문입니다. 결과적으로 "Dog barks"가 출력됩니다.
오버로딩 (Overloading)
오버로딩은 같은 이름의 메서드를 다양한 매개변수로 여러 개 정의하는 것을 말합니다. 오버로딩된 메서드들은 서로 다른 매개변수 개수 또는 타입을 가져야 합니다. 자바에서는 오버로딩을 통해 같은 작업을 수행하는 메서드들을 논리적으로 그룹화하여 코드를 더욱 간결하고 효율적으로 작성할 수 있게 해줍니다.
특징
1. 메서드 이름 동일성
오버로딩된 메서드들은 같은 이름을 사용합니다. 메서드 이름은 동일하지만, 파라미터의 개수나 타입이 다른 경우에 사용됩니다.
2. 파라미터 다양성
오버로딩된 메서드들은 파라미터의 개수나 타입이 다양합니다. 이로 인해 동일한 메서드 이름으로 다양한 파라미터 조합을 다룰 수 있습니다.
3. 메서드 시그니처
메서드 시그니처는 메서드의 이름과 파라미터의 개수, 타입으로 정의됩니다. 오버로딩된 메서드들은 같은 이름을 가지면서도 파라미터 시그니처가 서로 다릅니다.
4. 정적 바인딩
오버로딩된 메서드들은 컴파일 시에 어떤 메서드가 호출될지 결정됩니다. 정적 바인딩은 메서드 호출을 컴파일 시에 이미 결정하므로 실행 중에 메서드의 파라미터나 타입 변환이 영향을 주지 않습니다.
5. 같은 작업 다른 타입
동일한 작업을 다양한 데이터 타입에 대해 처리해야 할 때 오버로딩이 유용합니다. 예를 들어 print 메서드를 정수, 실수, 문자열 등 다양한 데이터 타입에 대해 오버로딩하여 사용자가 타입 변환을 신경쓰지 않고도 편리하게 출력할 수 있습니다.
6. 기본 타입 변환
자바에서는 오버로딩이 메서드 호출 시 자동으로 타입 변환을 수행할 수 있는 장점을 제공합니다. 예를 들어 정수와 실수 간의 덧셈을 처리하는 add 메서드를 정의할 때, 정수와 실수 타입을 각각 받는 오버로딩된 메서드를 구현하면 사용자가 별도의 타입 변환을 할 필요가 없습니다.
예시 코드
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
String add(String a, String b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator calculator = new Calculator();
System.out.println(calculator.add(5, 3)); // 출력: 8
System.out.println(calculator.add(2.5, 3.5)); // 출력: 6.0
System.out.println(calculator.add("Hello", "World")); // 출력: HelloWorld
}
}
위의 소스 코드는 오버로딩을 다양한 데이터 타입에 대해 사용하는 간단한 예제입니다. Calculator 클래스 내부에는 add 메서드가 정수, 실수, 문자열 각각에 대해 오버로딩되어 있습니다.
1. int add(int a, int b)
이 메서드는 정수 타입의 인자 두 개를 받아서 그 합을 반환합니다. 이 메서드는 정수 타입의 인자를 처리하기 위한 오버로딩 버전입니다.
2. double add(double a, double b)
이 메서드는 실수 타입의 인자 두 개를 받아서 그 합을 반환합니다. 실수 타입의 인자를 처리하기 위한 오버로딩 버전입니다.
3. String add(String a, String b)
이 메서드는 문자열 타입의 인자 두 개를 받아서 그 문자열을 이어 붙인 결과를 반환합니다. 문자열 타입의 인자를 처리하기 위한 오버로딩 버전입니다.
오버로딩을 사용하면 동일한 작업을 다양한 타입에 대해 처리할 수 있으며, 메서드 이름을 일관성 있게 유지하면서 여러 상황을 다룰 수 있습니다. 이 예제에서 Calculator 클래스의 add 메서드는 각각의 타입에 맞게 오버로딩되어 있으므로, 다양한 데이터 타입에 대한 연산을 편리하게 수행할 수 있습니다.
오버라이딩과 오버로딩의 차이
오버라이딩(Overriding)
- 상속 관계에서 발생합니다. 자식 클래스가 부모 클래스의 메서드를 재정의하는 것입니다.
- 메서드 시그니처(이름, 매개변수 개수, 데이터 타입, 반환 타입)가 동일해야 합니다.
- 컴파일러는 런타임에 어떤 메서드를 호출할지 결정합니다.
- 동적 다형성(런타임 다형성)을 지원합니다.
- 부모 클래스의 메서드를 자식 클래스에서 고쳐서 자식 클래스의 동작을 정의합니다.
오버로딩(Overloading)
- 같은 클래스 내에서 메서드 이름은 동일하지만 매개변수의 개수나 타입이 다른 메서드를 정의하는 것입니다.
- 메서드 시그니처가 다르므로 컴파일러가 어떤 메서드를 호출할지 컴파일 시간에 결정합니다.
- 정적 다형성(컴파일 타임 다형성)을 지원합니다.
- 같은 이름을 가진 메서드가 다양한 입력에 대해 작동하도록 합니다.
- 다양한 데이터 타입 또는 매개변수 개수에 따라 다른 기능을 수행할 수 있습니다.
차이점 요약
오버라이딩은 상속 관계에서 같은 메서드 시그니처를 가진 메서드를 자식 클래스에서 재정의하여 동적 다형성을 제공하며, 오버로딩은 같은 클래스 내에서 메서드 이름은 동일하지만 매개변수가 다른 다양한 메서드를 정의하여 정적 다형성을 지원합니다. 이를 통해 다양한 입력에 대해 적절한 동작을 수행할 수 있도록 합니다.
최종 정리
오늘은 객체지향 프로그래밍의 핵심 개념인 '자바의 오버라이딩과 오버로딩'에 대해서 정리해 봤습니다. 자바의 오버라이딩과 오버로딩은 객체지향 프로그래밍의 중요한 기초 개념 중 하나입니다. 이를 통해서 코드의 재활용성을 높이고 다양한 상황에 유연하게 처리할 수 있는 프로그래밍이 가능합니다.
오버라이딩과 오버로딩은 자바의 강력한 기능으로 메서드의 다형성을 실현하며 효율적인 개발과 유지보수를 가능하게 도와줍니다.
다양한 상황에서 적절히 활용하여 보다 효과적인 코드를 작성하고 객체지향 프로그래밍의 개념을 잘 이해하는 것이 중요합니다.
그럼 다음 포스팅에도 자바의 기본적인 내용들을 주제로 정리해 보도록 하겠습니다.
감사합니다.
'Java > java' 카테고리의 다른 글
자바 StringBuffer와 StringBuilder로 문자열 성능 향상하기! (0) | 2023.09.23 |
---|---|
자바 배열과 리스트의 특징과 활용 비교하기 (0) | 2023.09.21 |
자바 리스트 ArrayList로 효율적으로 데이터 처리하기 (0) | 2023.09.14 |
자바 배열에 대한 기본 개념과 활용 방법 알아보기 (0) | 2023.09.07 |
[Java] 자바 변수와 데이터 타입 알아보기 (0) | 2023.08.10 |