더 μžλ°”, Java8 - μΈν„°νŽ˜μ΄μŠ€ κΈ°λ³Έ λ©”μ†Œλ“œμ™€ μŠ€νƒœν‹± λ©”μ†Œλ“œ

μΈν„°νŽ˜μ΄μŠ€ 생성, λ©”μ„œλ“œ μ •μ˜

public interface Foo {
    
    void printName();
}

μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  클래슀 생성, λ©”μ„œλ“œ κ΅¬ν˜„

public class DefaultFoo implements Foo {

    String name;

    // νŒŒλΌλ―Έν„°λ‘œ name을 λ°›λŠ”λ‹€κ³  κ°€μ •
    public DefaultFoo(String name){
        this.name = name;
    }

    @Override
    public void printName(){
        System.out.println(this.name);
    }
}

μΈμŠ€ν„΄μŠ€ 생성 및 λ©”μ„œλ“œ 호좜

public class App {

    public static void main(String[] args) {

        Foo foo = new DefaultFoo("TheJava8");
        
        // TheJava8 좜λ ₯
        foo.printName();
    }
}

μΈν„°νŽ˜μ΄μŠ€μ— μƒˆλ‘œμš΄ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  경우, μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
이럴 경우, default ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ κΈ°λ³Έ λ©”μ„œλ“œλ₯Ό 였λ₯˜ 없이 μΆ”κ°€ν•  수 μžˆλ‹€.

public interface Foo {
    
    void printName();
    
    default void printNameUpperCase(){
        System.out.println(getName().toUpperCase());
    }
    
    String getName();
}
public class DefaultFoo implements Foo {
    
    @Override
    public void printName(){
        System.out.println(this.name);
    }
    
    String name;
    
    // νŒŒλΌλ―Έν„°λ‘œ name을 λ°›λŠ”λ‹€κ³  κ°€μ •
    public DefaultFoo(String name){
        this.name = name;
    }
    
    // getName λ©”μ„œλ“œ κ΅¬ν˜„
    @Override
    public String getName() {
        return this.name;
    }
}
public class App {

    public static void main(String[] args) {
    
        Foo foo = new DefaultFoo("TheJava8");
        
        // TheJava8 좜λ ₯
        foo.printName();
        
        // THEJAVA8 좜λ ₯
        foo.printNameUpperCase();
    }
}

κΈ°λ³Έ λ©”μ„œλ“œλŠ” κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•  μˆ˜λ„ μžˆλ‹€.

public class DefaultFoo implements Foo {

    @Override
    public void printName(){
        System.out.println(this.name);
    }

    String name;

    // νŒŒλΌλ―Έν„°λ‘œ name을 λ°›λŠ”λ‹€κ³  κ°€μ •
    public DefaultFoo(String name){
        this.name = name;
    }
    
    @Override
    public void printNameUpperCase() {
        System.out.println("Overrided " + this.name.toUpperCase());
    }

    // getName λ©”μ„œλ“œ κ΅¬ν˜„
    @Override
    public String getName() {
        return this.name;
    }
}
public class App {

    public static void main(String[] args) {

        Foo foo = new DefaultFoo("TheJava8");
        
        // TheJava8 좜λ ₯
        foo.printName();
        
        // Overrided THEJAVA8 좜λ ₯
        foo.printNameUpperCase();
    }
}

ν•˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ œκ³΅ν•˜λŠ” default κΈ°λŠ₯이 λͺ¨λ“  κ΅¬ν˜„μ²΄μ—μ„œ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λ¦¬λΌλŠ” 보μž₯이 μ—†λ‹€.
(μ–΄λ–»κ²Œ κ΅¬ν˜„ν–ˆλŠ”μ§€ λͺ¨λ₯΄κΈ° λ•Œλ¬Έμ—)

λ”°λΌμ„œ 였λ₯˜ λ°©μ§€λ₯Ό μœ„ν•΄ μ΅œμ†Œν•œμ˜ λ…Έλ ₯으둜 μ•„λž˜μ™€ 같이 @ImplSpec을 μ΄μš©ν•΄ λ¬Έμ„œν™”λ₯Ό μ§„ν–‰ν•΄μ•Όν•œλ‹€.

public interface Foo {
    
    void printName();
    
