고차함수(High-order function)
fun function1(number1 : Int, number2 : Int) -> Int ={}
fun highFunction(function: (Int, Int)->Int){
함수내용
}
- 고차함수를 호출하는 방법
- function1(100,100) -> 일반적인 함수
- highFunction(function1) -> X
- highFunction(::function1)
람다(Lambda)
fun addTwoNumbers(number1:Int, number2:Int): Int {
return number1 + number2
}
// 고차함수
fun addTenNine(function : (Int, Int)-> Int){
val result:Int = function(10,9)
println("결과는 $result")
}
// 람다
// 풀버전 (생략이 없는)
val addTenNine2: (Int, Int) -> Int = {number1:Int, number2:Int ->
val result = number1 + number2
result
}
addTenNine(addTenNine2) // 람다함수를 인자로 사용하는 경우에는 ::를 사용할 필요가 없음
// 생략버전1
val addTenNine3 : (Int, Int) -> Int = {number1, number2 ->
number1 + number2
}
// 생략버전2
val addTenNine4 = {number1:Int, number2:Int ->
number1 + number2
}
// 파라미터가 없는 람다 함수
val addTenNine5 : () -> Int = {
10 + 9
}
// 파라미터가 한개인 경우에는 it 사용
val addTenNine6 : (Int) -> Int = {
10 + it
}
// 주생성자 -> 생략 없는 버전
class User1 constructor(name:String){
val userName:String // class 속성(프로퍼티)
// 속성은 init 블럭에서 초기화 됨
init { //class가 생성될 때 호출
println(name)
userName = name
}
}
// 클래스를 호출하는 법
// 클래스 호출(인스턴스화) (Instance)
// 객체 -> Object, Instance
val user = User1("심채운")
// 주생성자 -> init 생략하는 방법
class User2 constructor(name:String) {
val userName : String = name
}
// 주생성자 -> constructor 생략
class User3(name:String){
val userName : String = name
}
// 주생성자 -> 생략이 가능한 모든걸 생략
class User7(val name:String){
}
// 주생성자 -> 기본값 부여
class User4(name:String = "심심"){
val userName : String = name
}
val user4 = User4()
// 생성자에서 받는 속성이 복수개인 경우
class User5 constructor(age:Int, name:String){
val age:Int
val name:String
init {
// 매개변수의 age와 프로퍼티의 age가 동일하므로 this 키워드 사용
this.age=age
this.name=name
}
}
class User8 constructor(age:Int, name:String){
var age:Int = 0
val name:String
// 부생성자
constructor(name:String, age:Int) :this(name) {
this.age = age
}
}
class Book(){
var title: String = "모름"
get() {
return "책 제목"
}
set(value) {
println("값 :: $value")
field = value // field가 곧 title이지만 setter에선 field라고 사용해야함
}
// var subTitle:String="모름"
// get(){}
// set(){}
}
val book = Book()
println(book.title)
book.title = "제목 변경"
// lateinit
class Book(){
lateinit var title:String
fun nextPage(){
if(::title.isInitialized == true){
println("페이지 넘어감")
} else{
println("초기화 필요")
}
}
}
val book = Book()
book.title = "책이름"
println(book.nextPage())
class Book2{
val title : String by lazy{ // 람다
// 본문 -> 다른 작업도 할 수 있지만 반드시 프로퍼티를 초기화 시켜주는 작업을 해야한다.
println("lazy 초기화")
// 만약에 엄청 복잡하고 긴 로직이 있다? 인스턴스를 생성할 때마다 로직을 돌리니깐 비효율적.
// 정말 필요할 때만 사용하기 위해 lazy 사용
"책 제목"
}
}
open class Warrior1(var name:String, var power:Int, var type:String) { // 부모클래스, 슈퍼클래스
fun attack() {
println("공격")
}
}
class DefenseWarrior1(name:String, power:Int):Warrior1(name, power, "고블린"){
fun defense(){
println("방어")
}
}
val defenseWarrior: DefenseWarrior1 = DefenseWarrior1("똑똑한 고블린", 100)
defenseWarrior.defense()
defenseWarrior.attack()