๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java·๏ปฟServlet·๏ปฟJSP

JAVA 8 ๋ณ€๊ฒฝ ์‚ฌํ•ญ - interface์˜ default ํ‚ค์›Œ๋“œ์™€ static ๋ฉ”์†Œ๋“œ

by Leica 2020. 1. 2.
๋ฐ˜์‘ํ˜•

Java์—์„œ ๊ธฐ์กด์˜ interface๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋งŒ์„ ๋ฉค๋ฒ„๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Java8๋ถ€ํ„ฐ default ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ interface์— ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

default ํ‚ค์›Œ๋“œ

1
2
3
4
5
6
7
8
9
10
public interface ICalculator {
    
    int add(int x, int y);
    int sub(int x, int y);
    
    default int mul(int x, int y) {
        
        return x * y;
    }
}
cs

๋ฉ”์†Œ๋“œ๋ฅผ default ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์„ ์–ธํ•จ์œผ๋กœ์จ ๋ฉ”์†Œ๋“œ์˜ body, ์ฆ‰ ๊ตฌํ˜„๋ถ€๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์œ„ ์˜ˆ์‹œ๋Š” ์„ธ ๊ฐœ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฉค๋ฒ„๋กœ ๊ฐ–๋Š” ICalculator interface์ด๋ฉฐ mul ๋ฉ”์†Œ๋“œ๊ฐ€ default ํ‚ค์›Œ๋“œ๋กœ ๊ตฌํ˜„ํ•œ ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

1
2
3
4
5
6
7
8
9
10
11
12
public class Calculator implements ICalculator {
 
    @Override
    public int add(int x, int y) {
        return x + y;
    }
 
    @Override
    public int sub(int x, int y) {
        return x - y;
    }
}
cs

ํ•ด๋‹น interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” class์—์„œ๋Š”, default ํ‚ค์›Œ๋“œ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ add, sub ๋ฉ”์†Œ๋“œ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

1
2
3
4
5
6
7
8
9
public class CalcTest {
 
    public static void main(String[] args) {
 
        ICalculator cal = new Calculator();
        int result = cal.mul(53);
        System.out.println("5 * 3 = " + result);
    }
}
cs

Calculator class์—์„œ mul ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ICalculator interface์— default ํ‚ค์›Œ๋“œ๋กœ ๊ตฌํ˜„์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ–ผ ์‹คํ–‰ ๊ฒฐ๊ณผ

1
2
3
5 * 3 = 15
 
Process finished with exit code 0
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Calculator implements ICalculator {
 
    @Override
    public int add(int x, int y) {
        return x + y;
    }
 
    @Override
    public int sub(int x, int y) {
        return x - y;
    }
 
    @Override
    public int mul(int x, int y) {
        System.out.println(x + "์™€ " + y + "๋ฅผ ๊ณฑํ•ฉ๋‹ˆ๋‹ค.");
        return x * y;
    }
}
cs

๋ฌผ๋ก  ํ•„์š” ์‹œ, ์ด๋ ‡๊ฒŒ default ํ‚ค์›Œ๋“œ๋กœ ๊ตฌํ˜„๋œ ๋ฉ”์†Œ๋“œ๋ฅผ overriding ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

โ–ผ mul ๋ฉ”์†Œ๋“œ overriding ํ›„ ์‹คํ–‰ ๊ฒฐ๊ณผ

1
2
3
4
5์™€ 3๋ฅผ ๊ณฑํ•ฉ๋‹ˆ๋‹ค.
5 * 3 = 15
 
Process finished with exit code 0
cs

 

static ๋ฉ”์†Œ๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface ICalculator {
 
    int add(int x, int y);
    int sub(int x, int y);
 
    default int mul(int x, int y) {
 
        return x * y;
    }
 
    static void print(int value) {
 
        System.out.println(value);
    }
}
cs

๋˜ํ•œ Java8๋ถ€ํ„ฐ interface์— static ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์œ„ ICalculator interface์˜ print ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ทธ ์˜ˆ์— ํ•ด๋‹นํ•œ๋‹ค.

 

1
2
3
4
5
6
7
8
9
10
public class CalcTest {
 
    public static void main(String[] args) {
 
        ICalculator cal = new Calculator();
 
        // Calculator.print(100);
        ICalculator.print(100); // interface์˜ static ๋ฉ”์†Œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ interface๋ช….๋ฉ”์†Œ๋“œ ํ˜•์‹์œผ๋กœ ํ˜ธ์ถœ
    }
}
cs

๋‹จ, static ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ ๊ธฐ์กด ํด๋ž˜์Šค์˜ static ๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ class์ด๋ฆ„.๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ interface์ด๋ฆ„.๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

โ–ผ print ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ

1
2
3
100
 
Process finished with exit code 0
cs

 

์ •๋ฆฌ

๊ธฐ์กด์˜ Java interface์—์„œ๋Š” abstract ๋ฉ”์†Œ๋“œ๋งŒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ฐ˜๋ฉด, Java 8 ์ดํ›„๋ถ€ํ„ฐ Java abstract, default, static ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. (Java Documentation ์ฐธ๊ณ  : Oracle Java Tutorials - Defining an Interface)

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€