728x90
제네릭의 기본 사용
- 제네릭 : 자료형을 다루는 메소드나 클래스를 컴파일 시점에서 검사하여 적절한 자료형을 선택
- 앵글 브라켓(<>) 사이에 자료형을 선언
- 자료형을 대표하는 형식 매개변수로 T를 사용
class Box(a : Int) //원래의 클래스 선언
///////////
class Box<T>(a:T) //제네릭 클래스 선언 - 모든 자료형을 받을 수 있음
fun main()
{
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
}
fun main()
{
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)
}
fun main()
{
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`>로 선언
- 상위 자료형이 하위 자료형으로 캐스팅됨
자료형 프로텍션
- 선언 지점 변성 : 클래스 자체에 가변성 지정 / 클래스 사용 시 자료형 지정 필요가 없음
- 사용 지점 변성 : 클래스 생성 등 사용 위치에서 가변성을 지정
class Box<T>(var : item : T)
{
fun <T> printObj(box : Box<out Animal>) // 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)
- 다차원 배열 : 배열의 배열
val array1 = arrayOf(1, 2, 3)
val array2 = arrayOf(4, 5, 6)
val array3 = arrayOf(7, 8, 9)
val arr2d = arrayOf(array1, array2, array3)
/*
1 2 3
4 5 6
7 8 9
*/
//변수 선언 없이 2차원 배열
val arr2d = arrayOf(arrayOf(1, 2, 3), arrayOf(1, 2, 3), arrayOf(1, 2, 3))
/*
1 2 3
1 2 3
1 2 3
*/
- 자료형이 제한된 배열
- arrayOf<자료형>(...)
- charArrayOf(), booleanArrayOf(), ... 등 (자료형)ArrayOf()으로 작성
- 배열 요소에 접근
- 읽기
- arr.get(인덱스) : 게터를 이용
- arr[인덱스]
- 쓰기
- arr.set(인덱스, 값)
- arr[인덱스] = 값
- 읽기
- Array (요소 개수, 초기값) : 표현식을 이용한 배열 생성
- 2씩 늘어나는 정수 배열 : Array(5, {i -> i*2}) (람다식으로 초기값 설정 가능)
- 1000개의 null 배열 : arrayOfNulls
(1000) - 1000개의 0배열 : Array(1000, {0})
- 생성된 배열은 고정
- 새롭게 할당 : arr.plus(요소)
- 범위를 잘라내어 새 배열 생성 : arr.sliceArray(0..2)
- 배열의 순환
- forEach {element -> 식} : 요소별로 순환
- forEachIndexed {i, e -> 식} : 인덱스, 요소를 배열에서 받아서 식 처리
- Iterator 사용 : arr.iterator().next() (다음 index 반환)
배열의 정렬
- 코틀린 Array는 기본적인 정렬을 제공
- 정렬 배열 반환
- sortArray() : 오름차순 정렬
- sortArrayDescending() : 내림차순 정렬
- 원본 배열 정렬
- sort() : 오름차순
- sortDescending() : 내림차순
- 배열 필터링
- filter(람다식) : 원하는 데이터를 선택 가능
- minBy, maxBy, 필드보다 작은/큰 값
- flatten : 다차원 배열을 평탄화
문자열의 기본
- 문자열은 배열의 일종으로, 불변값으로 생성
- 참조 메모리는 변경되지 않음
- 새로운 문자열 대입 시 기존 문자열은 Garbage Collector에 의해 제거
- 문자열 추출, 병합
- String.substring(인덱스 범위) : 범위 내 문자를 String으로 반환
- CharSequence.subSequence(인덱스 범위) : Charsequence로 반환
- 병합 : 문자열은 덧셈을 통해 이어붙일 수 있음 ("ab"+"c" -> "abc")
- 문자열 비교
- a.compareTo(b) : a,b가 같으면 0, a가 작으면 양수, 그렇지 않으면 음수
- 각 위치에 있는 문자열의 숫자값을 비교
- a.compareTo(b, true) : 대소문자에 무관하게 비교
- a.compareTo(b) : a,b가 같으면 0, a가 작으면 양수, 그렇지 않으면 음수
- StringBuilder(문자열)
- 문자열 공간을 더 크게 잡음
- 작은 범위의 요소 변경이 용이 / 처리가 늦고, 변경이 없는 경우 메모리 낭비
- 문자열 변경이 잦은 경우 사용
- 그 외 메소드
- append(문자열) : 문자열 뒤에 이어붙임
- insert(인덱스, 문자열) : 해당 인덱스부터 문자열 이어붙임
- delete(a, b) : [a, b-1]의 범위 문자 삭제
- toLowerCase / toUpperCase : 소/대문자 변경
- split(기준) : 기준 문자를 기준으로 한 문자열 분리
- trim() : 앞뒤 공백 제거
728x90