4. 변수와 함수
4.1 변수 선언 및 초기화
4.1.1 변수 선언법
- var(val) 변수명 : type = 값
- var(variable) : Mutable 변수로써, 값을 언제든지 변경할 수 있다.
- val(Assign-once) : Read-only변수로써 변수를 한 번 초기화하면 더는 변경할 수 없다.
- 코틀린에서는 타입을 명시하지 않아도 Type Inference(타입 추론)을 적용하여 적절한 타입을 매칭한다.
4.1.2 변수 초기화
- 변수 선언은 최상위(클래스 외부), 클래스 내부(멤버 변수), 함수 내부에 할 수 있다.
- 코틀린의 변수는 자동으로 초기화 되지 않으므로 코드에서 직접 초깃값을 대입해 주어야 한다.
- 최상위 레벨이나 클래스의 멤버 변수는 "반드시" 선언과 동시에 초기화해주어야 한다.
- 지역 변수는 선언과 동시에 초기화하지 않더라도 이후에 따로 초기화해야지만 사용할 수 있다.
4.1.3 null이 될 수 있는 변수와 null
- 코틀린에서는 null을 대입할 수 없는 변수와 있는 변수로 구분하여 사용한다. 이 부분을 null 안전성이라고 한다.
- null 안전성(safety)란 null에 안전한 프로그램을 작성하기 위한 기법이다.
- 어떤 변수에 null 값을 대입하려면 타입에 물음표(?) 기호를 이용하여 명시적으로 선언한다.
ex) val nullableData : String? = null
4.1.4 상수변수 선언(const)
- 처음에 대입한 초기값을 변경하지 않고 그대로 사용하는 변수
- val 변수와 비슷하지만 차이가 있다. --> 코틀린에서 변수는 property이다.
- val의 초기값을 직접적으로 변경할 수는 없지만, 해당 변수의 함수에서 어떻게 처리하느냐에 따라 다른 값이 나올 수 있다.
- 상수 변수는 초기값을 변경할 수 없고, 항상 초기값만 반환하도록 보장한다.
- const 변수는 var로 선언될 수 없고 클래스, 함수 내부에서도 선언할 수 없다. --> 최상위 레벨에서 선언한다.
4.2 함수
4.2.1 함수 선언(fun)
- fun 함수명(매개변수 : 타입) : 반환타입{ } 으로 선언
- 매개변수 부분에는 var, val을 선언할 수 없고, 무조건 val로 적용된다.
- 반환값이 없을 때는 Unit으로 명시하거나 생략한다.
- 함수 내에 함수 선언이 가능하다
- 단일 표현 함수는 '='을 이용해 쉽게 정의 가능
fun sum(a:Int,b:Int):Int{
return a+b
}
fun sum(a:Int,b:Int):Int = a+b
fun sum(a:Int,b:Int) = a+b
4.2.2 함수 오버로딩
- 같은 이름의 함수를 매개변수 부분을 다르게 하여 여러 개 정의하는 기법이다.
- 변수나 클래스는 같은 이름으로 여러 개 정의하면 선언 중복 에러가 발생한다.
4.2.3 기본 인수와 명명된 인수
- caller가 callee에게 전달하는 값 = 인자(인수)
- caller가 전달할 값을 대입할 매개변수명을 명시하는 방법이 명명된 인수이다.
ex) sayHello(name = "Kim", num = 10)
4.2.4 중위 표현식(infix)
- 객체명 함수명 매개변수 --> 함수의 중위 표현식
- 함수를 중위 표현식으로 표현하려면 infix라는 예약어로 선언애야 한다.
- 클래스의 멤버 함수로 선언하거나 클래스의 확장 함수일 때
- 매개변수가 하나인 함수일 때
4.2.5 가변인수(vararg)
- 함수 오버로딩에 의해 너무 많은 함수가 선언되어 불편한 경우가 발생
- 가변 인자(variable argument)를 포함하는 함수로 선언하면 쉽게 작성할 수 있다.
- 가변 인수를 포함하는 함수는 vararg라는 예약어를 이용하여 선언한다.
4.2.6 재귀함수(tailrec)
- 함수 내에서 자신의 함수를 다시 호출하는 것.
- 꼬리 재귀함수 : 소스코드가 자바로 변경될 때 재귀함수가 아닌 일반적인 반복문으로 변형된다.
- 이는 재귀 호출로 발생할 수 있는 StackOverFlowError의 부담감에서 벗어날 수 있다.
- tailrec 재귀 함수에서 자신을 다시 호출하는 구문은 맨 마지막 작업으로 작성해야한다(꼬리 재귀함수)