Uknow's Lab.
article thumbnail

 

함수란 무엇일까요.

처음 들어본건 수학시간 때 였습니다. 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를 넘겨줬다. 라는 말이 성립하는 것이죠.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.