나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Language/Java

이름 재사용과 관련된 기술

devidea 2016. 10. 13. 10:36
자바 퍼즐러를 읽는 중에 이름 재사용과 관련되어 개념을 명확히 하지 않으면 버그가 나올 가능성이 많아 정리를 해보았다.
(물론 책에 나온 내용을 정리하는 수준이다)

오버라이딩
자식 클래스에 있는 인스턴스 메서드가 부모 클래스의 접근 가능한 메서드와 동일한 이름과 매개변수를 가지면 오버라이딩 합니다.
오버라이딩되면 동적 디스패치가 가능해집니다.

여기서 동적 디스패치란 무엇인가? 동적 디스패치는 동적바인딩과 동일한 개념이다.
동적 바인딩 설명

가상머신은 실행 중에 인스턴스의 자료형에 기반해서 호출할 메서드를 결정한다.
class Base {
    public void f() { }
}

class Derived extends Base {
    public void f() { }
}


하이딩
부모 클래스의 필드, 정적 메서드, 클래스, 또는 인터페이스와 동일한 이름으로
자식 클래스의 필드, 정적 메서드, 클래스 또는 인터페이스 이름을 만들면, 자식에서 만든 요소가 부모에 있는 요소를 하이딩한다.
하이딩을 하면 부모 클래스의 멤버를 상속하지 못할 수 있다.
class Base {
    public static void f() { }
}

class Derived extends Base {
    public static void f() { }      // Base.f()를 숨김
}


오버로딩
클래스의 메서드끼리 이름은 같은데 매개변수가 다르면 메서드 오버로딩이 일어난다.
메서드를 호출할 때 어떤 메서드를 사용할지는 컴파일할 때 결정된다.
class CircuitBreaker {
    public void f(int i) {}
    public void f(String s) {}
}


섀도윙
변수, 메서드, 클래스, 인터페이스의 이름을 같은 영역에서 동일하게 사용하면 이름이 겹쳐 섀도윙이 발생합니다.
어떤 대상이 섀도윙되면, 해당 대상을 이름으로 접근할 수 없습니다.
class Whoknows {
    static String sentence = "I don't know;";

    public static void main(String[] args) {
        String sentence = "I know!";        // static 필드 sentence를 섀도윙합니다.
        System.out.println(sentence);       // 지역변수 sentence가 출력됩니다.
    }
}


모호화
변수와 클래스 또는 인터페이서의 이름이 같으면 해당 이름을 사용했을 때 변수를 선택하게 됩니다. 이렇게 변수와 클래스 또는 인터페이스의 이름이 같은 영역에서 사용되면, 변수가 다른 타입의 이름을 모호화한다고 표현합니다. 모호화는 다른 이름 재사용과 다르게 이름이 다른 네임스페이스에 있어도 적용되는 이름 재사용입니다. 따라서 패키지, 클래스, 인터페이스 등이 모호화되면, 특정한 네임스페이스에서만 허용하는 문법을 제외하면, 해당 대상을 선택할 수 없습니다.

class Obscure {
    static String System;   // java.lang.System을 모호화합니다.

    public static void main(String[] args) {
        // 다음 줄은 System 식별자가 모호화되어 컴파일되지 않습니다.
        System.out.println("hello, obscure world!");
    }
}


반응형

'Language > Java' 카테고리의 다른 글

[Java8] sorted groupBy  (0) 2019.01.11
[multi thread] java.util.concurrent Part 1  (0) 2019.01.04
Dynamic Proxies  (0) 2017.08.29
[Java8] 람다란 무엇인가?  (0) 2017.08.09
[Java8] CompletableFuture 정리  (0) 2017.08.09