코틀린 기초 : 패키지, 접근제한자, 고차함수, 람다함수, 스코프함수
패키지
package com.sunny.example
//패캐지 명시하지 않을시 default 패키지로 묶임
패키지 사용 import
import com.sunny.example
스코프
변수, 함수, 클래스가 위치하는 범위
패키지, 클래스, 함수 내부로 구분된다.
패키지 내 변수, 함수를 선언할수 있다.
하위 스코프에서는 같은 이름의 변수를 생성할수 있다.
접근제한자 in Package
public : 기본값. 어떤 패키지에서도 접근 가능
internal : 같은 모듈 내에서만 접근 가능
private : 같은 파일 내에서만 접근 가능
접근제한자 in Class
public : 기본값. 클래스 외부에서 늘 접근 가능
private : 클래스 내부에서만 접근 가능
protected : 클래스 자신과 상속받은 클래스에서 접근 가능
고차함수
함수를 클래스에서 만들어낸 인스턴스 처럼 취급하는 방법
함수를 패러미터로 넘길수 있다.
결과값으로 반환 받을수 있다.
fun main(){
b(::a) //고차함수 형태를 패러미터로 넘길시 :: 을 앞에 붙여주어야함.
}
fun a (str: String) { }
fun b (function : (String)->Unit) { //Unit은 반환형이 없다는 의미
function("문자열")
}
람다함수
val c: (String)->Unit = {str -> println("$str 람다함수")}
b(c) //람다함수는 ::을 붙이지 않아도 됨.
//람다함수를 여러 구문으로 사용시
val calculate : (Int, Int) -> Int /*반환타입*/= { a,b ->
println(a)
println(b)
a+b // 마지막 구문이 Int형으로 반환됨.
}
//패러미터가 없는 람다함수
val a:() -> Unit = {println("패러미터가 없어요")}
//패러미터가 하나인 경우 it을 사용함
val c:(String) -> Unit = {println("$it 람다함수")}
스코프 함수
함수형언어를 쉽게 사용할수 있도록 기본제공하는 함수
클래스에서 생성한 인스턴스를 스코프함수에 전달하면 인스턴스의 속성이나 함수를 좀 더 깔끔하게 호출 할 수 있다.
스코프함수 apply
인스턴스 생성 후 초기화 시 주로 사용.
<Before>
fun main(){
var a = Book("코틀린 기초", 10000);
a.name = "[초특가]" + a.name
a.discount()
}
class book(var name: String, var price: Int){
fun discount(){
price -= 2000;
}
}
<After>
fun main(){
var a = Book("코틀린 기초", 10000).apply{
name = "[초특가]" + name
discount()
}
}
class book(var name: String, var price: Int){
fun discount(){
price -= 2000;
}
}
스코프함수 run
람다함수 처럼 마지막 구문이 반환됨.
이미 인스턴스가 생성된 후 인스턴스내에서 참조없이 변수,함수 사용시 편리함
a.run{
println("상품명: ${name}, 가격: ${price}원")
}
스코프함수 with
run과 동일한 기능을 가짐.
run에서는 참조 연산자를 사용하지만, with는 패러미터로 인스턴스를 받음.
with(a) {
println("상품명: ${name}, 가격: ${price}원")
}
스코프함수 also/let
처리가 끝나면 인스턴스를 반환 : apply / also
처리가 끝나면 최종값을 반환 : run / let
스코프 내 같은 이름의 변수나 함수가 있을때 사용한다. apply 대신 also, run 대신 let
마치 패러미터로 인스턴스를 넘긴것 처럼 it을 통해 인스턴스의 변수와 함수를 호출할 수 있다.
fun main(){
var price = 5000
var a = Book("코틀린 기초", 10000).apply{
name = "[초특가]" + name
discount()
}
a.run{
println("상품명: ${name}, 가격: ${price}원") // 결과 5000
}
a.let{
println("상품명: ${it.name}, 가격: ${it.price}원") // 결과 8000
}
}