Java 이름 재사용 - 오버라이딩 / 하이딩 / 섀도윙 / 모호화

05 April 2014

오버라이딩 (overriding)

자식 클래스에 있는 인스턴스 메서드가 부모 클래스의 접근 가능한 메서드와 동일한 이름과 매개변수를 가지는 것. 오버라이딩 되면 동적 바인딩이 가능해짐. 따라서 JVM은 실행중에 인스턴스의 자료형에 기반하여 호출할 메서드를 결정함.

하이딩 (hiding)

class Parent {
    public static void f() { }
}
  
class Child extends Parent {
    public static void f() { }  // Parent.f()를 하이딩함
}

부모클래스의 필드, static 메서드, 클래스, 인터페이스와 동일한 이름으로 자식 클래스에도 요소를 생성하면, 자식에서 만든 요소가 부모에 있는 요소를 하이딩한다. 이처럼 하이딩을 사용하면 부모 클래스의 멤버를 자식 클래스가 상속(사용)하지 못하게 만들 수 있다.

오버로딩 (overloading)

클래스 내부의 메소드끼리 이름은 같은데 매개변수가 다른 것. 메소드를 호출할 때 어떤 메소드를 사용할지는 컴파일할 때 결정된다.

섀도윙 (shadowing)

변수, 메소드, 클래스, 인터페이스의 이름을 같은 영역에서 동일하게 사용하면 이름이 겹쳐 섀도윙이 발생한다. 예를 들어, 인스턴스 변수의 이름과 인스턴스 메소드 내부의 지역변수 이름이 같은 경우이다. 어떤 대상이 섀도윙되면 해당 대상을 이름으로 접근할 수 없다. 다양한 방법을 사용하면 접근할 수 있겠지만, 전히 접근 불가능한 경우도 있다. 일반적으로 섀도윙은 사용하지 않는 것이 좋다. 하지만 많은 개발자들이 생성자에서 인스턴스 변수의 초기화를 할 때 일반적으로 섀도윙을 사용한다.

모호화

public class Obscure {
    static String System;  // java.lang.System을 모호화한다
     
    public static void main(String[] args) {
        System.out.println("Hello World!");  // System 식별자가 모호화되어 컴파일되지 않는다
    }
}

변수와 클래스 또는 변수와 인터페이스의 이름이 같으면, 해당 이름을 사용했을 때 변수를 선택하게 되는데, 이런 경우를 ‘변수가, 다른 타입(클래스/인스턴스)의 이름을 모호화한다’고 표현한다. 모호화는 다른 이름 재사용과 다르게 이름이 다른 네임스페이스에 있어도 적용되는 이름 재사용이다. 따라서 패키지, 클래스, 인터페이스 등이 모호화되면 특정한 네임스페이스에서만 허용하는 문법을 제외하면 해당 대상을 선택할 수 없다. 물론 자바 네이밍 컨벤션을 잘 지켜서 개발한다면 모호화가 발생하지 않는다.

프로세스와 쓰레드의 차이 쓰레드의 배타제어 (mutual exclusion) / 동기화 (synchronized)