[Java] 오버로딩, 오버라이딩, 하이딩
클래스 상속 (Inheritance)
- 기존 클래스를 확장하여 새로운 클래스를 정의하는 방법
- 부모 클래스의 속성과 메서드를 자식 클래스가 물려받는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 부모 클래스
class Animal {
void eat() {
System.out.println("This animal eats food.");
}
}
// 자식 클래스
class Dog extends Animal {
void bark() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 부모 클래스의 메서드
dog.bark(); // 자식 클래스의 메서드
}
}
오버로딩 (Overloading)
- 같은 이름의 메서드를 여러 개 정의하는데, 매개변수의 타입이나 개수가 다르도록 하는 것
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MathUtils {
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) {
MathUtils mu = new MathUtils();
System.out.println(mu.add(1, 2)); // 3
System.out.println(mu.add(1.5, 2.5)); // 4.0
System.out.println(mu.add(1, 2, 3)); // 6
}
}
오버라이딩 (Overriding)
- 부모 클래스의 메서드를 자식 클래스가 재정의하는 것
- 자식 클래스의 객체에서 호출될 때, 자식 클래스의 메서드가 실행된다.
- 자식 클래스 생성자로 인스턴스(객체 변수)를 생성할 때, 자료형을 부모 클래스로 지정하면 생성된 인스턴스는 부모 클래스로 묵시적 형 변환이 되고, 이 경우 기본적으로 부모 클래스의 변수와 메소드를 사용하지만, 부모 클래스와 자식 클래스에 동일한 이름의 메소드가 있는 경우 생성된 인스턴스, 즉 자식 클래스의 메소드가 호출된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Animal {
void sound() {
System.out.println("This animal makes a sound.");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.sound(); // The dog barks.
}
}
하이딩 (Hiding)
- 부모 클래스의 정적(static) 메서드를 자식 클래스에서 동일한 이름으로 재정의하는 것
- 부모 클래스의 메서드는 숨겨지고, 자식 클래스의 메서드가 호출된다.
- 정적 메서드나 변수는 클래스 수준에서 정의되며, 인스턴스가 아니라 클래스 자체에 속한다.
- 자식 클래스에서 동일한 이름의 정적 메서드나 변수를 정의하면, 해당 자식 클래스를 통해 접근할 때 부모 클래스의 동일한 이름의 메서드나 변수에 접근할 수 없게 된다.
- 즉 부모클래스를 통해 접근할 때에는 오버라이딩 된 것이 아니라 하이딩 된 것 뿐이므로 부모 클래스의 메서드가 호출된다.
- 자식클래스를 통해 접근해야(자식 클래스 생성자로 인스턴스를 생성해야) 자식 클래스의 메서드 호출 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Parent {
static void display() {
System.out.println("Static method in Parent");
}
}
class Child extends Parent {
static void display() {
System.out.println("Static method in Child");
}
}
public class Main {
public static void main(String[] args) {
Parent.display(); // Static method in Parent
Child.display(); // Static method in Child
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class P {
public static void func1(){
System.out.println("A")
}
}
class C extends P {
public static void func1(){
System.out.println("C")
}
}
P p1 = new C();
p1.func1(); // A
C p2 = new C();
p2.func1(); // C
This post is licensed under CC BY 4.0 by the author.