Post

[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.