    /**
     * @ImplSpec 이 κ΅¬ν˜„μ²΄λŠ” getName()으둜 κ°€μ Έμ˜¨ 문자λ₯Ό λŒ€λ¬Έμžλ‘œ 좜λ ₯ν•œλ‹€.
     */
    default void printNameUpperCase(){
        System.out.println(getName().toUpperCase());
    }
    
    String getName();
}

Objectκ°€ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯은 default λ©”μ„œλ“œλ‘œ μ œκ³΅ν•  수 μ—†λ‹€.
ν•˜μ§€λ§Œ 좔상 λ©”μ„œλ“œλ‘œ μ„ μ–Έν•˜λŠ” 것은 κ°€λŠ₯ν•˜λ‹€.

public interface Foo {
    .
    .
    .
    // λΆˆκ°€λŠ₯ (error)
    default String toString(){}
    
    // κ°€λŠ₯
    String toString();
}

Foo μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속받은 Bar μΈν„°νŽ˜μ΄μŠ€μ—μ„œ Fooκ°€ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜κ³  μ‹Άμ§€ μ•Šμ„ 경우
Bar μΈν„°νŽ˜μ΄μŠ€μ—μ„œ λ‹€μ‹œ 좔상 λ©”μ„œλ“œλ‘œ μ„ μ–Έν•œλ‹€.

public interface Bar extends Foo {

    // μ΄λ ‡κ²Œ ν•˜λ©΄ Barλ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ—μ„œ Override ν•΄μ•Όν•œλ‹€.
    void printNameUpperCase();
}
public class DefaultBar implements Bar {

    String name;

    public DefaultBar(String name){
        this.name = name;
    }

    @Override
    public void printName() {
        System.out.println(this.name);
    }

    @Override
    public String getName() {
        return this.name;
    }
    
    @Override
    public void printNameUpperCase() {
        System.out.println("BAR");
    }
}
public class App {

    public static void main(String[] args) {

        Bar bar = new DefaultBar("TheJava8");
        
        // TheJava8 좜λ ₯
        bar.printName();
        
        // BAR 좜λ ₯
        bar.printNameUpperCase();
    }
}

Foo μΈν„°νŽ˜μ΄μŠ€μ—λ„ defaultκ°€ 있고 Bar에도 defaultκ°€ μžˆλŠ” 경우, κ΅¬ν˜„ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ—μ„œ Foo/Bar μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ‘˜ λ‹€ implementsν•˜κ²Œ 되면 λ…Όλ¦¬μ μœΌλ‘œ λ‘˜ 쀑에 μ–΄λ–€ 것을 μ‚¬μš©ν•΄μ•Όν• μ§€ λͺ¨λ₯΄κΈ° λ•Œλ¬Έμ— μ• λ§€ν•œ 상황이 λ°œμƒν•˜μ—¬ 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
μ΄λ ‡κ²Œ μΆ©λŒν•˜λŠ” κ²½μš°μ—λŠ” 직접 Overrideλ₯Ό ν•΄μ•Ό ν•œλ‹€.

public interface Bar {

    void printName();

    default void printNameUpperCase(){
        System.out.println(getName().toUpperCase());
    }

    String getName();
}
public interface Foo {

    void printName();

    default void printNameUpperCase(){
        System.out.println(getName().toUpperCase());
    }

    String getName();
}
public class DefaultBar implements Foo, Bar {

    String name;

    public DefaultBar(String name){
        this.name = name;
    }

    @Override
    public void printName() {
        System.out.println(this.name);
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public void printNameUpperCase() {
        System.out.println("DEFAULT BAR");
    }
}
public class App {

    public static void main(String[] args) {

        Bar bar = new DefaultBar("TheJava8");
        
        // TheJava8 좜λ ₯
        bar.printName();
        
        // DEFAULT BAR 좜λ ₯
        bar.printNameUpperCase();
    }
}

μœ ν‹Έλ¦¬ν‹°λ‚˜ 헬퍼 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜κ³  싢은 경우, static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•  수 μžˆλ‹€.

public interface Foo {
    .
    .
    static void printAnything(){
        System.out.println("Foo");
    }
}
public class App {

    public static void main(String[] args) {
        
        Foo.printAnything();
    }
}

좜처 :
μΈν”„λŸ° κ°•μ˜ - 더 μžλ°”, Java 8 (λ°±κΈ°μ„ )
https://www.inflearn.com/course/the-java-java8