ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 19. 자바 인터페이스 with code body
    스프링개발자/201 - 일반 2020. 10. 2. 04:41

    자바8부터 인터페이스에도 코드를 쓸 수 있다.

    default 혹은 static 메소드에 한해서.

    인터페이스 변수(variable)를 갖는 것도 가능하다


    1. 코드를 품은 인터페이스

    public interface Objective {
    
        int offset = 2; // 변수도 선언 및 초기화 가능
    
        default int solve(int a, int b) {
            return offset + a + b; // 코드를 품은 녀석
        }
    
        int guess(int a, int b); // 원래 쓰는 방식
    }

    2. 인터페이스 구현체s

    public class MulObjective implements Objective {
    
        @Override
        public int solve(int a, int b) {
            return offset + a * b;
        }
    
        @Override
        public int guess(int a, int b) {
            return 5;
        }
    }
    public class Mul2Objective implements Objective{
    
        /*
        solve 메소드가 없다. 인터페이스의 solve를 사용한다.
         */
    
        @Override
        public int guess(int a, int b) {
            return a+b;
        }
    }

    3. 테스트

     

    @Test
    public void test1() {
    
        int a = 2;
        int b = 1;
    
        Objective objective = new Objective() { // interface instance
        @Override
        public int guess(int a, int b) {
       		 return 0;
        	}
        };
    
        // solve values from interface and mul2 are identical
        assertEquals(objective.solve(a, b), new Mul2Objective().solve(a, b));
    }
    @Test
    public void test2() {
    
        ArrayList<Objective> objectives = new ArrayList<>();
        objectives.add(new Mul2Objective());
        objectives.add(new MulObjective());
        int a = 2;
        int b = 1;
        int actualSolvedSum = objectives.stream().mapToInt(o -> o.solve(a, b)).sum();
    
        int expected_from_mul = 2 + a * b;
        int expected_from_mul2 = 2 + a + b;
        int expectedSolvedSum = expected_from_mul + expected_from_mul2;
        
        assertEquals(expectedSolvedSum, actualSolvedSum);
    }
Designed by Tistory.