목록분류 전체보기 (99)
안드로이드 개발자 노트
2. 추상 클래스와 인터페이스 (클래스 계층 이해하기)1. 추상 클래스와 추상 멤버 추상 클래스는 직접 인스턴스화할 수 없고 다른 클래스의 상위 클래스 역할만 할 수 있는 클래스를 뜻한다. 클래스를 추상 클래스로 만들려면 abstract 라는 변경자 키워드를 붙여야 한다.abstract class Entity(val name: String)// ok: 하위 클래스에서 위임 호출class Person(name: String, val age: Int) : Entity(name)// error: Cannot create an instance of an abstract classval entity = Entity("Unknown") 추상 클래스에도 생성자가 있을 수 있다. 추상 클래스와 비추상 클래스의 차이는 ..
상속 (클래스 계층 이해하기) 1. 하위 클래스 선언 클래스 정의에서 주생성자 뒤에 :을 넣고 상위 클래스가 될 클래스의 이름을 넣으면 클래스를 상속할 수 있다. class 앞에 open 키워드는 클래스가 상속에 대해 열려있다는 뜻으로, 디폴트로 모든 클래스가 열려있고 상속을 금지하려면 final을 명시해야하는 자바와는 달리 코틀린 클래스는 디폴트가 final이고 이 변경자가 붙여야만 상속할 수 있다. open class Vehicle { var currentSpeed = 0 fun start() { println("I'm moving") } fun stop() { println("Stopped") } } open class FlyingVehicle : Vehicle() { fun takeOff() { ..
2. 파일과 I/O 스트림 (컬렉션과 I/O 자세히 알아보기) 1. 스트림 유틸리티 코틀린은 자바 I/O 스트림에 대한 확장 함수를 다수 제공한다. 다음은 스트림 전체 콘텐츠를 읽어오는 함수들이다. fun InputStream.readBytes(): ByteArray fun Reader.readText(): String fun Reader.readLines(): Line readLines() 함수는 스트림 끝까지 콘텐츠를 읽어오지만, readLine() 함수는 스트림에서 한 줄만 가져온다. 또한 readLines() 함수는 값을 반환하면서 스트림을 닫아주지만, readText()는 그렇지 않다. FileWriter("data.txt").use { it.write("One\nTwo\nThree") } //..
컬렉션 (컬렉션과 I/O 자세히 알아보기) 컬렉션을 조작하는 모든 연산이 인라인 함수이다. 따라서 이런 연산을 사용해도 함수 호출이나 람다 호출에 따른 부가 비용이 들지 않는다. 1. 컬렉션 타입 코틀린 컬렉션 타입은 기본적으로 네 가지로 분류된다. 배열, 이터러블, 시퀀스, 맵 컬렉션은 기본적으로 원소의 타입을 지정하는 제네릭 타입이다. 이터러블 이터러블은 Iterable 타입으로 표현된다. 일반적으로 즉시 계산(eager)되는 상태가 있는(stateful) 컬렉션을 표현한다. 즉시 계산: 필요한 시점에 원소가 초기화되지 않고 컬렉션을 최초로 생성할 때 초기화된다는 뜻 상태가 있다: 컬렉션이 원소를 필요할 때 생성하는 제너레이터 함수를 유지하지 않고 원소를 저장한다는 뜻 이터러블 타입은 원소를 순회할 ..
1. 이넘 클래스 이넘 클래스는 미리 정의해둔 상수들로 이뤄진 제한된 집합을 표현하는 클래스이다. enum class WeekDay { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } fun WeekDay.isWorkDay() = this == WeekDay.SATURDAY || this == WeekDay.SUNDAY fun main() { println(WeekDay.MONDAY.isWorkDay()) // false println(WeekDay.SATURDAY.isWorkDay()) // true } 1. 빠뜨린 부분이 없는 when 식 when 식에서 모든 이넘 상수를 다룬 경우에는 else 가지를 생략할 수 있다. enum cl..
1. 코틀린을 활용한 함수형 프로그래밍 코드 추상화와 합성이 더 쉽게 가능한 유연성을 제공하는 고차 함수 1. 고차 함수 정수 배열의 원소의 합계를 계산하는 함수를 정의했다. fun sum(numbers: IntArray): Int { var result = numbers.firstOrNull() ?: throw IllegalArgumentException("Empty array") for (i in 1..numbers.lastIndex) result += numbers[i] return result } fun main() { println(sum(intArrayOf(1, 2, 3))) // 6 } 이 함수를 곱셈이나 최댓값/최솟값처럼 다양한 집계 함수를 사용하게 하려면 함수 자체의 루프 로직은 그대로 ..
1. 클래스 정의하기 1. 클래스 내부 구조 클래스는 class 키워드 다음에 클래스 이름이 오고 그다음에 클래스 본문이 오는 형태로 정의된다. 클래스 안에는 프로퍼티와 함수가 정의될 수 있다. class Person { // 프로퍼티 부분 var firstName: String = "" var familyName: String = "" var age: Int = 0 // 함수 부분 fun fullName() = "$firstName $familyName" fun showMe() { println("${fullName()}: $age") } } 이 정의는 인스턴스에 firstName, familyName, age라는 프로퍼티와 fullName, showMe라는 함수가 들어있음을 알려준다. 일반적으로 프로..
1. 함수 1. 코틀린 함수의 구조 코틀린 함수는 어떤 입력(파라미터(parameter))를 받아 자신을 호출한 코드 쪽에 출력값(결괏값)을 반환(return)할 수 있는 재사용 가능한 코드 블록이다. import kotlin.math.PI fun circleArea(radius: Double): Double { return PI*radius*radius } fun main() { print("Enter radius: ") val radius = readLine()!!.toDouble() println("Circle area: ${circleArea(radius)}") } circleArea 함수를 구성하는 요소를 살펴보면, fun 키워드 뒤의 함수 이름을 변수 이름과 마찬가지로 아무 식별자나 쓸 수 있..
1. 기본 문법 1. 주석 한 줄짜리 주석 : // 로 시작하며 줄이 끝나면 주석도 끝난다. 여러 줄 주석 : /* 로 시작하고 */ 로 끝난다. KDoc 여러 줄 주석 : /** 로 시작하고 */ 로 끝난다. /* 여러 줄 주석 /* 주석 안에 내포된 주석 */ */ println("Hello") // 한 줄짜리 주석 자바와 달리 코틀린에서는 여러 줄 주석을 여러 번 내포시킬 수 있다. 2. 변수 정의하기 val timeInSeconds = 15 코틀린에서 변수를 정의하는 요소들 val 키워드 : 값을 뜻하는 value에서 유래했다. 변수 식별자 : 새 변수에 이름을 부여하고, 나중에 이를 가리킬 때 사용한다. 변수의 초깃값을 정의하는 식 : = 기호 뒤에 온다. 코틀린은 타입추론이 가능하다. 변수 타..