[Android/Kotlin] 11 함수
코드를 사용할 수 있는 최소 단위인 함수를 알아보자!
함수는 fun으로 정의하고 반환값이 있는 함수는 내부에서 return으로 값을 반환한다.
함수를 정의할 때 입력값을 기술한 것을 ‘파라미터’라고 하는데, 이 파라미터를 전달하고 결괏값을 돌려받는 다양한 방법에 대해 알아보자.
모든 코드는 함수 안에 작성해야 하며 코드의 실행은 함수를 호출하는 것에서 시작한다.
[프로그램 시작] – 호출 –> [함수]
안드로이드 앱도 onCreate() 함수를 호출해서 실행된다고 할 수 있다. (더 복잡한 내부구조를 가지고 있지만, 처음 공부하는 만큼 단순하게 접근해보도록 하자)
함수의 정의
함수는 fun 키워드로 정의하며 값을 입력받아 사용할 수 있다.
이 때 입력될 값을 기술한 것을 파라미터(Parameter)라고 한다.
기본 구조는 다음과 같다.
fun 함수명(하라미터 이름: 타입): 반환 타입 {
return 값
}
파라미터와 반환값이 없는 함수도 있는데, 없을 경우에는 둘다 작성하지 않는다.
반환값이 없는 대표적인 함수가 여러분이 지금까지 사용해 왔다너 Log에 정의되어 있는 d 함수이다.
함수의 괄호 안에 입력되는 ‘파라미터 이름: 타입’은 ‘변수명: 타입’과 동일하게 사용된다.
함수를 호출할 때 괄호 안에 값을 넣어서 전달하는데 이 때 입력되는 값의 타입은 함수에 정의된 파라미터 타입과 동일하게 입력해야 한다.
반환값과 입력값이 있는 함수의 정의
- 다음은 Int 타입의 x라는 입력 파라미터를 갖는 함수 square()를 정의한 것이다.
fun square(x: Int): Int {
return x * x
}
- square 함수가 호출되면 입력값을 제곱해서 호출한 쪽으로 반환하고 실행이 종료된다.
반환값이 없는 함수의 정의
- 다음은 반환값 없이 입력값을 받아서 Log로 출력하는 함수 printSum()을 정의한 것이다.
fun square(x: Int): Int {
return x * x
}
- printSum 함수가 호출되면 결괎값을 Log로 출력하고 실행이 종료된다.
입력값 없이 반환값만 있는 함수의 정의
- getPi 함수는 호출한 쪽으로 3.14를 반환하고 실행이 종료된다.
fun square(x: Int): Int {
return x * x
}
함수의 사용
- 함수의 사용은 이름 뒤에 괄호를 붙여서 명령어를 실행하는 형태이다.
함수명(값)
함수는 이름만 호출해서는 실행되지 않고 반드시 괄호를 붙여야 실행된다.
괄호를 붙이지 않으면 함수의 코드가 실행되지 않고 마치 값처럼 인식된다.
반환값과 입력값이 있는 함수의 호출
- 파라미터에 전달할 값을 입력하고 반환값은 대입 연산자(=)로 변수에 담은 후에 사용한다.
var squareResult = square(30)
Log.d("fun", "30의 제곱은 ${squareResult}입니다.")
반환값이 없는 함수의 호출
- 반환값이 없으면 대입 연산자(=)를 사용하지 않고 바로 호출해서 실행한다.
printSum(3, 5)
입력값이 없는 함수의 호출
- 입력값이 없다면 괄호만으로 실행하고 결괏값을 받을 수 있다.
val PI = getPi()
Log.d("fun", "지름이 10인 원의 둘레는 ${10 * PI}입니다.")
함수 파라미터의 정의
함수에 입력되는 파라미터는 마치 변수를 정의하듯이 ‘이름: 타입’의 형태로 정의되며, 여러 개의 파라미터가 정의될 경우는 콤마로 구분한다.
Kotlin에서 함수 파라미터를 통해 입력되는 모든 값은 변하지 않는 이뮤터블이다.
따라서 Kotlin에서의 함수 파라미터는 모두 읽기 전용 키워드 val이 생략된 형태라고 생각할 수 있다.
fun 함수명((val 생략) name1: String, name2: Int, name3: Double) { 실행 코드 }
파라미터의 기본값 정의와 호출
- 파라미터는 정의할 때 등호(=)를 사용해서 기본값을 설정할 수 있다.
fun 함수명(name1: String, name2: Int = 157, name3: Double) { 실행 코드 }
- 다음 코드는 파라미터의 기본값을 가지는 함수를 정의한 예시이다. 정의된 newFunction 함수를 호출할 때 기본값이 없는 첫 번째 파라미터에만 값을 입력하면 두 번째와 세 번째 파라미터에는 설정한 기본값이 자동으로 입력된다.
fun newFunction(name: String, age: Int = 29, weight: Double = 65.5){
Log.d("fun", "name의 값은 ${name}입니다.")
Log.d("fun", "age의 값은 ${age}입니다.")
Log.d("fun", "weight의 값은 ${weight}입니다.")
}
newFunction("Hello")
/** [로그캣 출력 내용]
name의 값은 Hello입니다.
age의 값은 29입니다.
weight의 값은 65.5입니다.
*/
파라미터 이름으로 값을 입력하기
함수에 정의된 파라미터가 많을 경우 입력하는 값의 의미가 명확하지 않을 때가 있다.
이렬 경우 순서와 상관없이 정의된 파라미터 이름을 지정해서 직접 값을 입력할 수 있다.
위 코드에서 마지막 행을 다음과 같이 수정하고 다시 실행해보자.
마지막으로 현재까지 공부한 내용을 코드로 다시 살펴보겠다.
package net.flow9.thisiskotlin.basicsyntax
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 4. 반환값이 있는 함수 square 사용하기
var squareResult = square(30)
Log.d("fun", "30의 제곱은은 ${squareResult}입니다")
// 5. 반환값이 없는 함수는 그냥 실행한다
printSum(3, 5)
// 6. 입력값이 없는 함수 사용
val PI = getPi()
Log.d("fun", "지름이 10인 원의 둘레는 ${10 * PI}입니다")
// 7. 기본값이 있는 함수 사용
newFunction("Hello")
// 8. 파라미터 이름을 직접 지정하기
newFunction("Michael", weight = 67.5)
// 문제풀이 호출
Log.d("fun", "5와7을 더한 결과값은 ${plus(5, 7)}입니다")
Log.d("fun", "0부터 100을 모두 더한 결과값은 ${sum(100)}입니다")
printString("문자열")
}
// 1. 반환값이 있는 함수
fun square(x: Int): Int {
return x * x // <- square 함수는 입력받은 값에 2를 곱해서 반환한다.
}
// 2. 반환값이 없는 함수
fun printSum(x: Int, y: Int) {
Log.d("fun", "x + y = ${x + y}")
}
// 3. 입력값 없이 반환값만 있는 함수
fun getPi(): Double {
return 3.14
}
// 7. 기본값을 갖는 함수
fun newFunction(name: String, age: Int = 29, weight: Double = 65.5) {
Log.d("fun", "name의 값은 ${name}입니다")
Log.d("fun", "age의 값은 ${age}입니다")
Log.d("fun", "weight의 값은 ${weight}입니다")
}
// 문제 1
fun plus(x: Int, y: Int): Int {
return x + y
}
// 문제 2
fun sum(x: Int): Int {
var result = 0
for (num in 0..x) {
result += num
}
return result
}
// 문제 3
fun printString(word: String) {
System.out.println(word)
}
}
/** [로그캣 출력 내용]
30의 제곱은은 900입니다
x + y = 8
지름이 10인 원의 둘레는 31.400000000000002입니다
name의 값은 Hello입니다
age의 값은 29입니다
weight의 값은 65.5입니다
name의 값은 Michael입니다
age의 값은 29입니다
weight의 값은 67.5입니다
5와7을 더한 결과값은 12입니다
0부터 100을 모두 더한 결과값은 5050입니다
*/