이름이 없어도 함수 역할을 하는 익명 함수의 하나의 형태이다.
화살표 표기법을 사용하고 고차 함수에서 인자로 넘기거나 결과값으로 반환 등을 할 수 있다.
< 사용 예시 >
{ 변수1 : 타입, 변수2 : 타입 -> 변수1 + 변수 2 }
(타입, 타입) -> 반환형 타입
//이름이 없는 함수 형태
{ x , y -> x + y }
//기본 람다식 구성
val sum : (Int, Int) -> Int = { x : Int, y : Int -> x + y }
//선언 자료형 생략
val sum = { x : Int, y : Int -> x + y }
//매개변수 자료형 생략
val sum : (Int, Int) -> Int = { x , y -> x + y }
//에러.. 자료형 추론 불가
val sum = { x , y -> x + y }
println(sum(3,5)) //8
선언 자료형과 매개변수 자료형 한 쪽이 선언이 되었다면 다른 한 쪽은 생략이 가능하다.
x, y 가 람다식의 매개변수이고, x+y가 람다식의 처리 내용이다. 처리 내용이 여러 줄인 경우 마지막 표현식이 반환된다.
고차함수는 함수를 인수로 취하거나 혹은 결과로 반환하는 함수를 고차함수라고 한다.
fun sum( a : Int, b : Int, p : (Int, Int) -> Int){
println("$a, $b -> ${p(a, b)}")
}
//기본 호출
sum(2 , 4, {a : Int, b : Int -> a+b}) //2,4 -> 6
//람다 함수가 맨 마지막에 있다면 뺄 수 있다.
sum(5, 1) {a : Int, b : Int -> a+b} //5,1 -> 6
//고차 함수에 타입이 정의되어있는 경우 타입 생략 가능
sum(3,3) {a,b -> a+b} //3,3 -> 6
sum 함수는 a,b와 두 개의 Int 인자를 받아 하나의 Int 반환값을 내는 함수를 인자로 받아 이를 출력한다.
fun sum(a : Int, b : Int) = a+b
//main
sum(5,3,::sum)
println("$a, $b -> ${p(a, b)}") // 5,3 -> 8
람다함수가 아닌 일반함수를 인자로 넣으려면 일반 함수 앞에 ::를 붙여 사용한다.
fun sum(a : Int, p: (Int) -> Int){
println($a -> ${p(a)}")
}
//main
Square(3) {it * it} //square 3 -> 9
고차함수의 인자가 하나인 경우 it을 사용해 간단하게 사용할 수 있다.
클래스와 인스턴스에 대한 개념부터 본다면 클래스는 객체가 갖는 속성이나 메서드를 하나의 캡슐로 만들어주는 역할을 한다. 클래스로부터 만들어진 인스턴스 객체가 기능을 실행하도록 하려면 그 객체의 메서드를 호출해야 한다. 객체를 사용할 때에는 다른 곳에서 해당 인스턴스 객체를 호출할 수 만 있다면 그 객체가 가진 모든 캡슐 안의 기능들(속성, 메서드)를 사용할 수 있다. 이 캡슐안의 기능들을 사용하기 위해, 캡슐에 접근하는 방법을 인터페이스라고 볼 수 있다.
추상클래스는 아직 구현되지 않고 선언만 된 추상메서드를 가지고 있는 클래스이다. 추상클래스는 메서드가 구현되지 않아서 이 클래스를 직접 객체로 만들 수 없다. 반드시 상속을 받는 자식 클래스가 있어야 한다. 추상클래스는 상속을 통해 생성될 자식 클래스에서 메서드 오버라이딩에 강제성을 부여하기 위해 사용된다.
class Person {
var name: String = "Jordan"
val age: Int = 20
}
위 코드에서 name, age를 프로퍼티라고 부른다. 변수처럼 보이지만 이미 접근자라고 부르는 getter/setter와 같은 함수가 내장되어 있기 때문에 프로퍼티라고 부른다
fun sum(a : Int, b : Int)
a,b가 매개변수이다.
sum(3,6)
3,6이 인자이다.
const는 함수나 어떤 클래스의 생성자에게도 결코 할달 될 수 없고 오직 문자열이나 기본 자료형으로 할당되어야 한다.때문에 const 로 선언을 하면 클래스의 프로퍼티나 지역변수로 할당 할 수 없게 된다. 일반적으로 companion object 안에 상수로 선언하게 된다.
상속하는 클래스를 부모클래스(Super Class)라고 하고 상속을 받는 클래스를 자식클래스(Sub Class)라고 한다. 부모클래스를 상속받은 자식클래스는 부모의 변수나 메서드를 자기 것 처럼 사용할 수 있다.
open class Super{
var superNum = 5;
fun superMethod() {
println("Super Class Method $superNum")
}
}
class Sub : Super {
var subNum = 1;
//부모클래스를 호출하는 생성자를 꼭 만들어 줘야함
constructor() : super()
fun subMethod() {
println("Sub Class Method $subNum")
}
}
부모클래스에는 open 키워드를 사용해줘야 한다. 자식클래스에서 부모클래스를 호출하는 생성자를 꼭 만들어줘야한다. 부모클래스를 호출하는 방법은 super() 메서드를 사용하면 된다.
repository package
1. 실제로 DB에 접근하는 객체이다.
dto package
1. 계층간 데이터 교환을 위한 객체이다.
-DB에서 데이터를 얻어 Service나 Controller등으로 보낼 때 사용하는 객체를 말한다.
-> DB의 데이터가 Presentation Logic Tier로 넘어오게 될 때는 DTO의 모습으로 변해서 오고가는 것이다.
DTO와 동일한 개념이지만 read only속성을 갖는다.
domain package
실제 DB의 테이블과 매칭될 클래스
1. @Entity, @Column, @Id 등을 이용한다.
list는 값을 바꿀 수 있는 가변형 mutableListOf()와 값을 바꿀 수 없는 불변형 listOf()로 나눠진다.
//가변형 list
val str : List<String> = mutableListOf("one", "two" ,"three" ,"four" ,"five")
//불변형 list
val num : List<Int> = listOf(1,2,3,4,5)
val str = listOf("one", "two" ,"three" ,"four" ,"five")
for(strNumber in str.indices)
println("str[$strNumber] = ${str[strNumber]}")
//str[0] = one
//str[1] = two
//str[2] = three
//str[3] = four
//str[4] = five
//arrayList선언
val str : ArrayList<String> = arrayListOf("one", "two" ,"three" ,"four" ,"five")
str.add("six") //추가
str.remove("three") //삭제
printle(str)
//[one, two, four, five, six]
가변형 헬퍼 함수를 사용하면 요소를 추가/삭제할 수 있는 list를 선언할 수 있고 반환형은 자바의 ArrayList이다.
val str : mutableList<String> = mutableListOf("a","b","c","d")
str.add("e") //추가
str.removeAt(2) //두 번째 요소 삭제
srt[1] = "w" //1번 요소 변경
println(str)
//[a, w, d, e]
size() - 리스트의 사이즈(갯수)를 반환
get(index) - 해당 인덱스 요소를 가져옴
indexOf(Element) - 해당 요소의 인덱스 번호를 반환
contains(Element) - 해당 요소를 확인 후 있으면 true 없으면 false 반환
isEmpty() - 리스트가 비어있으면 true 아니면 false 반환