Do it! 코틀린 프로그래밍

YW K·2023년 4월 20일

Kotlin

목록 보기
2/2

Chapter 03. 함수와 함수형 프로그래밍

03-1 함수 선언하고 호출하기

1) 함수란?

  • 여러 값(인자)을 입력받아 기능을 수행하고 결과값을 반환하고 재사용 가능한 코드의 모음
fun sum(a: Int, b: Int): Int {
	var sum = a + b
    return sum
}

📌 함수의 선언

  • 함수의 매개변수는 항상 읽기 전용이다. 따라서 함수 몸체 내부에서 값을 변경할 수 없기에 var 혹은 val를 붙일 수 없다.

2) 함수를 간략하게 표현하기

(1) 일반적인 함수의 형태

fun sum(a: Int, b: Int): Int {
	var sum = a + b
    return sum 
}

(2) 결과 계산을 리턴문에 표현

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 // 식이 본문인 함수

3) 함수 호출과 프로그램의 실행 순서

  • sum() 함수를 선언하고 main() 함수에서 호출하기
package chap03.section1

fun sum(a: Int, b: Int): Int { // sum() 함수 선언
	var sum = a + b
    return sum
} 

fun main() {
	val result1 = sum(3, 2)
    val result2 = sum(6, 7) 
    println(result1)
    println(result2)
}
  • 인자 : 함수를 호출할 때 함수이름 뒤 ( ) 안에 사용된 것
  • 매개변수 : 함수를 선언할 때 함수이름 뒤 ( ) 안에 사용된 것

🔔 함수 호출 시 인자의 값이 매개변수로 전달된다.

4) 함수의 호출 원리 살펴보기

fun main() { // 최초의 스택 프레임
	val num1 = 10 
    val num2 = 3 // 임시 변수 또는 지역 변수
    val result: Int 
    
    result = max(num1, num2) // 두 번째 스택 프레임
    println(result)
}

fun max(a: Int, b: Int) = if (a > b) a else b 

✨ 함수와 스택 프레임 이해하기

함수의 각 정보는 프레임(Frame)이라는 정보로 스택 메모리의 높은 주소부터 거꾸로 자라듯이 채워져간다.

지역 변수는 함수가 종료되면 스택 프레임과 함께 사라지는 임시 변수이다.

5) 반환값이 없는 함수

📌 Unit 형

  • 반환값이 없을 때 사용하는 반환 타입
fun printSum(a: Int, b: Int): Unit {
	println("sum of $a and $b is ${a + b}")
}
  • 함수의 반환값(return문)은 생략할 수 있다. 하지만 반환값이 없는 게 아니라 반환값 자료형이 Unit이라는 것이다.
fun printSum(a: Int, b: Int) { // 반환값의 자료형 Unit 추론
	println("sum of $a and $b ${a + b}")
}
fun printSum(a: Int, b: Int) = println("sum of $a and $b is ${a + b}")

6) 매개변수의 기본값 - 기본 인자 (디폴트 파라미터 값)

  • 일반적인 함수 사용
fun add(name: String, email: String = "default") {
	...
} 

add("박현규", "default")
add("박용규", "default")
...
  • 디폴트 파라미터는 함수 매개변수의 기본값 기능을 제공한다. 따라서 default 값을 함수의 인자로 넘겨줄 필요가 없다.
fun add(name: String, email: String = "default") {
	...
}

add("Youngdeok") // email로 넘어오는 값이 없으면 자동으로 "default" 입력

🎀 함수의 매개변수에 기본값 지정하기

fun main() {
	val name = "홍길동"
    val email = "hong@example.kr"
    add(name)
    add(name, email)
    add("둘리", "dooly@example.kr")
    defaultArgs()
    defaultArgs(200) 
}

fun add(name: String, email: String = "default") {
	val output = "${name}님의 이메일은 ${email}입니다."
    println(output)
}

fun defaultArgs(x: Int = 100, y: Int = 200) { // 반환값 자료형 Unit이 생략됨
	println(x + y)
}

🔑 실행 결과

홍길동님의 이메일은 default입니다. 
홍길동님의 이메일은 hong@example.kr입니다.
둘리님의 이메일은 dooly@example.kr입니다. 
300
400

7) 매개변수 이름과 함께 함수 호출하기 - 지명 인자

  • 매개변수 이름에 직접 인자를 전달하는 방법
  • 매개변수 이름 = 인자
fun main(args: Array<String>) {
	namedParam(x = 200, y = 100) 
    namedParam(x = 150)
}

fun namedParam(x: Int = 100, y: Int = 200, x: Int) {
	println(x + y + z)
}

8) 매개변수의 개수가 고정되지 않은 함수

  • 가변적인 매개변수 받기 (vararg)
  • 가변 매개변수를 사용하지 않으면 여러 개의 함수를 만들어줘야 한다.
// 정수 매개변수 3개를 전달받아 처리하는 함수 
fun print3Numbers(num1: Int, num2: Int, num3: Int) {
	...
}

// 정수 매개변수 4개를 전달받아 처리하는 함수
fun print4Numbers(num1: Int, num2: Int, num3: Int, num4: Int) {
	...
}

🔥 vararg 키워드

  • 매개변수 앞에 붙이면 가변 매개변수가 된다.
  • 가변 매개변수는 배열형이다.
fun main(args: Array<Sting>) {
	normalVarargs(1, 2, 3, 4) // 4개의 인자 구성
    normalVarages(5, 6, 7)
}

fun normalVarargs(vararg counts: Int) { // counts는 배열형 가변 매개변수
	for (num in counts) {
    	print("$num ") 
        print("${counts[i]}") // 위 println() 문장과 같은 결과를 출력
    }
	print("\n")
}

03-2 함수형 프로그래밍

1) 함수형 프로그래밍

0개의 댓글