함수란 무엇일까요.
처음 들어본건 수학시간 때 였습니다. f(x) = 2x + 5 등 형태였지요.
프로그래밍에서 말하는 함수도 수학시간 때 배웠던 함수와 비슷합니다.
프로그래밍에서의 함수는 쉽게 말하자면,
'특별한 작업을 수행할 목적으로 작성된 일련의 코드 블록' 입니다.
함수를 쓰는 이유는 간단합니다. 반복적인 코드를 피할 수 있거든요.
반복적인 코드가 줄어들면, 개발이 용이할 뿐 아니라, 유지보수 역시 쉬워집니다.
함수(Function) vs 메소드(Method)
함수(Function)는 특정 작업을 수행할 목적으로 작성된 일련의 코드 블럭입니다.
그리고 메소드(Method)는 이러한 함수가 클래스 내에서 정의된 형태입니다.
즉, 함수와 메소드는 독립적이냐, 클래스에 종속적이냐로 볼 수 있는데요.
두 용어는 엄밀히 말하면 서로 다른 용어이나,
해당 글에서는 두 용어의 차이성을 크게 두지 않고,
혼용하여 사용하고 있다는 점. 양해 바랍니다.
함수(Function) 사용법
자바의 함수 사용법
int getSum(int a, int b) {
return a + b;
}
코틀린의 함수 사용법
fun getSum(a:Int, b:Int): Int {
return a + b
}
main 함수에서 getSum 함수 호출
fun main() {
val sum = getSum(3, 4)
println(sum)
}
// 출력
>>> 7
자바의 함수 구조는
(반환값) (함수명) ((자료형) 매개변수 1, (자료형) 매개변수 2) {
(바디)
}
로 이루어져 있습니다.
반면, 코틀린의 함수 구조는 아래와 같습니다.
그림판으로 그려봤습니다. 잘그렸죠?
fun으로 먼저 함수임을 명시한 뒤, 함수명, 소괄호안에 매개변수 & 타입, 리턴 타입이 오며,
중괄호 안에 내용이 옵니다.
// 반환값이 없을 경우 Unit을 사용
fun printTest(): Unit {
println("Oh")
}
// Unit은 생략 가능
fun printTest() {
println("Oh")
}
자바의 경우, 반환값이 없을 땐 void를 사용하였는데요.
코틀린은 Unit을 사용해 반환값이 없음을 명시할 수 있습니다.
또한, Unit은 생략 가능합니다.
함수 호출 시 매개변수 이름 이용하기
fun main() {
printInfo(age=34, name="김코딩", height = 200)
}
fun printInfo(name:String, age:Int, height:Int) {
println("이름 = $name, 나이 = $age, 키 = $height")
}
함수의 매개변수를 넘겨줄 때, 꼭 함수의 선언부와 동일한 순서대로 써야하는 것은 아닙니다.
매개변수에 라벨링을 하여 건네줄 수도 있죠.
매개변수의 이름을 명시하지 않으면, 함수의 선언부와 동일한 순서대로 매개변수가 전달됩니다.
매개변수에 기본 값 지정하기
fun main() {
printInfo("김코딩")
}
fun printInfo(name:String, age:Int = 45, height:Int = 230) {
println("이름 = $name, 나이 = $age, 키 = $height")
}
//출력
>>> 이름 = 김코딩, 나이 = 45, 키 = 230
매개변수를 건네주지 않았을 경우의 디폴트 값을 지정할 수도 있습니다.
return 생략하기
// 기존 코드
fun sum(a:Int, b:Int):Int {
return a + b
}
// return값을 생략한 코드
fun sum(a:Int, b:Int):Int = a + b
// 타입 추론으로 반환값 명시도 생략 가능
fun sum(a:Int, b:Int) = a + b
코틀린에서는 return을 생략할 수도 있습니다.
재귀함수
fun main() {
recursion(0)
}
fun recursion(n: Int) {
if(n < 6) {
println(n)
recursion(n + 1)
}
}
// 출력
>>> 0
1
2
3
4
5
재귀 함수는 함수가 자기 자신을 호출하는 형태입니다.
위 코드는 처음엔 n을 0으로 넘겨, 자기 자신에게 n + 1을 매개변수로 넘겨줌으로써
n이 6보다 작은 동안 재귀적으로 호출하는 함수입니다.
재귀함수는 이해하기 어려워 반복문으로 해결 가능한 경우,
많은 사람들이 반복문을 선택하곤 합니다.
하지만, 재귀 대신 반복문을 선택했을 때 코드량이 매우 늘어나거나,
재귀를 쓰면 반복문보다 훨씬 간결하게 짤 수 있는 상황이 오기도 합니다...
알고리즘을 공부하다 보면 무조건 한 번은 만나는, 아니 꽤 자주 만나는 녀석이지요... T.T
부록. 매개변수, 인수, 아규먼트(Argument), 파라미터
다 비슷비슷하게 쓰이는 것 같은데, 이들간에는 무슨 차이가 있는 걸까요?
Parameter (매개변수)
Parameter를 그대로 직역하면 매개변수입니다.
이는, 함수를 정의할 때 외부로부터 받아들이는 값을 의미합니다.
fun sum(n1:Int, n2:Int) :Int {
return n1 + n2
}
위와 같은 함수가 있을 때, n1, n2가 매개변수(Parameter)가 되는 것이지요.
Argument (인수)
Argument는 인수입니다.
이는, 함수가 실행될 때 실제로 사용될 값들을 의미합니다.
fun sum(n1:Int, n2:Int): Int {
return n1 + n2
}
fun main(
sum(1, 2)
}
위와 같은 코드가 있을 때, 함수의 매개변수로써 넘겨준 값 1, 2가 인수(Argument)가 됩니다.
즉, 매개변수 (Parameter)는 함수가 정의될 때의 변수,
인수(Argument)는 함수가 실제로 실행될 때 전달된 값을 의미합니다.
매개변수로써 인자를 넘겨준다. Param으로써 Arg를 넘겨줬다. 라는 말이 성립하는 것이죠.
'코틀린 파헤치기 > 1부. 코틀린 기초' 카테고리의 다른 글
[코파기 1부] 부록. 자바/코틀린의 네이밍 규칙 (0) | 2023.03.15 |
---|---|
[코파기 1부] 10. 코틀린과 반복문 (2) : 흐름제어 - continue, break + 라벨링 (0) | 2023.03.15 |
[코파기 1부] 9. 코틀린과 반복문 (1) : for, while, do-while, repeat, forEach (2) | 2023.03.15 |
[코파기 1부] 8. 코틀린과 리스트 (List) (0) | 2023.03.15 |
[코파기 1부] 7. 코틀린과 배열 (Array) (0) | 2023.03.14 |