조각들

 

문자열 검색 속성과 메서드

 

  • 메서드 get : 인덱스를 전달해서 검색한다.
  • 메서드 first/last : 문자열의 첫 번째 원소와 마지막 원솟값을 조회할 때 사용한다.
  • 속성 lastIndex : 문자열의 마지막 인덱스를 제공한다.
  • 속성 length : 문자열 원소의 개수를 조회하는 속성이다.
  • 메서드 getOrElse : 범위를 초과했을 때 람다표현식을 실행해서 초깃값을 제공한다.
  • 메서드 getOrNull : 없는 인덱스를 조회하면 예외가 아닌 널을 반환한다.
println(myString.getOrElse(myString.length, {'0'})) //범위를 벗어날 경우 초깃값 처리
println(myString.getOrNull(myString.length)) //범위를 벗어날 경우 null
//0
//null

 

빈 문자열 처리 메서드

 

  • isEmpty : 빈 문자열 체크, 이스케이프 문자도 문자로 인식한다.
  • isBlank : 빈 문자열 체크, 이스케이프 문자는 문자로 인식하지 않는다.
  • trimEnd : 마지막 공백만 제거한다.
  • trimStart : 처음 공백만 제거한다.
  • trim : 공백과 이스케이프 문자를 모두 제거한다.

 

문자열 대소문자 변경 메서드

 

  • 메서드 replaceFirstChar : 문자열의 첫 글자를 대문자/소문자로 변경. 메서드 capitalize, decapitalize 대신 사용.
  • 메서드 uppercase/lowercase : 문자열을 대문자/소문자로 변경. 메서드 toUpperCase/toLowerCase 대신 사용.
  • 메서드 to : 두 문자열로 튜플을 구성
  • 메서드 compareTo : 영어 대소문자를 구분하지 않고 비교한다.
val s1 = "Eagle"
val s2 = "eagle"

val res = s1.compareTo(s2, true) // s1-s2로 대소 비교, true를 주면 대소문자 무시
if (res == 0) println("동일한 문자열")
else println("대소문자 구분 처리")

val s3 = "young eagle"
println(s3.replaceFirstChar({it.uppercase()})) //첫 번째 문자를 대문자

println(s3.uppercase()) //전체를 대문자

val sto = "튜플" to "만들기"
println(sto)

//동일한 문자열
//Young eagle
//YOUNG EAGLE
//(튜플, 만들기)

 

메서드 filter : 내부순환을 돌면서 람다표현식이 실행한 결과가 참인 경우만 추출.

ex) 리사이클러뷰 item 삭제 시 갱신된 dataList를 서버에 보낸 후 새로 받아와서 submitList를 하는 게 아니라, 클라 단에서 submitList만 새로 할 수 있게 해줌으로써 효율을 높임. 

 

문자열 매치 메서드

 

  • startsWith : 첫 글자를 패턴 매칭한다.
  • endsWith : 마지막 글자를 패턴 매칭한다.
  • find : 앞부터 검색해서 첫번째 결과값을 반환한다.
  • findLast : 뒤부터 검색해서 첫번째 결과값을 반환한다. 

 

//활용 예시
val res1 = words.filter { e -> e.startsWith("b") }
val res3 = ml.find { it.startsWith("bo") }

 

문자열 주요 메서드

 

  • replace : 매칭되는 문자를 변경해서 새로운 문자열을 반환한다.
  • contains : 매칭되는 문자열 포함 여부를 확인한다.
  • split : 매칭되는 무낮열을 기준으로 분리하여 리스트로 반환한다.
  • joinToString : 리스트 내의 문자열을 특정 문자 기준으로 결합한다.
  • subsequence/substring/splice : 부분 문자열을 만들어 새로운 문자열 객체로 반환한다.

 

val s1 = "Today is a sunny day."
val w - s1.replace("sunny", "rainy")
println(w)

val s2 = "Today is a sunny day."
println(s2.contains("Today"))

val word = "독수리,매,올빼미,까치"
val birds = word.split(",")
println(birds)
val joins = birds.joinToString(",")
println(joins)

val sss = "문자열을 처리하다"
println(sss.subSequence(2,3))
println(sss.substring(2,3))
println(sss.substring(2..3))
println(sss.slice(2..3))

//Today is a rainy day.
//true
//[독수리, 매, 올빼미, 까치]
//독수리,매,올빼미,까치
//열
//열
//열을
//열을

 

