30분 시작 Java8의 기본 방법 및 정적 인터페이스 방법 학습
지난 글30분 시작 Java8의 lambda 표현식에서 우리는 람다 표현식을 배웠다.이제 자바8의 새로운 언어 특성에 대한 학습을 계속합니다. 오늘 우리가 배워야 할 것은 기본 방법과 정적 인터페이스 방법입니다.
이 Java8의 새로운 언어 기능은 Android N에서도 지원됩니다.Android 개발에서 Java8의 개발 환경을 설정하는 방법은 이전 글30분 동안 Java8의 lambda 표현식을 시작합니다.을 참조하십시오.
기본 방법
기본 방법은 우리로 하여금 소프트웨어 라이브러리의 인터페이스에 새로운 방법을 추가할 수 있게 하고, 이 인터페이스를 사용하는 오래된 버전 코드에 대한 호환성을 확보할 수 있게 한다.
다음은 간단한 예를 통해 다음 기본 방법을 깊이 있게 이해합니다.
1. 어느 날, PM은 우리 제품이 시간과 날짜를 받아야 한다고 말했다.그래서 우리는 날짜 시간을 설정하고 가져오는 인터페이스 클래스인 TimeClient를 썼다.
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();
}
그리고 이 인터페이스의 실현 클래스SimpleTimeClient
:
public class SimpleTimeClient implements TimeClient {
private LocalDateTime localDateTime;
public SimpleTimeClient(){
localDateTime = LocalDateTime.now();
}
@Override
public void setTime( int hour, int minute, int second) {
LocalTime localTime = LocalTime.of(hour, minute, second);
LocalDate localDate = LocalDate.from(localDateTime);
localDateTime = LocalDateTime.of(localDate,localTime);
}
@Override
public void setDate( int day, int month, int year) {
LocalDate localDate = LocalDate.of(day, month, year);
LocalTime localTime = LocalTime.from(localDateTime);
localDateTime = LocalDateTime.of(localDate, localTime);
}
@Override
public void setDateAndTime( int day, int month, int year, int hour, int minute, int second) {
LocalDate localDate = LocalDate.of(day, month, year);
LocalTime localTime = LocalTime.of(hour, minute, second);
localDateTime = LocalDateTime.of(localDate, localTime);
}
@Override
public LocalDateTime getLocalDateTime() {
return localDateTime;
}
@Override
public String toString() {
return localDateTime.toString();
}
public static void main(String[] args) {
TimeClient timeClient = new SimpleTimeClient();
System.out.println(timeClient.toString());
}
}
2. 그런데 PM이 우리 이 제품은 국내용뿐만 아니라 다양한 시간대의 고객들도 사용한다고 합니다.그래서 당신에게 새로운 수요를 증가시켰습니다: 지정된 시간대의 날짜와 시간을 얻기이전에 우리는 모두 이렇게 했다.
인터페이스 다시 쓰기, 추가 방법
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();
//
ZonedDateTime getZonedDateTime(String zoneString);
}
이렇게 하면 우리의 실현류도 상응하여 다시 써야 한다.
public class SimpleTimeClient implements TimeClient {
private LocalDateTime localDateTime;
...
ZonedDateTime getZonedDateTime(String zoneString){
return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
}
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();
}
}
}
이렇게 쓰면 TimeClient 인터페이스를 실현한 모든 종류를 다시 써야 한다.이것은 우리의 실현 수요에 대한 부담을 크게 증가시켰다.바로 자바 인터페이스에서 추상적인 방법만 정의할 수 있는 문제를 해결하기 위해서다.Java8에는 기본 메서드의 특성이 새로 추가되었습니다.다음은 기본 방법을 사용하여 수요를 실현할 것입니다.
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));
}
}
기본 방법 키워드는 default
입니다. 이전에 우리는 인터페이스에서만 실현되지 않은 방법을 정의할 수 있었습니다.기본 방법이 있으면 우리는 완전한 방법을 작성할 수 있다.이렇게 하면 우리는 계승 인터페이스의 실현 클래스를 수정할 필요가 없고 인터페이스에 새로운 방법을 추가하여 실현할 수 있다.
public static void main(String[] args) {
TimeClient timeClient = new SimpleTimeClient();
System.out.println(timeClient.toString());
System.out.println(timeClient.getZonedDateTime( "test" ));
}
기본 메서드가 포함된 인터페이스 상속우리가 기본 방법을 포함하는 인터페이스를 계승할 때, 일반적으로 다음과 같은 세 가지 상황이 있다
기본 방법을 상관하지 않고 계승된 인터페이스가 기본 방법을 계승합니다
//1.
public interface AnotherTimeClient extends TimeClient{
}
다음 테스트 코드를 통해 Another TimeClient 인터페이스가 TimeClient 인터페이스의 기본 방법을 그대로 계승했다는 것을 알 수 있습니다 getZonedDateTime
Method[] declaredMethods = AnotherTimeClient. class .getMethods();
for (Method method:declaredMethods){
System.out.println(method.toString());
}
//output:
//public default java.time.ZonedDateTime xyz.johntsai.lambdademo.TimeClient.getZonedDateTime(java.lang.String)
기본 방법을 다시 성명하면 이 방법을 추상적인 방법으로 바꿀 수 있다
// ,
public interface AbstractZoneTimeClient extends TimeClient{
@Override
ZonedDateTime getZonedDateTime(String zoneString);
}
테스트에서 getZonedDateTime 방법이 기본 방법에서 추상적인 방법으로 변경됨을 알 수 있습니다.
Method[] methods = AbstractZoneTimeClient. class .getMethods();
for (Method method:methods){
System.out.println(method.toString());
}
//output:
//public abstract java.time.ZonedDateTime xyz.johntsai.lambdademo.AbstractZoneTimeClient.getZonedDateTime(java.lang.String)
기본 방법을 재정의하면 방법이 다시 쓰일 수 있습니다
//3.
public interface HandleInvalidZoneTimeClient extends TimeClient {
default ZonedDateTime getZonedDateTime(String zoneString){
try {
return ZonedDateTime.of(getLocalDateTime(), ZoneId.of(zoneString));
} catch (DateTimeException e) {
System.err.println( "Invalid zone ID: " + zoneString +
"; using the default time zone instead." );
return ZonedDateTime.of(getLocalDateTime(),ZoneId.systemDefault());
}
}
}
HandleInvalidZoneTimeClient
인터페이스를 실현하는 클래스는 다시 쓴 getZonedDateTime
방법을 가지고 있다.정적 방법
Java8의 인터페이스에서 우리는 기본 방법뿐만 아니라 정적 방법도 쓸 수 있다.위의 예에서 정적 방법을 마침 썼다.
public interface TimeClient {
// ...
static public 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 public ZonedDateTime getZonedDateTime(String zoneString) {
return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
}
}
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Liquibase】DB 작성·테이블 정의 변경신규 스타터 프로젝트 작성 Liquibase와 MySQL 선택 application.properties에 DB 정보 넣기 MySQL에서 "testdatabase"라는 데이터베이스 만들기 빌드 종속성 추가 build....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.