좌충우돌 코딩

코틀린 - 함수(funcation) 본문

코틀린/순수 코틀린

코틀린 - 함수(funcation)

Tracoding 2023. 3. 23. 23:40

함수는 funcation의 뜻 중 기능이라는 단어가 있는데, 그걸로 생각하면 쉽습니다.

함수는 3가지로 분류할 수 있습니다

 

1. 입력값과 반환값이 있는 함수

2. 입력값만 있는 함수

3. 반환값만 있는 함수

 

한 개씩 알아봅시다.

 

입력값과 반환값이 있는 함수

fun sum(num1: Int, num2: Int): Int {	// (파라미터명: 타입) : 반환값 타입
	return num1 + num2		// 반환값
}

Log.d("sum호출", "${sum(4, 5)}")	// 함수 호출

함수명은 sum이고 첫번째 파라미터(입력값)이름 num1, num1의 타입은 int.

두번째 파라미터이름은 num2, num2의 타입은 int입니다.

반환값의 타입은 int이다 그리고 return 부분이 함수에서 실행된 결과를 반환해주는 역할을 합니다.

 

그러면 위의 결과는 몇일까요?

다들 아시겠지만, 9가 나옵니다.

 

코틀린 함수에서 중요한 것은 4가지가 있습니다.

첫번째는 파라미터 타입를 꼭 입력해야 합니다.

두번째는 반환값이 있으면 반환값 타입도 입력해야 합니다.

세번째는 모든 타입의 첫문자는 대문자로 표기해야 합니다.

이 정도면 다 말한 것이 아닌가 싶지만... 네번째가 있습니다.

네번째는 함수 호출은 함수 선언 아래 라인에서 호출해야 합니다.

 

한 곳에 함수와 함수호출이 있다면 함수보다 아래 라인에서 함수 호출을 해야 합니다.

위 코드도 함수가 먼저 선언되었고 그 아래에서 함수호출을 했습니다.

 

Log.d("sum호출", "${sum(4, 5)}")	// 함수 호출 에러발생

fun sum(num1: Int, num2: Int): Int {	// (파라미터명: 타입) : 반환값 타입
	return num1 + num2		// 반환값
}

위와 같이 코드를 작성하면 어떻게 될까요??

참조 에러가 납니다.

 

자바스크립트는 함수 선언이 함수 호출보다 아래 있어도 실행이 됩니다.

하지만 코틀린은 함수 선언이 함수 호출보다 위에 있어야 합니다.

 

입력값만 있는 함수

fun age(year: Int): Unit {
	Log.d("age호출", "당신의 나이는 ${2023 - year}살")
}

age(2000)

다들 아시겠지만, 결과는 "당신의 나이는 23살"이 나옵니다.

함수 호출에서 2000의 값을 넣었기 때문에 age 함수에서 2023 - 2000을 했으니, 결과는 23살입니다.

 

첫번째 함수와 다른 점은 return 키워드가 없다는 점이죠.

또한 Unit는 생략이 가능합니다.

fun age(year: Int) {   // Unit가 없어도 문법 오류가 안 난다.
	Log.d("age호출", "당신의 나이는 ${2023 - year}살")
}

age(2000)

 

반환값만 있는 함수

fun gold(): Double {
	return 3.75
}

println("순금 한돈의 무게는 ${gold()}입니다")

입력값 없이 반환값만 있습니다.

결과는 "순금 한돈의 무게는 3.75입니다"가 출력됩니다.

 

우리는 이제 코틀린 함수만 보면 어떤 함수인지 구별이 가능해졌습니다.

 

좀더 함수를 다이나믹하게 사용해볼까요??

 

fun people(name: String, age: Int, gender: String): String {
    val genderCheck = if(gender == "male") "남성" else "여성"
    return "${name}의 나이는 ${age}살이며, 성별은 ${genderCheck}이다."
}

Log.d("people함수", "${people("코틀린", 24, "female")}")	 // 코틀린의 나이는 24살이며, 성별은 여성이다.

위 코드는 입력값과 반환값이 있는 함수와 다를 게 없습니다.

다이나믹하게 사용하는 방법은 디폴트를 정할 수 있습니다.

디폴트는 기본값이라고 생각하면 됩니다.

 

fun people(name: String, age: Int = 20, gender: String = male): String {
    val genderCheck = if(gender == "male") "남성" else "여성"
    return "${name}의 나이는 ${age}살이며, 성별은 ${genderCheck}이다."
}

Log.d("people함수", "${people("코틀린")}")	 // 코틀린의 나이는 20살이며, 성별은 남자이다.

이상하지 않은가요???

people함수에 "코틀린"만 넣었는데, 결과는 "코틀린의 나이는 20살이며, 성별은 남자이다."가 출력 되었습니다.

저렇게 출력된 이유는 파라미터 값의 디폴트값이 적용이 되어있습니다.

people함수는 세 개의 파라미터 값을 받는데, 이름을 제외하고 나이와 성별인 기본값이 적용되어 있습니다.

그래서 이름만 값을 전달받으면 나머지는 기본값이 출력이 됩니다.

 

그러면 기본값이 적용 되어있으면 함수 호출시에 people("코틀린", 30, "female")처럼 세 개를 전부 전달하면 안 되나??

그렇지 않습니다. 만일 파라미터 3개 전부를 전달하면 전달한 값으로 반환이 됩니다.

기본값은 말그대로 기본값이고, 전달을 못 받았을 때 기본값으로 반환이 될 뿐이죠.

 

fun people(name: String, age: Int = 20, gender: String = male): String {
    val genderCheck = if(gender == "male") "남성" else "여성"
    return "${name}의 나이는 ${age}살이며, 성별은 ${genderCheck}이다."
}

Log.d("people함수", "${people(gender = "female", name = "코틀린")}") 
// 결과 : 코틀린의 나이는 20살이며, 성별은 여자이다.

파라미터 이름으로 직접 전달도 가능합니다.

파라미터 이름로 순서와 상관없이 전달이 가능합니다.

 

 

그럼 이만~~!!

'코틀린 > 순수 코틀린' 카테고리의 다른 글

코틀린 - 접근제한자  (0) 2023.03.25
코틀린 - 클래스(class)  (0) 2023.03.24
코틀린 - 반복문(for, while)  (0) 2023.03.22
코틀린 - 컬렉션(Collection)  (0) 2023.03.21
코틀린 - 배열(Array)  (0) 2023.03.21
Comments