본문 바로가기

분류 전체보기

(46)
코틀린: 생성자와 속성 초기화 - 보조 생성자 ■ 보조 생성자(secondary constructor)보조 생성자는 클래스 블록 안에서 정의합니다. 키워드 constructor를 사용해 보조 생성자를 정의합니다. 실행 순서는 주 생성자(선언되어 있으면)와 init 블록을 실행하고 나서 보조 생성자를 실행합니다. 보조 생성자는 속성을 정의할 수 없기 때문에, 보조 생성자의 형식 인자 이름에는 키워드 val 또는 var 를 붙일 수 없습니다.  class Person { val name:String var age:Int var isMarried:Boolean constructor(name:String, age:Int, isMarried:Boolean) { // 보조 생성자 this.name = name th..
코틀린: 생성자와 속성 초기화 - 주 생성자 클래스 생성자에 관한 보충 설명입니다(책에서 충분히 설명하지 못했던 내용을 책에 소개한 예제를 사용해 보충 설명합니다). 자세한 내용은 쉽게 다가가는 최신 프로그래밍: 코틀린 - 4.1 클래스 선언을 참고하기 바랍니다.생성자와 속성 초기화는 객체 지향 프로그래밍 언어를 이해하기 위한 첫 번째 관문입니다.  생성자 호출은 어떤 객체를 생성할 것인가를 결정합니다. 생성자가 속성 초깃값을 할당하기 때문입니다. 생성자는 일반 함수와 기능이 거의(?) 같습니다. 차이점은 함수 이름이 constructor()로 정해져 있으며, 반환 값이 없어 return 문을 사용하지 않습니다(보조 생성자에서는 return 문을 사용할 수 있습니다). ■ 생성자와 객체 생성자는 클래스의 속성(property)을 초기화하는 특별한 ..
코틀린: 확장 함수와 수신 객체를 갖는 함수 타입(3/3) ■ 확장 함수 타입은 왜 필요할까요?아래 예제에서 함수 addItems()의 형식인자 action은 일반 함수 타입을  갖습니다. 이 함수 타입을 갖는 변수 newItem을 addItems()의 실인자로 전달할 수 있습니다. 코드는 직관적이고 간단하지만, 람다 식 블록에서 매번 키워드 it를 사용해 StringBuilder 타입 객체를 참조해야 합니다. 그렇다고 it를 생략할 수는 없습니다. fun addItems(action: (StringBuilder) -> Unit): String { val sb = StringBuilder() action(sb) return sb.toString()}fun main() { val newItem: (StringBuilder) -> Unit = ..
코틀린: 확장 함수와 수신 객체를 갖는 함수 타입(2/3) ■ 수신 객체를 갖지 않는 함수 타입 : 기존 클래스의 메소드 참조확장 함수 타입(=수신 객체를 갖는 함수 타입)과 일반 함수 타입은 어떤 차이가 있을까요? 아주 뚜렷한 차이점이 있습니다. 아래 예제에서 쉽게 확인할 수 있습니다. 수신 객체가 없기 때문에 9.intMultiple(7)과 같은 표현은 사용할 수 없습니다.fun main() { val intMultiple: (Int, Int) -> Int = Int::times // val intMultiple: (Int, Int) -> Int = { i,j -> i.times(j) } // 람다 식 사용 println(9.intMultiple(7)) // 에러 발생 println(intMultiple(9, 7))} ■ 확장 함수를 기..
코틀린: 확장 함수와 수신 객체를 갖는 함수 타입(1/3) 책 여기 저기 흩어져 있던 확장 함수에 관련된 내용을 한 군데 모았습니다.  자세한 내용은 쉽게 다가가는 최신 프로그래밍: 코틀린 - 3.2 함수형 프로그래밍, 3.4 람다 식: 고급 및 3.6.2 확장 함수를 참고하기 바랍니다. 확장 함수와 관련된 내용이 이렇게 많았다구요? 놀랍죠! 4.16 범위 함수(scope function) 에서 소개한 5개 범위 함수 중 with를 제외한 4개(also, apply, let, run)가 모두 확장 함수입니다. 확장(extension)이란 기능을 추가한다는 뜻입니다. 정확히 말하면 기존 클래스(class)에 기능을 추가한다는 뜻입니다. 클래스에서 제공하는 함수 대신 응용 목적에 필요한 기능을 추가하는 겁니다. 클래스에 추가하는 기능은 대부분 함수이지만 속성도 추가..
코틀린: 3장 테스트에 도전해 보세요 (4번 정답 해설) 문제 4 두 숫자의 최소 공배수(LCM, least common multiples)를 구하는 함수 findLCM()을 람다 식으로 바꿔서 코드를 작성해 보세요.■ 최소 공배수(LCM)와 최대 공약수 (GCD, greatest common divisor)3과 7의 최소 공배수는 21이지만, 12와 18의 최소 공배수는 36입니다. 최소공배수 = (a × b) / 최대공약수 입니다. 최소 공배수는 최대 공약수(GCD, greatest common divisor)와 반비례 관계입니다.  3과 7의 최대 공약수는 1이지만 최소 공배수는 21입니다.  12와 18의 최대 공약수는 6이지며, 최소 공배수는 36 입니다(인터넷 검색을 해 보면, 대부분 위 공식을 구현한 코드를 제시할 겁니다. 최소 공배수 코드는 마트..
코틀린: 3장 테스트에 도전해 보세요 (6번 정답 해설) 문제 6 휴대폰 번호에서 숫자만 추출하는 예제를 교재 p.141에서 소개했습니다. 이 코드를 참고하여 주민등록번호 13자리 중 앞 6 숫자와 뒤 7 숫자를 추출하는 프로그램을 만들어 보세요.  단, 아래 조건을 모두 만족해야 합니다.(1) String 클래스의 확장 함수를 선언해야 합니다.(2) 람다 식을 함수 타입의 형식 인자로 전달해야 합니다.■ 확장 함수의 서명(signature) 선언(1)번 조건에 맞게 extractFirst()를  String 클래스의 확장 함수로 추가하려면 "fun String.extractFirst( ) "와 같이 선언하면 됩니다. 이 함수의 반환 타입은 부분 문자열을 추출한 결과이기 때문에 String입니다. 이어서 이 확장 함수의 형식 인자를 "op:String.( ) ..
코틀린: 3장 테스트에 도전해 보세요 쉽게 다가가는 최신 프로그래밍: 코틀린 - 3장 함수를 완전히 이해했나요? 다음 문제를 풀어 보세요.문제 1 아래 코드는 교재 p.117에서 설명한 프로그램입니다. (1) 함수 divide()의 형식 인자 b가 0이면 어떤 Exception이 발생할까요? (2) 교재 p/74쪽에서 설명한 명시적 예외 발생: throw를 참고하여, 예외 처리가 가능하도록 코드를 수정해 보세요.fun divide(a:Int=5, b:Int, c:Int=3): Double { return (a/b + c).toDouble()}fun main() { println(divide(b=1)) println(divide(5, 2)) }  문제 2 교재 p.136의 함수 convert() 함수를 테스트하기..