함수(function), 서브루틴(subroutine), 루틴(routine), 메서드
(method), 프로시저(procedure)는 소프트웨어에서 특정 동작을 수행
하는 일정 코드 부분을 의미
일반적인 프로그래밍 언어에서 함수의 기본동작방식
함수를 호출
//annualSalary: Long, tax: Float ← 파라미터
fun paycheck(annualSalary: Long, tax: Float) = (annualSalary.div(12) -(annualSalary.div(12)).times(tax)).toLong()
fun main(){
var salary = paycheck()
salary = paycheck(90_000_000, 0.07f,3_000_000) //90_000_000, 0.033f ← 인자
}호출된 함수의 계산을 실행 후 원래 루틴으로 돌아 감
fun 함수명(매개변수명 : 타입) : 반환타입{ … }val로 인정fun paycheck( salary:Int , tax: Float) : Int{
return (salary * tax).roundToInt()
}
fun paycheck( salary:Int , tax: Float) : Unit{
val result = (salary * tax).roundToInt()
}
fun paycheck(salary:Int , tax: Float) : Int = (salary * tax).roundToInt()
single expression function 적용 x
fun paycheck(annualSalary:Long, tax:Float): Long { //- - - > 반드시 return type이 존재해야 함
var salary = annualSalary.div(12)
salary -= (salary.times(tax)).toLong()
return salary
}
fun main(){
val monthlySalary = paycheck(90_000_000, 0.07f)
println("이번달 월급은 $monthlySalary 입니다")
}
single expression function 적용 o
fun paycheck(annualSalary: Long, tax: Float) = (annualSalary.div(12) - (annualSalary.div(12)).times(tax)).toLong()
fun main(){
val monthlySalary = paycheck(90_000_000, 0.07f)
println("이번달 월급은 $monthlySalary 입니다")
}
(Nested function)
함수 안에 함수가 있는거
그냥 쓰지마. 복잡해.
(Member Function)
class 안에 구현된 함수 (엄청 쓰지)
oop에서 멤버함수는 behavior을 의미
멤버(instance)함수는 상태(필드,속성)와 캡슐화 되어 동작
class Employee{
fun paycheck(annualSalary:Long):Long{
var salary = annualSalary.div(12)
salary -= (salary.times(0.033f)).toLong()
return salary
}
}
fun main(args: Array<String>) {
val empObj = Employee()
val salary = empObj.paycheck(90000000)
println("$salary")
}
prefix 전위 +ab
infix 중위 a+b
postfix 후위 ab+
infix fun Int.abc(gogo: Int): Int = this * gogo
//class안에서 쓸때는 밑에처럼 표현
//infix fun abc(gogo: Int): Int = this * gogo
fun main(){
var c = 5 abc 4 //infix함수 호출
println(c) //20
println(6 abc 4) //24
println(6.abc(4))//24 위에랑 같음
}
fun <T> selectedList(item: T): List<T>{ /*, , , ,*/
(Extension Function)
(Recursive Function)
사용하는 이유
사용하는 곳
특징
Loop(for, while, iteration 등)는 어떻게 동작해야 하는지를 명령하는 구문 (명령형 프로그래밍)
사용법
fun factorial(n: Int): Int {
return if (n <= 1) {
1
} else {
n * factorial(n - 1)
}
}(Tailrec, Tail Recursive Function)
사용하는 이유
사용하는 곳
특징
tailrec fun factorial(n: Int, accumulator: Int = 1): Int {
return if (n <= 1) {
accumulator //이자리에 꼬리재귀함수 와도 상관없음
} else {
factorial(n - 1, n * accumulator)
}
}
결론
꼬리 재귀를 사용할 수 있다면 tailrec 키워드를 사용하여 컴파일러가 이를 최적화하도록 하는 것이 좋다. 이는 스택 오버플로우를 방지하고 함수의 성능을 최적화하는 데 도움이 됨
사용하는 이유
사용하는 곳
특징
사용법
init 함수
클래스에서 오는 함수
생성자와 함께 자세히 배우자