Java
[JAVA] 오버라이딩(Overriding) , 오버로딩(overloading) , super 와this
임혁진
2024. 11. 30. 03:24
자바 오버로딩(Overloading), 오버라이딩(Overriding), super와 this 이해하기
자바 프로그래밍에서 오버로딩, 오버라이딩, 그리고 super-this 키워드는 객체지향 프로그래밍의 핵심 개념입니다. 이들은 코드의 재사용성과 가독성을 높이고, 다양한 상황에서 유연하게 동작할 수 있도록 도와줍니다. 이 글에서는 이 세 가지 개념을 쉽게 이해할 수 있도록 예제를 통해 설명하겠습니다.
1. 오버로딩(Overloading)
오버로딩은 같은 이름의 메서드를 여러 개 정의하되, 매개변수의 타입이나 개수를 다르게 지정하여 사용할 수 있게 하는 기능입니다.
특징
- 컴파일 시간에 결정됩니다.
- 리턴 타입은 오버로딩을 구분하는 기준이 아닙니다.
class Calculator {
// 정수 두 개를 더하는 메서드
int add(int a, int b) {
return a + b;
}
// 실수 두 개를 더하는 메서드
double add(double a, double b) {
return a + b;
}
// 세 개의 정수를 더하는 메서드
int add(int a, int b, int c) {
return a + b + c;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(3, 5)); // 정수 덧셈 (출력 8)
System.out.println(calc.add(2.5, 4.3)); // 실수 덧셈 (출력 6.8)
System.out.println(calc.add(1, 2, 3)); // 세 정수 덧셈(출력 6)
}
}
2. 오버라이딩(Overriding)
오버라이딩은 상위 클래스의 메서드를 하위 클래스에서 재정의하는 것을 말합니다.
- 부모 클래스의 메서드를 하위 클래스에서 그대로 사용할 수 없거나, 특정 기능을 추가하고 싶을 때 유용합니다.
특징
- 런타임에 동작합니다.
- 메서드 이름, 매개변수, 리턴 타입이 모두 동일해야 합니다.
- @Override 어노테이션을 사용하여 의도적으로 재정의했음을 명시합니다.
class Animal {
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍!");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹!");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.sound(); // 멍멍!
cat.sound(); // 야옹!
}
}
3. super와 this 키워드
3.1 this 키워드
- 현재 객체를 참조합니다.
- 주로 인스턴스 변수와 매개변수의 이름이 동일할 때 구분하거나, 현재 클래스의 다른 생성자를 호출할 때 사용합니다.
예제
class Person {
String name;
Person(String name) {
this.name = name; // 매개변수 name과 인스턴스 변수 name 구분
}
void introduce() {
System.out.println("안녕하세요, 저는 " + this.name + "입니다.");
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("홍길동");
person.introduce(); // 안녕하세요, 저는 홍길동입니다.
}
}
3.2 super 키워드
- 부모 클래스의 멤버를 참조합니다.
- 주로 부모 클래스의 생성자 호출이나, 오버라이딩된 메서드 호출에 사용됩니다.
예제
class Parent {
void greet() {
System.out.println("부모님이 인사합니다.");
}
}
class Child extends Parent {
@Override
void greet() {
super.greet(); // 부모 클래스의 greet 호출
System.out.println("자식이 인사합니다.");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.greet();
}
}
실행 결과
부모님이 인사합니다.
자식이 인사합니다.
결론
- 오버로딩: 메서드 이름은 같지만, 매개변수 구성을 다르게 하여 다양한 입력을 처리합니다.
- 오버라이딩: 상위 클래스 메서드를 하위 클래스에서 재정의하여 다형성을 구현합니다.
- this와 super는 각각 현재 객체와 부모 객체를 참조하는 데 사용됩니다.
이 세 가지를 활용하면 더 구조적이고 재사용성이 높은 코드를 작성할 수 있습니다!