Java - Method Overridding, Field shadowing

1 분 소요

Java - Method Overridding

  • Method Overridding은 “기본 클래스(base class)에서 기정의된 method를, base class를 상속받는 derive class에서 새롭게 정의하여, 덮어씌워버리는 것”을 말합니다.
    • Method Overloadring은 “메소드 이름은 같지만, 메소드에서 필요로 하는 parameter 종류 혹은 개수가 다른 것”을 말합니다.
  • Method Overridding은 같은 이름을 가진 서로 다른 객체들에 대해서 동일한 방식으로 호출될 수 있고, 객체의 class에 따라서 해당 객체의 클래스에 속하는 method가 호출되도록 해줍니다. 즉, 다형성을 지원하는 기능이죠.
  • 설명이 어려웠는지 모르겠지만, 코드로 보면 다음과 같습니다.
    • class AprintName라는 method를 가지고 있고, class BprintName을 가지고 있습니다.
    • 따라서, A 객체에서 printName 메소드를 실행하면, A객체에 연결된 메소드가 실행되고, B 객체에서 printName 메소드를 실행하면, B객체에서 연결된 메소드가 실행됩니다.
    • 만약, base class의 method를 사용하려면, derived class 내에서 super를 사용하면 되죠.
public class A {
    public void printName() {
        System.out.printf("This is Base Class\n");
    }
}

class B extends A {
    public void printName() {
        System.out.printf("This is Derived Class\n");
    }
}

Java - field name shadowing

  • 이전에는 method에 관한 내용이었습니다. 다만, field에서도 비슷하게 적용됩니다.
  • 아래 코드를 보시면 class Aname이라는 변수(field)를 가지고 있고, class B 또한 name라는 변수를 가지고 있습니다. 그리고 class Bclass A를 상속받은 클래스죠.
  • 그렇다면, “동시에 name이 두 개 존재하는 걸까요?” 아니면, “derive class의 name이 base class의 name을 덮어 씌우는 걸까요?”.
  • 답은, 동시에 존재하는 겁니다. base class의 name은 derived class에서 super.를 통해 접근할 수 있고, 그냥 this.를 통해 접근하는 아이들은 derived class의 name이죠.
public class A {
    // base class A 가 가진 name, 
    public String name;
    public A() {
        this.name = "baseName";
    }
    public void printName() {
        System.out.printf("@name: %s \n", this.name);
    }
}

class B extends A {
    // derived class B 가 가진 name, 
    // B.name이 생긴다고 해서, A.name이 사라지는 것이 아님.
    public String name;
    public B() {
        this.name = "extendedName";;
    }
    public void printName() {
        System.out.printf("super @name: %s, extends @name: % \n", super.name, this.name);
    }
}
  • 다음과 같이 간단한 코드를 실행하면, base class의 name과 derived class의 name에 모두 접근할 수 있는 것을 알 수 있습니다.
B b1 = new B();
b1.printName(); // super @name: baseName, extends @name: extendedName 

Wrap-up

  • 물론, 이런 접근 방식이 가능하지만, 굳이 이렇게 해야 할 필요성은 없습니다. 굳이 base class와 derived class에 같은 이름의 변수를 넣어서 class를 설계하는 것이 필요할 때가 언제인지 잘 모르겠네요.

Reference

댓글남기기