• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

선언형 프로그래밍과 명령형 프로그래밍

22.03.27 23:50 작성 조회수 486

1

안녕하세요 강사님~!
 
예제로 들어주신 선언형 프로그래밍 소스코드도 number가 6 이상, 2로 나눌 수 없는 것을 filtering 한다는 점에서 앞의 명령형처럼 구체적 알고리즘이 적혀있는 것 같아서 두 차이점이 헷갈리는데, 좀 더 명확히 구분할 수 있는 방법 없을까요?
 
for문 역할 대신 stream, filter로만 바뀐걸로 보여서요 ㅠ 함수형 프로그래밍이, 명령형 프로그래밍, 선언형 프로그래밍이 헷갈립니다.

답변 2

·

답변을 작성해보세요.

3

혁진님, 안녕하세요?

제가 설명이 부족해서 헷갈리시는 것 같은데 다시 한번 잘 설명해보겠습니다. ^^;

우선 저희가 프로그래밍에 대해서 전혀 모르는 상태에서 선언형 프로그래밍을 배우고 있다고 가정을 해볼게요.

그럴 경우, filter() 메서드에게 'number > 6 && (number % 2 != 0)' 이런 조건을 주면서 "요런 조건 줄테니까 여기 해당하는 데이터 좀 줘"라고 부탁을 할테구요.

다음에는 filter() 메서드 내부에서 if 문과 for 문을 사용해서 데이터를 필터링 할텐데 여기서 if문과 for문이 구체적인 알고리즘에 해당합니다.  

즉, 사용자가 최소한의 조건을 지정해주고, 나머지 제어는 filter() 메서드에게 맡기는 것입니다.

결국 구체적 알고리즘이라는 것은 if, for 같은 전통적인 명령형 프로그래밍에서 사용하는 제어문들을 직접적으로 사용하는 거라고 보시면 될 것 같아요.

 

그리고 함수형 프로그래밍에 대한 개념은 간단한 예제로 대체 하겠습니다.

아래 예제는 함수형 프로그래밍 방식이 적용되지 않았을 경우입니다.

public class NotFunctionalBasic {
public static void main(String[] args) {
String message = getMessage(getName());

System.out.println(message);
}

private static String getMessage(String name) {
return "Hello " + name;
}

private static String getName() {
return "Kevin";
}
}

getMessage(getName())보시면 getMessage() 메서드의 파라미터로 마치 getName()이라는 메서드를 전달하는 것 처럼 보이지만 사실은 getName() 메서드의 리턴 값인 "Kevin"이라는 문자열을 getMessage()의 파라미터로 전달합니다. 

 

아래 에제는 함수형 프로그래밍 방식이 적용된 예제입니다.

public class FunctionalBasic {
public static void main(String[] args) {
String name = "Kevin";
String message = getMessage(() -> "Hello " + name);

System.out.println(message);
}

private static String getMessage(Supplier<String> s) {
return s.get();
}

}

getMessage(() -> "Hello " + name)을 보시면 파라미터로 전달한 () -> "Hello " + name 은 앞에서 본 예제처럼 즉시 호출되는 것이 아니라 getMessage() 쪽으로 실제로 전달이 된 후에 그 안에서 무언가 처리를 진행합니다.

 

두 예제의 결과는 동일한데 메서드의 파라미터로 값을 전달하느냐, 함수를 전달하느냐 그 차이에요.

 

이처럼 어떤 메서드의 파라미터로 함수가 전달이 된다면 함수형 프로그래밍 방식입니다.

사실 자바는 다른 언어처럼 실제 함수 자체를 전달하는 것이 아니라 함수형 인터페이스를 전달하는것인데,

자바에서는 람다 표현식을 사용해서 이런 방식으로 함수형 인터페이스를 전달하는 것을 함수형 프로그래밍이라고 부르고 있어요.

 

질문에 답이 되셨는지 모르겠네요.

다른 질문이 있으시면 언제든지 편하게 말씀해주세요.

감사합니다!

 

1

에반황님의 프로필

에반황

질문자

2022.03.29

완전히 궁금증이 해결됐습니다~!! 감사합니다 ^^