StringBuilder의 주요 메서드

 

  • append : 마지막 인덱스 뒤에 추가
  • insert : 특정 인덱스 위치에 추가
  • deleteCharAt : 특정 인덱스 위치의 문자 삭제
  • delete : 시작과 종료 인덱스 사이의 문자 삭제
  • clear : 전체 삭제
  • setCharAt : 특정 위치의 문자 변경
  • capacity : 현재 사용 가능한 사이즈 정보
  •  

 

Any 클래스

 

클래스를 정의할 때 아무것도 상속하지 않아도 Any 클래스는 자동으로 상속한다. 모든 클래스는 기본으로 최상위 클래스 Any가 필요하기 때문이다. 그래서 이 클래스에 확장함수를 지정하면 공통 메서드로 사용된다.

 

Unit 클래스

 

함수는 항상 반환값을 처리한다. 아무것도 하지 않아도 항상 값을 반환하며 보통 반환값이 없다는 것은 Unit의 객체를 반환하는 것이다.

 

Nothing 클래스

 

보통 예외 등을 처리할 때 이 클래스의 객체가 발생한 것으로 여긴다.

 

 

배열의 주요 속성과 메서드

 

  • 보통 arrayOf함수로 만든다.
  • 속성 size : 배열의 크기 즉 원소 개수를 확인하는 속성이다.
  • 메서드 sum/average/count : 배열 원소의 합, 평균, 개수를 조회하는 메서드이다.
  • 메서드 maxOfNull, MinOfNull : 최댓값, 최솟값을 조회하는 메서드이다.
  • 메서드 contentToString : 배열을 출력하는 메서드이다.

 

val arInt = arrayOf(1,2,3,4)

println(arInt)
println(arInt.contentToString())

// [Ljava.lang.Integer;@6da62e6f
// [1, 2, 3, 4]

 

배열의 반복자 주요 메서드

 

반복자의 특징은 한 번 다 사용하면 처리할 원소가 없어서 다시 사용하려면 반복자를 새로 생성해야 한다.

 

  • 메서드 hasNext : 반복자 내 원소의 존재 여부 확인
  • 메서드 next : 반복자의 원소를 하나씩 조회
for (i in arInt) { //for문에서는 자동으로 반복자 처리
	print(i.toString()+",")
}
println()

val x = arStr.indices.iterator() //반복자로 변환
while (x.hasNext()) { //원소가 있는지 확인
	println(arStr.get(x.next()))
}

arStr.forEach { println(it)} //내부 반복자로 처리

arStr.forEachIndexed { //내부 반복자에서 인덱스와 값을 반환 처리;
	i,e -> println("arr[$i] -> $e")
}

//1, 2, 3, 4
//코틀린
//자마
//코틀린
//자마
//arr[0] -> 코틀린
//arr[1] -> 자마

 

배열의 정렬

 

배열을 정렬하여 내부 원소의 위치를 바꿀 때는 sort나 reverse 메서드를 사용한다.

배열의 원소를 정렬하지만 새로운 배열을 만들 때는 sorted, reversed, sortedDescending 메서드를 사용한다.

 

배열 etc.

 

  • JVM에서 프리미티브 자료형을 사용하기 때문에 자료형별 배열 함수와 자료형별 배열 클래스를 제공한다.
  • 배열을 복사할 때는 copyOf 메서드를 사용한다.
  • 보통 배열의 원소를 추가할 때는 + 연산자나 plus 메서드를 사용한다.
  • 부분 배열을 뽑아낼 때는 sliceArray 메서드를 사용한다.
  • first, last, indexOf, in, contains를 사용할 수 있다. 
  • 널 값만 가진 배열을 arrayOFNulls 함수로 만든다.
  • 람다표현식으로 배열의 초깃값을 처리할 수 있다.
val arrInt = IntArray(5) {it *5} //it은 배열 크기의 인덱스 번호이다.

 

 

널러블

 

널에 대한 체크는 컴파일 타임에 확정하지만 실제 실행할 때는 처리하지 않는다. 그래서 널에 대한 처리는 전부 컴파일 처리할 때 예외를 발생시킨다.

 

 

스마트 캐스팅

 

자료형에 대한 타입을 연산자로 확인한 후에는 타입이 자동으로 변환된다.

 

