깡쌤의 코틀린 프로그래밍 04장
변수 선언 및 초기화
- 변수 선언법 : val(or var) 변수명 : 타입 = 값
코틀린은 mutable 과 immutable을 구분하기 때문에 변수 역시 var(variable)과 val(value)이 있습니다.
코틀린에서는 "타입 추론" 이라 하여, ":타입"을 명시하지 않아도 알아서 값을 유추해 값에 맞는 타입을 적용합니다.
- 변수 초기화 :
코틀린에서 변수 선언은 최상위(class 외부), class 내부, 함수 내부에 할 수 있습니다.
변수는 자동으로 초기화 되지 않으므로 직접 초기화한 다음에 사용 가능!
- null이 될 수 있는 변수와 null
변수의 값이 로직이 수행되어야지만 산출되는 경우엔 미리 null값으로 초기화 후 대입해서 사용할 수 있습니다.
하지만, null로 초기화 하기 위해선 nullable 변수로 선언해야 함. -> null 안정성(safety)라고 하는 코틀린의 특성!
ex) var nullableData: String? = null => nullableData = "Hello world!"
위의 예제처럼 mutable 한 변수인 "var"와 "?"를 이용해 null을 선언해주고 추후 필요한 곳에서 값을 지정해주고 사용할 수 있습니다.
- 상수변수 선언(const)
초깃값을 변경하지 않고 그대로 사용하는 변수를 "상수변수"라고 부릅니다.
최상위 레벨에서, immutable 변수 선언 방식인 "val"로 선언. 이렇게 선언된 상수변수는 같은 패키지 내에서 전역변수처럼 이용.
cf) val != const . 이유는 val 는 property로 get() 함수를 가지는 변수이기 때문에 "변경"이 가능
함수 선언법
- 함수 선언(fun) : fun 함수명(매개변수명 : 타입) : 반환타입 { }
함수의 매개변수는 var, val을 선언하지 못하며, 무조건 val로 적용!
매개변수의 값을 더해서 반환하는 한 줄로 작성된 함수(fun sum(a: Int, b: Int): Int { return a+b } =>
fun sum(a:Int, b:Int) = a+b 로 변경 가능)를 가리켜 "단일 표현 함수(Single expression function)이라고 부릅니다.
- 함수 오버로딩 : 같은 이름의 함수를 매개변수 부분을 다르게 하여 여러 개 정의하는 기법.
- 기본 인수와 명명된 인수
호출하는 곳(호출자)에서는 호출받는 함수(피호출자)의 매개변수 타입과 개수에 맞추어 호출해야 합니다. 이때 피호출자의 매개변수 정보에 맞게 호출자가 전달하는 값을 "인수(argument)"라고 합니다. 즉, 피호출자는 호출자가 전달하는 "인수"를 "매개변수(parameter)"로 받습니다.
호출자가 인수를 명시하지 않아도 피호출자가 알아서 기본 값을 적용하게 할 수 있는데, 이를 "기본 인수(default argument)"라고 합니다. ex) fun sayHello(name: String = "chu(기본인수)") { println("Hello! $name") }
- 중위 표현식(infix) : 흔히 연산자를 이용할 때 많이 사용. 연산자를 피연산자의 중간에 놓는다는 개념!
ex) "A+B"라는 구문에서 A와 B라는 피연산자 사이에 +라는 연산자를 놓을 때 "중위 표현식을 사용했다."라고 표현
ex) obj sum 10
**infix가 가능한 경우**
1. 클래스의 멤버 함수로 선언하거나 클래스의 확장(extension) 함수일 때
2. 매개변수가 하나인 함수일 때
- 가변 인수(vararg) : 오버로딩이 길어질수록 코드가 길어지고 매개변수가 많아집니다. 이를 방지하기 위한 것입니다.
ex) fun <T> varargsFun(a1: Int, vararg array : T) { for(a in array) println(a) }
varargsFun(10, "hello", "world") => hello / world
varargsFun(10, 20, true) => 20 / true
- 재귀 함수(tailrec) : 함수 내에서 자신의 함수를 다시 호출하는 것!!! => 자기가 자기를 호출하는 함수라는 개념입니다.
함수 선언 앞에 붙는 예약어, 재귀함수를 만들 때 사용.
집합 데이터를 핸들링하거나 같은 로직을 반복해야 할 때 가끔 사용.
cf) tailrec = tail recursion = 꼬리 재귀함수
일반 재귀함수와 tailrec을 붙인 함수의 차이는 코틀린에서는 없지만, 자바로 소스를 변경할 시에 "StackOverflowError"의 위험 부담에서 벗어날 수 있게 해줍니다. 그 이유는 tailrec을 붙인 재귀함수는 자바로 변경 시 "반복문"으로 변경(일반 재귀함수는 자바로 변경시에도 재귀함수로 변경)되어 "재귀 조건"을 잘 못 입력할 시에 나타나는 "StackOverflowError"에서 벗어나게 해준다는 것입니다.