본문 바로가기
개념

[이것이 자바다] chapter.14 확인 문제

by cook_code 2023. 4. 3.
반응형

1. 람다식에 대한 설명으로 틀린 것은 무엇입니까?

  1. 람다식은 함수적 인터페이스의 익명 구현 객체를 생성한다. 
  2. 매개 변수가 없을 경우 ()->{...} 형태로 작성한다. 
  3. {x, y} -> {return x+y;}는 (x, y)->x+y로 바꿀 수 있다. 
  4. @FunctionalInterface가 기술된 인터페이스만 람다식으로 표현이 가능하다. 

2. 메소드 참조에 대한 설명으로 틀린 것은 무엇입니까?

  1. 메소드 참조는 함수적 인터페이스의 익명 구현 객체를 생성한다.
  2. 인스턴스 메소드는 "참조변수::메소드"로 기술한다. 
  3. 정적 메소드는 "클래스::메소드"로 기술한다. 
  4. 생성자 참조인 "클래스::new"는 매개 변수가 없는 디폴트 생성자만 호출한다. 

3. 잘못 작성된 람다식은 무엇입니까?

  1. a -> a+3
  2. a,b -> a*b
  3. x -> System.out.println(x/5)
  4. (x,y) -> Math.max(x,y)

4. 다음 코드는 컴파일 에러가 발생합니다. 그 이유가 무엇입니까?

package org.chpater14;

import java.util.function.IntSupplier;

public class LamdaExample {

    public static int method(int x, int y) {
        IntSupplier supplier = () -> {
        //오류가 나는 부분
            x += 10;
            int result = x + y;
            return result;
        };
        int result = supplier.getAsInt();
        return result;
    }

    public static void main(String[] args) {
        System.out.println(method(3, 5));
    }
}

답안: 

람다식 안에 선언된 매개변수와 로컬 변수는 final 특성을 가지고 있어 데이터 변경이 불가능하다. 

매개 변수 또는 로컬 변수를 람다식에서 읽는 것은 허용되지만, 람다식 내부 또는 외부에서 변경할 수 없다. 
p.687

5. 다음은 배열 항목 중에 최대값 또는 최소값을 찾는 코드입니다. maxOrMin() 메소드의 매개값을 람다식으로 기술해보세요.

package org.chpater14;

import java.util.function.IntBinaryOperator;
import java.util.function.IntSupplier;

public class LamdaExample {
    public static int[] scores = {10, 50, 3};

    public static int maxOrMin(IntBinaryOperator operator) {
        int result = scores[0];
        for (int score : scores) {
            result = operator.applyAsInt(result, score);
        }
        return result;
    }

    public static void main(String[] args) {
        //코드 작성
       int max = maxOrMin(
                (x, y) -> {
                    if (x >= y) return x;
                    else return y;
                }
        );
        System.out.println("최대값 : " + max);
        
        //코드 작성
       int min = maxOrMin(
                (x, y) -> {
                    if (x <= y) return x;
                    else return y;
                }
        );
        System.out.println("최대값 : " + min);
    }

}

6. 다음은 학생의 영어 평균 점수와 수학 평균 점수를 계산하는 코드입니다. avg() 메소드를 선언해보세요.

package org.chpater14;

import java.util.function.ToIntFunction;

public class LamdaExample2 {
    private static Student[] students =
            {       new Student("홍길동", 90, 96),
                    new Student("류현수", 95, 93)
            };

    public static void main(String[] args) {
        double englishAvg = avg(s -> s.getEnglishScore());
        System.out.println("영어 평균 점수:" + englishAvg);
        double mathAvg = avg(s -> s.getMathScore());
        System.out.println("수학 평균 점수:" + mathAvg);
    }

    //avg() 메소드 작성
    private static double avg(ToIntFunction<Student> function) {
        int sum = 0;
        for (Student student : students) {
            sum += function.applyAsInt(student);
        }
        double avg = (double) sum / students.length;
        return avg;

    }

    private static class Student {
        private String name;
        private int englishScore;
        private int mathScore;

        public Student(String name, int englishScore, int mathScore) {
            this.name = name;
            this.englishScore = englishScore;
            this.mathScore = mathScore;
        }

        public String getName() {
            return name;
        }

        public int getEnglishScore() {
            return englishScore;
        }

        public int getMathScore() {
            return mathScore;
        }
    }
}

7. 6번의 main() 메소드에서 avg()를 호출할 때 매개값으로 준 람다식을 메소드 참조로 변경해보세요.

double englishAvg = avg(s -> s.getEnglishScore());
-> double englishAvg = avg(Student::getEnglishScore);

double mathAvg = avg(s -> s.getMathScore());
-> double mathAvg = avg(Student::getMathScore);

 

반응형