[Kotlin][언어공부-5] function

2020. 6. 16. 15:36Android/Kotlin

대부분의 프로그래밍 언어가 함수를 사용하는데

 

코틀린은 함수형 프로그래밍 언어라는 타이틀을 갖고 있어서 함수에 대한 권한 등이 더 강조된다.

 

코틀린의 함수선언은 자바스크립트의 function과 유사하다고 생각한다.

 

1. 선언방법 (자바의 함수선언과 코틀린의 함수선언)

 

코틀린 :   fun 함수명 (변수명: 데이터형) : 리턴데이터형 { return; }

     fun main(args : Array<String>) {





}

main 으로 함수 정의를 알아보자.

fun 은 function의 약자이다.

이후 괄호 안에는 ( 변수명 : 데이터크기 ) 이 들어가고 리턴값은 괄호 뒤에 : String 등 과 같이 붙여서 표현한다.

 

위에 설명만 보면 기존에 알던 자바랑은 너무 달라서 헷갈릴 수 있는데, 자바와의 차이점을 한번 알아보도록하자

 

자바 같은경우에는 함수를 선언할 때 데이터 형을 앞에 써준다.

public int addOne(int a) {	
	return a+1;
}

자바는 간단하게 표현하면 위에랑 비슷한데 자바스크립트의 function이나 코틀린의 fun 처럼 앞에 함수를 적는다고 명시 안해줘도 위와 같은 형식이면 함수 선언이 가능하다 

 

코틀린과 비교해보면  자바의 int a 가 들어가는 부분을 코틀린에서는 (a : int) 로 사용한다. 코틀린의 변수 선언을 보면 이해가 가능할 것이다. 자바와 변수 선언 하는 방식자체가 다르다. 

 

또한 자바는 int addOne() 과 같이 앞에 리턴형을 선언하는데 코틀린은 뒤에 선언한다.

 

간단하게 생각하자면 자바와 코틀린의 변수선언을 비교해서 생각해보면 적응이 빠를 것 같다

 

자바의 경우 

int a = 1;

코틀린의 경우

var a : Int = 1

 

위처럼 코틀린은 데이터형인 int 를 뒤에 사용하는데 함수를 선언할때도 마찬가지로 데이터 형을 뒤에 선언한다고 보면 된다.

 

테스트를 위해 간단하게 함수를 만들어 보겠다

fun funOne( s: String ) : Any? {
    //함수 만들기 Any? 형 return
    return s
}

 간단하게 코틀린의 형식에 맞춰 함수를 만들었고 String 데이터 타입인 s변수를 인자로 받고 return 은 Any?형인 함수이다

 

 

2. 자바의 void는 코틀린에서는 Unit

자바의 public void funTwo() { System.out.println("a"); } 와 같이 아무것도 리턴 안하는 형식이 기억나는데 

코틀린은 void 대신 Unit을 사용한다

return 데이터형을 지정하지 않을 경우 자동으로 Unit으로 선언된다.

위의 두 문장을 테스트해보기 위해 함수 두개를 만들어 보겠다

 

fun funTwo() : Unit {
    //Unit으로 return type 없음을 지정
    println("dd")
}

fun funTwoNoUnit() {
    //return 1 return -> error
    // 데이터형 선언을 안했는데 1을 리턴할려면 에러발생 이유는?? 선언안하면 Unit으로 지정되서
    println("하하")
}

 

아래 함수를 보면 Unit으로 선언 안해도 Unit으로 지정되는걸 확인 할 수 있다.

 

3. 한줄로 선언 할 수 있는 간단한 함수는 {} 대신 = 로 정의가능하다.

 

이부분이 엄청 신기한데  

 

fun funThree(i : Int) = i*i

한줄로 표현 가능한거는 위처럼 선언 가능하다. 함수형 프로그래밍? 람다식? 의 개념을 적용한 느낌인데 return 을 굳이 명시 안해주어도 표현이 가능하고 = 뒤에 있는 것에 따라 리턴 데이터 형이 결정 되는 느낌이다.

 

fun funThree(i : Int,s: String) = i*i
fun funThreeStr(i : Int,s: String) = "$i"+s    //이렇게 해도 된다. 그럼 문자열로 리턴 되겠지?

 

 

4. 고차함수

 

함수형 언어에서는 중요한 개념인 고차함수란게 있다. 자바스크립트도 그렇고 유용하게 쓰일 수 있는데 

입력값을 함수로 받거나, 함수로 넘겨주는 것을 고차함수라고 생각하면 된다.

fun funFour(fn : () -> Unit) {
    //인자로 함수를 받고 그 함수를 f 에 담아서 실행해준다 
    fn()
}

 

 

5. 함수형 변수

 

함수형 언어의 강점은 이런거 같다 변수에 함수를 담을 수도 있고 함수를 인자로 넘길수도 있고, 리턴할 수도 있고.

 

함수형 변수는 함수를 변수에 담아서 사용 가능하다. 이때 자바 8 이후로 등장한 람다식이 사용되기도 하는데 

객체 지향 프로그래밍과 함수적 프로그래밍을 혼합할 수 있게 제공한다고 한다...

 

람다식은 익명 함수를 생성하기 위한 식으로 함수지향 언어에 가깝다. 

 

음....람다식은 js에도 쓰이고 최근 함수형 프로그래밍언어가 떠오르면서 많이 등장하는건데

쓰이게 된 이유 등 개념이 복잡해서 간단하게만 짚고 넘어갔다. 나는

함수형 프로그래밍은 함수를 가지고 이것저것 만들고 넘기고 받고 선언해야되는데 이런 일련의 과정들을 더 간편하게 식(expression) 으로 처리하기 위해서 람다식이 등장하고, 이를 활용한다고 이해했다.

 

https://effectivesquid.tistory.com/entry/java-8-%EB%9E%8C%EB%8B%A4%EC%8B%9D%EC%9D%B4%EB%9E%80

 

java 8 람다식이란?

 

effectivesquid.tistory.com

https://cornswrold.tistory.com/219

 

[JAVA] 람다식이란?

람다식 람다식이란? 자바8부터는 객체 지향 프로그래밍과 함수적 프로그래밍을 혼합할 수 있게 람다식을 제공한다. 람다식은 익명 함수(anonymous function)를 생성하기 위한 식으로 객체 지향 언어��

cornswrold.tistory.com

 

 

 

//함수를 정의한 변수 람다식
val funVar = { s: String -> println(s)}
//위에꺼랑 똑같은데 형을 먼저 선언 : (입력) -> return
//:: 함수주소값을 넘김
var funVarType : (Int,String) -> Int = ::funThree

위의 코드 처럼 사용할 수 있다.

 

반응형