function 은 'function name 이 하나의 변수다' 라고 생각하시면 됩니다.
따라서 님의 질문에서 단독라인으로 test(x, y) 라고 쓰면 안되는것은
real :: a, b
...
a
...
처럼 단독라인으로 위의 a 가 안되는것과 똑같습니다.
그리고 같은 이유로 해서 굳이 다른 변수로 치환하지 않아도 됩니다.
함수의 출력값을 바로 받아보고 싶으면
print*, test(a, b)
로 쓰면 됩니다.
인수가 들어가서 실행이 되는순간 test 라는 변수에 값이 들어가는것이라고 보면 쉽겠죠.
이경우
implicit none 의 경우이고, 정의된 function 이 external 이라면
선언부에 추가로 real :: test 의 형선언을 해주어야 합니다.
그렇지 않고
implicit none 의 경우이고 internal 에 정의된 function 이라면 function 에 형선언이 들어있어야 합니다. 예컨데 아래와 같습니다.
real FUNCTION TEST(X,Y)
.....
.....
.....
RETURN
END
명료성을 위해서 두리 뭉실한 return 보다는
test = x**y
처럼 해서 리턴을 확실하게 정해주는것이 쉬운코드가 됩니다.
end 도 endfunction test 로 쓰는것을 추천합니다.
포트란에서 부 프로그램은 다양한 방식으로 쓸수 있기 때문에 혼란이 있을수 있습니다.
개인적인 생각으로는 이식성과 캡슐화를 위해서 될수 있으면 implicit none과 external function 을 쓰시기를 권장합니다.
즉 endprogram 라인 바깥쪽에 function 을 형선언과 같이 정의하는 것이죠. 이렇게 해두면 프로그램이 점점 커질때 상당한 명료함과 시간절약을 할수 있습니다.
c의 void type 처럼 쓰시고 싶으시다면 subroutine 을 써야 합니다.
(사실 c에서 void 를 쓰는게 권장사항이 아닙니다. 정석은 void 보다는 보통 int 를 써서 그 루틴이 제대로 돌았는지 확인할수 있도록 특정값을 리턴하게 하는것이 원칙으로는 맞습니다.)
포트란에서는 function 과 subroutine 을 확연하게 구분지어 놓았는데 사실 어느것을 쓰더라도 common 이나 적절한 전역변수를 억세스 하는 기능을 부여하면 같은 기능을 구현할수 있습니다. (common 을 쓰지 않는 프로그램을 짜기를 권장합니다. common 을 쓰기 시작하면 코드 재활용의 측면은 의미를 잃게 됩니다.)
그런데 하나의 값을 리턴하는 평범한 부 프로그램의 경우 function 을 쓰는것이 편리하고, 복잡한 기능을 구현하여야 할경우는 subroutine 을 쓰면 가능합니다.