본문 바로가기

Language

(107)
[Kotlin] 문자열 함수 val test1 = "Test.Kotlin.String" // 문자열 길이 println(test1.length) // 18 // 대소문자 변환 println(test1.toLowerCase()) // test.kotlin.string println(test1.toUpperCase()) // TEST.KOTLIN.STRING // 특정 문자열을 기준으로 문자열 분할 // * Java와 달리 정규식이 아닌 일반 문자열을 넣어도 동작 val test2 = test1.split(".") println(test2) // [Test, Kotlin, String] // 문자열이 들어가 있는 배열을 다시 하나의 문자열로 합침 println(test2.joinToString()) // Test, Kotlin, Str..
[Kotlin] 컬렉션(1) 리스트 리스트는 데이터를 모아 관리하는 컬렉션 클래스를 상속받는 서브 클래스 중 가장 단순한 형태로, 여러 개의 데이터를 원하는 순서로 넣어 관리하는 형태이다. 리스트에는 두 가지가 있다. List : 생성 시에 넣은 객체를 대체, 추가, 삭제 할 수 없음 MutableList : 생성 시에 넣은 객체를 대체, 추가, 삭제가 가능 리스트 생성 listOf(1, 2, 3) mutableListOf("A", "B", "C") MutableList에서는 요소의 추가, 변경, 삭제, 무작위 섞기, 정렬 가능 요소의 추가 : add(데이터) / add(인덱스, 데이터) 변경 : list[인덱스] = 데이터 삭제 : remove(데이터) / removeAt(인덱스) 무작위 섞기 : shuffle() 정렬 : sort() ..
[Kotlin] 제너릭 클래스 A와 A를 상속받은 클래스 B가 있을 때, 이 두 클래스의 인스턴스를 공용으로 사용하는 하나의 함수에 파라미터로 받으려면? fun castingExam(var a: A) 수퍼클래스인 A의 자료형으로 받으면 B를 넣어도 A로 캐스팅 되어, 두 클래스 모두 함수의 파라미터로 사용할 수 있다. 하지만 캐스팅 연산을 거치는 것은 프로그램의 속도를 저하시킬 수 있다는 단점이 있다 → 제너릭을 사용하면 성능 높일 수 있다!! 제너릭: 클래스나 함수를 선언할 때 고정적인 자료형 대신 실제 자료형으로 대체되는 타입 파라미터를 받아 사용하는 방법 (클래스나 함수에서 사용하는 자료형을 외부에서 지정) 타입 파라미터의 이름은 클래스 이름과 규칙이 같지만 일반적으로 ‘Type’의 이니셜인 ‘T’를 사용하는 것이 관례이..
[Kotlin] 클래스의 다형성 Drink 클래스와 이를 상속받은 Cola 클래스가 있다면 Cola의 인스턴스를 만들 때는 Drink의 내용을 담는 공간에 Cola의 내용을 담는 공간이 추가되어 생성된다. var a: Drink = Cola() Drink를 담는 변수에 저장하면 Drink의 기능만 사용하게 된다. → Up-Casting : 상위 자료형인 수퍼클래스로 변환 var b: Cola = Cola() *타입추론 기능으로 Cola 자료형은 생략 가능 Cola를 담는 변수에 저장하면 Cola의 기능까지 모두 사용할 수 있다. Down-Casting: Up-Casting된 인스턴스를 다시 하위 자료형으로 변환 다운캐스팅은 별도의 연산자 필요 - as : 변수를 호환되는 자료형으로 변환해주는 캐스팅 연산자 var a: Drink = C..
[Kotlin] 익명객체와 옵저버 패턴 옵저버 : 이벤트가 일어나는 것을 감시하는 감시자 ex. 안드로이드 키의 입력, 터치의 발생, 데이터의 수신 등 함수로 직접 요청하지 않았지만 시스템 또는 루틴에 의해서 발생하게 되는 동작을 ‘이벤트’라고 부르며 이 이벤트가 발생할 때마다 즉각적으로 처리할 수 있도록 만드는 프로그래밍 패턴을 옵저버 패턴이라고 부른다. 옵저버 패턴을 구현할 때는 두 개의 클래스가 필요하다. 이벤트를 수신하는 클래스 (class A) 이벤트를 발생 및 전달하는 클래스 (class B) 어떻게 통신? B에서 이벤트가 발생할 때 A에 있는 이벤트를 처리하는 함수를 호출하여 알려준다. → 문제 : A의 필요에 따라 B의 인스턴스를 생성하여 사용하기 때문에 A는 B를 직접 참조할 수 있지만 B는 A를 참조할 방법이 없다. → 해결..
[Kotlin] 오브젝트 Object : 생성자 없이 객체를 직접 만들어 냄 기존에 배웠던 class는 단지 인스턴스 객체를 만들기 위한 틀이기 때문에 내부에 있는 속성이나 함수를 사용하려면 생성자를 통해 실체가 되는 인스턴스 객체를 만들어야 했다. 그러나 여러 개의 인스턴스 객체가 필요하지 않으며 단 하나의 객체만으로 공통적인 속성과 함수를 사용해야하는 코드에서는 class를 쓸 필요 없이 Object를 사용하면 된다. (Singleton Pattern을 언어 차원에서 지원하는 것) fun main(){ println(Counter.count) // 0 Counter.countUp() Counter.countUp() println(Counter.count) // 2 Counter.clear() println(Counter.co..
[Kotlin] 스코프 함수 람다함수의 특별한 케이스 1. 람다함수도 여러 구문으로 사용 가능 val c: (String) -> Unit = { str -> println("$str 람다함수") println("여러 구문을") println("사용가능합니다") } 람다함수가 여러 줄이 되는 경우 마지막 구문의 결과값이 반환됨 val calculate: (Int, Int) -> Int = { a, b -> println(a) println(b) a + b // * a + b의 값을 Int로 반환함 } 2. 람다함수에 파라미터가 없다면? 중괄호 안에 실행할 구문만 나열 val a: () -> Unit = { println("패러미터가 없어요") } 3. 파라미터가 하나뿐이면 it 사용 val c: (String) -> Unit = { ..
[Kotlin] 고차함수와 람다함수 고차함수 : 함수를 마치 클래스에서 만들어 낸 인스턴스처럼 취급하는 방법. 함수를 파라미터로 넘겨줄 수도 있고 결과값으로 반환받을 수도 있다. 코틀린에서는 모든 함수를 고차함수로 사용 가능하다. 함수의 형식은 (자료형, 자료형, …) → 자료형으로 나타낸다. 일반 함수를 고차 함수로 변경해주는 연산자 - 함수 이름 앞에 콜론 두 개 (::함수명) fun main(){ b(::a) // 출력: b가 호출한 함수 a } fun a(str: String){ println("$str 함수 a") } fun b(function: (String) -> Unit){ function("b가 호출한") } Unit: 값이 없다는 형식 패러미터로 넘길 함수를 굳이 이름까지 붙여 따로 만들 필요가 있을까? → 함수를 람다식..