타입 체크 및 변환 연산자

 

  • 타입을 확인하는 연산자(is/!is) : 상속관계에 해당하는 타입일 때만 is, !is로 점검할 수 있다.
  • 타입을 변환하는 연산자(as/as?) : 타입을 변환할 때도 상속관계 내에서 가능하고 불가능할 경우는 as?로 처리하면 null이 반환된다.
  • 상속관계를 벗어난 경우는 연산자로 타입변환을 할 수 없다.
fun checkDataType(value : Any){
	if(value is String){
    	println("$value 은/는 문자열")
    }
    
    if(value !is String){
    	println($value 은/는 문자열이 아님")
    }
}

checkDataType(100)

//100 은/는 문자열이 아님


val a : Number = 100
//println(a is String) 숫자와 문자열의 상속관계가 아니라 처리할 수 없다.

 

 

구조분해(Destructing Declaration)

 

코틀린은 원소를 쉽게 분해해서 변수에 할당할 수 있도록 구조분해를 지원한다.

 

  • componantN : 구조분해가 가능한 것은 저장된 원소를 위치에 따라 조회할 수 있는 메서드가 자동으로 만들어진다. 이때 숫자는 1부터 붙여진다.
  • 구조분해가 가능한 클래스는 내부적으로 이 component 메서드가 자동으로 생성된다. 이 메서드가 있으면 구조분해를 바로 처리할 수 있다. 이 메서드의 숫자는 실제 원소의 위치이다.
  • data class는 컬렉션이 아니지만 내부적으로 구조분해를 지원한다. data class 내의 속성을 지정한 순서대로 component 메서드가 실행되어 원소를 조회한다.

 

  • 코틀린에서 한 번 생성되면 변경할 수 없는 컬렉션이 튜플(tuple) 클래스이다. 
  • 코틀린에서는 Pair 클래스와 Triple 클래스 두 가지 튜플만 지원한다. 실제 변경 불가능한 컬렉션을 지원해서 다양한 튜플이 필요 없다.
  • 튜플 내의 구조분해하는 속성을 확인하면 first, second, third가 있다. 이 속성으로 조회하면 튜플 내의 원소를 조회할 수 있다.
  • 실제 N 대신에 숫자 1,2,3이 메서드에 붙어서 위치별로 원소를 조회한다.

 

val a = 100
val b = 200
val c = 300

val st = Triple(a,b,c) //원소가 3개인 튜플로 구조화
val (a_, b_, c_) = st //튜플 원소를 변수에 할당: 구조분해
println(" $a_ , $b_, $c_ ")

val e = st.first
val f = st.second
val g = st.third

print(" $e, $f, $g ")

val e1 = st.component1() //구조분해 메서드로 변수에 할당
val f1 = st.component2()
val g1 = st.component3()
println(" $e1 , $f1, $g1 ")

//100, 200, 300
//100, 200, 300
//100, 200, 300

Pair를 활용한 확장함수

 

범위

 

  • rangeTo 메서드는 범위 연산자와 같은 결과를 만든다.
  • 역방향으로 표시할 때는 연산자로 처리할 수 없으므로 반드시 downTo 메서드를 사용한다.
  • 문자열도 범위를 지정할 수는 있지만 순환은 할 수 없다.

 

 

etc

 

  • 자바의 Integer 클래스와 코틀린의 Int는 다른 클래스이다.
  • 상위 클래스에 확장함수를 추가하면 서브클래스의 객체에서 이 확장함수를 자기 메서드처럼 사용할 수 있다.
  • 코틀린에서는 수 체계에 따른 자동 변환을 제공하지 않고 명확히 메서드를 사용해서 다른 숫자로 자료형을 변환해야 한다.
  • 문자열은 기본으로 변경할 수 없는 객체이다. 문자열을 변경하려면 StringBuilder 클래스를 사용해야 한다.
  • StringBuilder 객체를 문자열과 연산하려면 문자열로 변환해주어야 한다.
  • 문자열 내에 특정 문자가 포함되었는지 in 연산자로 확인할 수 있다.
  • 여러 원소를 관리하는 클래스를 컬렉션(collection)이라고 한다.
println('강' in "강아지")
//true

 

 

'Kotlin > 스터디' 카테고리의 다른 글

코틀린 스터디 - 9장  (1) 2023.09.10
코틀린 스터티 - 8장  (0) 2023.09.03
코틀린 스터디 - 5장  (0) 2023.08.13
코틀린 스터디 - 4장  (0) 2023.08.06
코틀린 스터디 3장  (0) 2023.07.30