2020. 6. 16. 15:36ㆍAndroid/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
위의 코드 처럼 사용할 수 있다.
'Android > Kotlin' 카테고리의 다른 글
[Kotlin][언어공부-7] label (0) | 2020.06.22 |
---|---|
[Kotlin][언어공부-6] 제어문 (1) | 2020.06.18 |
[Kotlin][언어공부-4] Any형 (0) | 2020.06.10 |
[Kotlin][언어공부-3] 문자열 (0) | 2020.06.10 |
[Kotlin][언어공부-2]Kotlin숫자형, 음수표현법? 자료형 비트?,음수표현법에 2의보수가 등장하는 이유? (0) | 2020.06.09 |