jwy411 / docs

https://jwy411.github.io/docs
0 stars 0 forks source link

JavaTutorial - Interfaces #10

Open jwy411 opened 4 years ago

jwy411 commented 4 years ago

https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

Default Methods

Default methods enable you to add new functionality to the interfaces of your libraries and ensure binary compatibility with code written for older versions of those interfaces.

디폴트 메소드를 사용한다면 (이전 버전에 대한) 이진 호환성을 보장하면서 라이브러리 인터페이스에 새로운 기능을 추가 할 수 있다.

*이진 호환성: 클래스를 변경할 때, 그 클래스를 사용하는 클래스들에서 리컴파일 할 필요가 없는것.

package defaultmethods;

import java.time.*;

public interface TimeClient {
    void setTime(int hour, int minute, int second);
    void setDate(int day, int month, int year);
    void setDateAndTime(int day, int month, int year,
                               int hour, int minute, int second);
    LocalDateTime getLocalDateTime();

    static ZoneId getZoneId (String zoneString) {
        try {
            return ZoneId.of(zoneString);
        } catch (DateTimeException e) {
            System.err.println("Invalid time zone: " + zoneString +
                "; using default time zone instead.");
            return ZoneId.systemDefault();
        }
    }

    default ZonedDateTime getZonedDateTime(String zoneString) {
        return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }
}

You specify that a method definition in an interface is a default method with the default keyword at the beginning of the method signature. All method declarations in an interface, including default methods, are implicitly public, so you can omit the public modifier.

With this interface, you do not have to modify the class SimpleTimeClient, and this class (and any class that implements the interface TimeClient), will have the method getZonedDateTime already defined.

인터페이스 안에서 default 키워드를 이용하여 메소드를 선언하면 (참고로 인터페이스에서 선언되는 모든 함수의 접근자는 암시적으로 public 이다.) TimeClient 인터페이스를 구현한 모든 클레스를 수정하지 않고 미리 구현된 getZonedDateTime 메소드를 사용 할 수 있다.

Extending Interfaces That Contain Default Methods (Default 메소드가 정의된 인터페이스 상속하기)

When you extend an interface that contains a default method, you can do the following:

  • Not mention the default method at all, which lets your extended interface inherit the default method.
  • Redeclare the default method, which makes it abstract.
  • Redefine the default method, which overrides it.

default 메소드가 정의된 인터페이스를 상속하면 다음과 같은 것을 할 수 있다.

Static Methods

Static methods, which have the static modifier in their declarations, should be invoked with the class name, without the need for creating an instance of the class, as in ClassName.methodName(args).

Static 메소드는 static 접근자로 선언된 메소드이며, 클레스의 인스턴스 생성 없이 클레스 명 + 함수명 으로 호출할 수 있다.

궁금한 것

class ExtendedStaticMethodClass extends StaticMethodClass { }

interface StaticMethodInterface { static String name() { return "StaticMethod"; } }

interface ExtendedStaticMethodInterface extends StaticMethodInterface { }

public class StaticMethodInheritance { public static void main(String[] args) { System.out.println(StaticMethodClass.name()); // StaticMethod System.out.println(ExtendedStaticMethodClass.name()); // StaticMethod

    System.out.println(StaticMethodInterface.name()); // StaticMethod
    System.out.println(ExtendedStaticMethodInterface.name()); // error: cannot find symbol
}

}

jwy411 commented 4 years ago

Static Methods

Static methods, which have the static modifier in their declarations, should be invoked with the class name, without the need for creating an instance of the class, as in ClassName.methodName(args).

Static 메소드는 static 접근자로 선언된 메소드이며, 클레스의 인스턴스 생성 없이 클레스 명 + 함수명 으로 호출할 수 있다.

궁금한 것

class ExtendedStaticMethodClass extends StaticMethodClass { }

interface StaticMethodInterface { static String name() { return "StaticMethod"; } }

interface ExtendedStaticMethodInterface extends StaticMethodInterface { }

public class StaticMethodInheritance { public static void main(String[] args) { System.out.println(StaticMethodClass.name()); // StaticMethod System.out.println(ExtendedStaticMethodClass.name()); // StaticMethod

    System.out.println(StaticMethodInterface.name()); // StaticMethod
    System.out.println(ExtendedStaticMethodInterface.name()); // error: cannot find symbol
}

}