함수

이가현·2023년 7월 16일
0

코틀린

목록 보기
2/12

함수의 구조는 fun + 함수 이름 + 매개 변수 + 반환 값의 자료형으로 이루어진다. 함수의 본문의 내용을 쓰고 return 값을 명시해준다. 만약 return 값이 없다면 return을 생략한다. (void로 선언하는 C언어와의 차이) 또한 매개변수가 필요 없다면 매개변수 역시 생략 가능하다.


사용 방법은 파이썬과 같다.

max함수를 간결히 표현했다.

매개변수

  • 매개변수의 기본값


    매개변수를 주지 않으면 알아서 default값으로 지정되어 출력된다.

    직접 값을 입력할 수도 있다.

  • 다양한 인자의 개수 전달

    vararg 키워드를 붙이면 된다.

함수형 프로그래밍

순수함수

순수 함수를 작성하여 프로그램의 부작용을 줄이는 프로그래밍 기법이다.

순수함수의 조건
1. 같은 인자에 대하여 항상 같은 값을 반환한다.
2. 함수 외부의 어떤 상태도 바꾸지 않는다.

고차함수

다른 함수를 인자로 사용하거나 함수를 결괏값으로 반환하는 함수다.

5째 줄에 고차함수가 사용된다.

람다식

-> 가 사용되었다. 람다식이 변수에 할당되어 변수 이름이 multi( )와 같이 함수 형태로 사용 가능하다.

자료형 선언(생략 가능), 매개 변수와 처리 내용 순으로 기입한다.

highOrder 함수에서 sum 람다 함수를 만들었다. main 함수 내에서 result라는 변수에 highOrder에서 람다 함수를 정의하였다.

out이라는 변수에 람다식을 넣었다. 매개변수는 없고 출력 return값도 없다. 따라서 ( )->Unit 이라 함. out을 함수처럼 사용가능하고 새로운 new 변수에 넣어도 똑같이 사용 가능하다.

가장 먼저 람다 함수를 들여다보고 lambda function 을 출력하고 true를 리턴한다. callByValue 함수에 true가 들어가서 callByValue function을 출력하고 true를 반환한다. 마지막으로 5째 줄을 출력한다.


람다식 이름을 사용해 호출도 가능하다.


(::) 콜론 두개를 사용하여 람다식처럼 사용하는 것 같다..(감만 잡힘) 예를 들어 4번째 줄에 fucnParam에 인자가 3개 들어 있는데 17째 줄에 그대로 대입한다. (c는 람다식) 람다식에 함수를 넣으려고 :: 을 사용하였다. 따라서 return sum(3, 2)가 된다.


noParam 함수의 매개변수는 람다식 1개인데, 소괄호를 생략 가능하다.

매개변수가 두 개 이상이면 소괄호 생략이 불가하다. 함수에서 람다식의 자료형을 지정해주고 실제 메인 함수에서 람다식의 쓰임을 지정해준다.

익명함수

익명함수란 일반 함수이지만 이름이 없는 것이다. 람다식 함수도 이름 없이 구성할 수 있지만 이것은 일반 함수의 이름을 생략하고 사용하는 것이다. 람다식을 사용하지 않고 익명함수를 사용하는 이유는 return, break, continue와 같은 제어문을 사용하기 어렵기 때문이다.

인라인 함수

인라인 함수는 이 함수가 호출되는 곳에 함수 본문의 내용을 모두 복사해 넣어 함수의 분기 없이 처리되기 때문에 코드의 성능을 높일 수 있다. 이는 메모리 사용 비용이 많이 든다.


shortFunc 함수가 두 번 복사되었다.


noinline으로 처리하면 인라인으로 처리되지 않고 분기하여 호출한다.

return을 걸어버리면 13째 줄은 실행하지 않는다.


crossinline으로 비자역 반환을 금지할 수 있다.

확장 함수


String 클래시에 getLongString( ) 함수를 새로운 멤버 메소드로 추가했다. 이 함수는 source와 target의 문자열 길이를 비교한다.
확장 대상에 점 (.) 표기로 String.getLongString( )와 같이 선언해 기존에 없는 새로운 멤버 메소드를 만드는 것이다. if 문에서 this가 가리키는 것은 확장 대상에 있던 자리의 문자열인 source를 가리킨다.

중위 함수

중위 표현법이란 클래스의 멤버를 호출할 때 사용하는 점(.)을 생략하고 함수 이름 뒤에 소괄호를 붙이지 않아 직관적인 이름을 사용할 수 있는 방법이다. 즉, 중위 함수란 일종의 연산자를 구현할 수 있는 함수를 말한다.

연산자처럼 사용된다! 3 multiply(10) 보다 직관적이게 사용된다.

꼬리 재귀 함수

재귀 함수의 조건

  • 무한 호출에 빠지지 않도록 탈출 조건을 만든다.
  • 스택 영역을 이용하므로 호출 횟수를 무리하게 많이 지정해 연산하지 않는다.
  • 코드를 복잡하게 하지 않는다.

    4를 인자로 전달하여 1이 될 때까지 총 4번의 팩토리얼 함수를 호출한다. 즉, 함수 스택 메모리의 4배만큼 스택 메모리를 사용한다. n이 매우 커진다면 스택 메모리가 부족해지는 상황이 발생한다.

꼬리 재귀로 스택 오버플로 방지하기

일반적인 재귀에서는 재귀 함수가 먼저 호출되고 계산되지만 꼬리 재귀는 계산을 먼저하고 재귀 함수가 호출된다. 위 함수는 함수가 호출되기 때문에 꼬리 재귀에 적합하지 않다.

  • 피보나치 수열

.
.
.

함수의 범위

최상위 함수(ex. main함수)와 그 밑에 지역 함수를 만들 수 있다.

a와 b는 최상위 함수이므로 b가 a 아래 선언되어 있어도 사용할 수 있다. c 함수는 d와 e라는 지역 함수를 가진다. 따라서 d와 e는 c 함수 블록 밖에서는 사용 불가하다.

변수의 범위


global의 범위는 패키지 전체가 된다. main블록의 local1과 nestedFunc블록의 local1은 서로 다른 변수다.

총평

람다함수나 중위함수, 꼬리 재귀 등 어려운 것들이 많으나 더 열심히 공부해야겠다..

0개의 댓글