마크다운을 이용한 타이핑 필기는 편하긴 하지만 개행 등을 잘 못하면 가독성이 극악이 된다는 단점이 있었는데, 이런식으로 PPT 양식으로 만들면 한 칸 내에 정보가 제한되는(?) 효과를 발휘하면서 굉장히 읽기 편한 자료를 만들 수 있었다.
다만 아직 개발중인 건지, 불완전한 모습이 간간히 보이고 있다. 어느 정도는 자동 맞춤을 해주지만, 글이 너무 많아지면 내용이 아예 잘려버린다던가(축소에 한계치가 있는걸까?) PPT 변환을 해봤더니 첫페이지 내용으로만 변환되는 문제도 있었고, 아쉽게도 이미지 파일 역시 첫 페이지만 변환이 가능하다. 어서 기능개선을 통해 불편한 점이 해결되었으면 좋을 듯.
제네릭 : 자료형을 다루는 메소드나 클래스를 컴파일 시점에서 검사하여 적절한 자료형을 선택
앵글 브라켓(<>) 사이에 자료형을 선언
자료형을 대표하는 형식 매개변수로 T를 사용
classBox(a : Int) //원래의 클래스 선언///////////classBox<T>(a:T) //제네릭 클래스 선언 - 모든 자료형을 받을 수 있음funmain()
{
val box1 = Box(1) //Box<Int>로 초기화val box2 = Box("kim") //Box<String>으로 초기화
}
제네릭 함수
제네릭 함수 : 함수나 메소드 앞에 지정
fun<T>genericFun(arg : T) : T? { ... } //T는 순서대로 형식 매개변수, 매개변수 자료형, 반환 자료형fun<K, V>genericFun(key : K, value : V) : Unit {...} //형식 매개변수가 여러개인 경우//배열의 인덱스 찾기fun<T>find(a:Array<T>, Target : T) : Int
{
for (i in a.indices) //a.indice : a의 인덱스 반환 (0..n)
{
if(a[i] == Target) return i
}
return -1
}
funmain()
{
val arr1: Array<Int> = arrayOf(1,2,3,4)
println(find(arr1, 2)) //1 반환됨
}
//람다식을 이용한 반환형 연산식 결정fun<T>add(a:T, b:T, op : (T,T)->T):T
{
return op(a,b)
}
funmain()
{
val result = add(2, 3, {a, b -> a+b}) //람다식으로 2+3 반환됨
println(result) //5 출력
}
함수의 형식 매개변수 제한하기 : <T:자료형>으로 선언하여 제한 가능
함수 호출 시 해당 자료형으로 선언해주어야 함(<자료형>) - 만족하지 않을 경우 오류 발생
가변성
형식 매개변수가 클래스 계층에 미치는 영향 정의
상위 클래스가 하위 클래스를 수용할 수 있음
ex. Number(정수, 실수를 모두 포함) > Int, Int?(Nullable) > Int
가변성의 유형
무변성 : C와 C<T'>는 무관
코틀린에서는 별도 지정이 없으면 형식 매개변수는 무변성
공변성 : T'이 T의 하위 자료형이면, C<T'>는 C의 하위 자료형
<Out T`>로 선언
하위 자료형이 상위 자료형으로 캐스팅됨
반공변성 : T'이 T의 하위 자료형이면, C<T'>는 C의 상위 자료형
<in T`>로 선언
상위 자료형이 하위 자료형으로 캐스팅됨
자료형 프로텍션
선언 지점 변성 : 클래스 자체에 가변성 지정 / 클래스 사용 시 자료형 지정 필요가 없음
사용 지점 변성 : 클래스 생성 등 사용 위치에서 가변성을 지정
classBox<T>(var : item : T)
{
fun<T>printObj(box : Box<outAnimal>)// Box를 사용할 때 가변성을 결정
{
val obj : Animal = box.item //out이므로 getter가 동작
box.item = Animal() //out이므로 setter는 동작하지 않음//자료형 프로텍션(out으로 선언)에 의해 안전성 보장
}
}
스타 프로젝션 : in/out 선언 없이 추후 겱정
<*>으로 선언
자료형이 결정된 후에는 그 자료형만 사용 가능하도록 제한
배열
데이터의 연속적 나열
arrayOf(), Array() 생성자로 생성
arrayOfNulls() : 빈 배열
배열은 객체이므로 Heap에 저장됨
val numbers = arrayOf(1, 2, 3, 4)
for (element in numbers) println(element)