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) : 대소문자에 무관하게 비교
  • StringBuilder(문자열)
    • 문자열 공간을 더 크게 잡음
    • 작은 범위의 요소 변경이 용이 / 처리가 늦고, 변경이 없는 경우 메모리 낭비
    • 문자열 변경이 잦은 경우 사용
  • 그 외 메소드
    • append(문자열) : 문자열 뒤에 이어붙임
    • insert(인덱스, 문자열) : 해당 인덱스부터 문자열 이어붙임
    • delete(a, b) : [a, b-1]의 범위 문자 삭제
    • toLowerCase / toUpperCase : 소/대문자 변경
    • split(기준) : 기준 문자를 기준으로 한 문자열 분리
    • trim() : 앞뒤 공백 제거
728x90

+ Recent posts