-
1장. 코틀린이란 무엇이며, 왜 필요한가?Kotlin 2022. 2. 17. 19:00
코틀린이란?
p. 35
자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어이다.
ex) 서버 개발, 안드로이드 앱 개발
코틀린 맛보기
import java.util.stream.Collectors.maxBy data class Person(val name : String, //'데이터' 클래스 val age : Int? = null)// 널이 될 수 있는 타입(Int?)과 파라미터 디폴트 값 fun main(args:Array<String>) { //최상위 함수 val persons = listOf(Person("영희"), Person("철수", age=29))//이름 붙인 파라미터 val oldest = persons.maxByOrNull{it.age?:0} //람다 식과 엘비스 연산자 println("나이가 가장 많은 사람:$oldest")//문자열 템플릿 } /* [출력 결과] 나이가 가장 많은 사람:Person(name=철수, age=29) */
- name, age라는 프로퍼티(property)가 들어간 간단한 데이터 클래스를 정의한다.
- age 프로퍼티의 디폴트 값은 (따로 지정하지 않은 경우) null이다.
- 사람 리스트를 만들 때 영희의 나이는 지정하지 않았기 때문에 null이 대신 쓰인다.
- maxByOrNull : 리스트에서 가장 나이 많은 사람을 찾기 위해 사용
- 이 함수에 전달한 람다식은 파라미터를 하나 받는다.
- it이라는 이름을 사용하면 (별도로 파라미터 이름을 정의하지 않아도) 람다 식의 유일한 인자를 사용할 수 있다.
- 엘비스 연산자(:?)는 age가 null인 경우 0을 반환하고, 그렇지 않은 경우 age의 값을 반환한다.
- 영희의 나이를 지정하지는 않았지만 엘비스 연산자가 null을 0으로 변환해주기 때문에 철수가 가장 나이 많은 사람으로 선정
※ 주의 ※ 8번 줄 maxByOrNull - 책에는 maxBy로 되어있는데 안돼서 찾아봤더니 버전이 업그레이드되면서 어떤 extension을 지원 안 하게 돼서 그렇다고 한다.
[AndroidStudio / Kotlin] Unresolved reference 오류 해결
2020년쯤에 만들어진 코틀린 강좌를 따라하다보면 @+id/ 에 해당하는 값을 Activity 에 입력할때 강의쌤들은 그냥 입력하는데 나는 자꾸 빨간색으로 써지면서 오류가 뜨더라... 진짜 이것때문에 유튜
whkakrkr.tistory.com
코틀린 주요 특성
p. 37
1. 대상 플랫폼 : 서버, 안드로이드 등 자바가 실행되는 모든 곳
p. 38
2. 정적 타입 지정 언어
- 정의
- 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해준다는 뜻.
- 장점
- 성능 : 실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요 없으므로 메소드 호출이 더 빠르다.
- 신뢰성 : 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행 시 프로그램이 오류로 중단될 가능성이 더 적어진다.
- 유지 보수성 : 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다룰 때도 더 쉽다.
- 도구 지원 : 정적 타입 지정을 활용하면 더 안전하게 리팩토리 할 수 있고, 도구는 더 정확한 코드 완성 기능을 제공할 수 있으며, IDE의 다른 지원 기능도 더 잘 만들 수 있다.
- 타입 추론 ( type inference )
- 컴파일러가 문맥을 고려해 변수 타입을 결정하는 기능.
- 널이 될 수 있는 타입을 지원
- 컴파일 시점에 널 포인터 예외가 발생할 수 있는지 여부를 검사 → 프로그램의 신뢰 ↑
- 함수 타입에 대한 지원
p. 40
3. 함수형 프로그래밍과 객체지향 프로그래밍
- 함수형 프로그래밍 핵심 개념
- 일급 시민인(first-class) 함수 : 함수(프로그램의 행동을 나타내는 코드 조각)를 일반 값처럼 다룰 수 있다. 함수를 변수에 저장할 수 있고, 함수를 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어서 변환할 수 있다.
- 불변성(immutability) : 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성한다.
- 부수 효과(side effect) 없음 : 함수형 프로그래밍에서는 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다.
- 함수형 프로그래밍 이점
- 간결성
- 다중 스레드를 사용해도 안전(safe multithreading)
- 테스트하기 쉬움
코틀린으로 코드를 작성할 때는 객체지향과 함수형 접근 방법을 함께 조합해서 문제에 가장 적합한 도구를 사용하면 된다.
4. 무료 오픈 소스
- 주요 IDE와 빌드 시스템을 완전히 지원한다.
코틀린 응용
p.43
코틀린 서버 프로그래밍
- 서버 프로그래밍 분야
- 브라우저에 HTML 페이지를 돌려주는 웹 애플리케이션
- 모바일 애플리케이션에게 HTTP를 통해 JSON API를 제공하는 백엔드 애플리케이션
- RPC(원격 프로시저 호출) 프로토콜을 통해 서로 통신하는 작은 서비스들로 이뤄진 마이크로 서비스
- 자바 코드와 매끄럽게 상호 운용할 수 있다는 점이 코틀린의 가장 큰 장점이다.
- 새로운 도구
- HTML 생성 라이브러리
- 코트린이 제공하는 깔끔하고 간결한 DSL 기능
코틀린 안드로이드 프로그래밍
- 코틀린 언어의 특성과 안드로이드 프레임워크의 특별한 컴파일러 플러그인 지원을 조합하면 안드로이드 애플리케이션 개발의 생산성을 더 높이고 개발의 즐거움을 더 할 수 있다.
- 코틀린 사용 시 이점
- 신뢰성 ↑
- 널 포인터로 인해 생기는 문제 ↓
- 성능 측면에서 아무 손해가 없다.
코틀린의 철학
실용성
- 도구를 강조한다는 점이다. 편리한 개발환경도 생산성 향상에 필수적이다.
- 항상 도구의 활용을 염두에 두고 설계돼 있다.
- IDE의 코틀린 언어 지원이 중요한 역할을 한다.
- 더 간결한 구조로 바꿀 수 있는 대부분의 코드 패턴을 도구가 자동으로 감지해서 수정하라고 제안한다.
간결성
- 프로그래머가 작성하는 코드에서 의미가 없는 부분을 줄이고 언어가 요구하는 구조를 만족시키기 위해 별 뜻은 없지만 프로그램에 꼭 넣어야 하는 부수적인 요소를 줄이기 위해 많은 노력을 기울였다.
- 게터, 세터, 생성자 파라미터를 필드에 대입하기 위한 로직 등 자바에 존재하는 여러 가지 번거로운 준비 코드를 코틀린은 묵시적으로 제공하기 때문에 코틀린 소스코드는 그런 준비 코드로 인해 지저분해지는 일이 없다.
p. 50
안전성
- 일반적으로 프로그래밍 언어가 안전하다는 말은 프로그램에서 발생할 수 있는 오류 중에서 일부 유형의 오류를 프로그램 설계가 원칙적으로 방지해준다는 뜻이다.
- NullPointerException 방지
val s : String ?= null // 널이 될 수 있음 val s2 : String = "" // 널이 될 수 없음
- ClassCastException 방지 (스마트 캐스팅 지원)
- 개념 : 어떤 객체를 다른 타입으로 캐스트 하기 전에 타입을 미리 검사하지 않을 경우 발생하는 예외
- 코틀린에서는 타입 검사와 캐스트가 한 연산자에 이뤄진다. 어떤 객체의 타입을 검사했고 그 객체가 그 타입에 속한다면 해당 타입의 메소드나 필드 등의 멤버를 별도의 캐스트 없이 사용할 수 있다.
if(value is String) // 타입을 검사한다. println(value.toUpperCase()) //해당 타입의 메소드를 사용한다.
스마트 캐스팅 : https://hongku.tistory.com/352
코틀린의 is와 스마트 캐스트(Smart cast)란?
코틀린에는 스마트 캐스트(Smart cast)가 있습니다. 간단하게 설명하면, 프로그래머가 굳이 원하는 타입으로 캐스팅 하지 않더라도, 컴파일러가 알아서 캐스팅해주는 것을 말합니다. 이해를 돕기
hongku.tistory.com
p. 52
상호운용성
- 기존 라이브러리를 그대로 사용할 수 있는지 여부 → 코틀린은 가능
- API 활용, 상속, 인터페이스 구현, 자바 애노테이션을 코틀린 코드에 적용
- 기존 자바 라이브러리를 가능하면 최대한 활용한다.
- 코틀린 자체 컬렉션 라이브러리를 제공하지 않는다.
- 코틀린은 자바 표준 라이브러리에 의존한다.
- 코틀린이 제공하는 도구도 다중 언어 프로젝트를 완전히 지원한다.
- 자바와 코틀린 소스 파일이 임의로 섞여 있어도 제대로 프로그램을 컴파일할 수 있다.
- 각 소스 파일 사이의 의존관계가 어떤 식으로 이뤄졌든 관계없이 컴파일할 수 있다.
- IDE 기능도 언어와 관계없이 제대로 동작한다.
p. 53
코틀린 도구 사용
- 자바와 마찬가지로 코틀린도 컴파일 언어다.
- 코틀린 코드를 실행하기 전에 먼저 코드를 컴파일해야 한다.
코틀린 코드 컴파일
- 코틀린 소스코드를 저장할 때는 보통. kt라는 확장자를 파일에 붙인다.
- 코틀린 컴파일러는 코틀린 소스코드를 분석해서 . class라는 파일을 만들어낸다.
- .class 파일은 개발 중인 애플리케이션의 유형에 맞는 표준 패키징 과정을 실행될 수 있다.
- 컴파일 : kotlinc <소스파일 또는 디렉터리> -include-runtime -d <jar 이름>
- 실행 : java -jar <jar 이름>
코틀린 빌드 과정
코틀린 빌드 과정 - 코틀린 컴파일러로 컴파일한 코드는 런타임 라이브러리(kotlin runtime library)에 의존한다.
- 런타임 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API의 기능을 확장한 내용이 들어 있다.
- 코틀린으로 컴파일한 애플리케이션을 배포할 때는 런타임 라이브러리도 함께 배표해야 한다.
- 실제 프로젝트를 컴파일하기 위해서는 메이븐, 그레이들, 앤트 등의 빌드 시스템을 사용할 것이고, 코틀린은 이러한 빌드 시스템과 호환된다.
- 빌드 시스템은 혼합 언어 프로젝트를 지원할 수 있다.
- 메이븐과 그레이들은 애플리케이션을 패키지 할 때 알아서 코틀린 런타임을 포함시켜준다.
자바 대신 코틀린 사용 이유
생산성(간결성) 향상
보일러플레이트 코드를 줄여준다. 보일러 플레이트 코드란 최소한의 변경으로 여러 곳에서 재사용되며, 반복적으로 비슷한 형태를 띠는 코드이다. 코틀린은 묵시적으로 보일러 플레이트 코드가 제공하기 때문에 getter, setter, hashcode(), equals(), 기본 생성자(default constructor) 자동생성 된다. 또한 컴파일러가 문맥을 고려해 변수 타입을 결정하는 타입 추론을 통해 생산성(간결성)이 향상된다.
보일러플레이트 코드란?(Boilerplate code)
보일러플레이트란?
charlezz.medium.com
안정성 향상
널이 될 수 있는 타입을 지원한다. 엘비스 연산자를 통해 컴파일 시점에 널 포인터 예외가 발생할 수 있는지 여부를 검사하므로써 안전성을 높일 수 있다. 또한 스마트 캐스트를 해줌으로써 안전성을 향상할 수 있다. 스마트 캐스트란 컴파일러가 캐스팅을 대신해주는 것으로 is라는 키워드는 검사를 한 뒤에 자동으로 캐스팅까지 해주는 역할을 한다.
스마트 캐스트 https://hongku.tistory.com/352
코틀린의 is와 스마트 캐스트(Smart cast)란?
코틀린에는 스마트 캐스트(Smart cast)가 있습니다. 간단하게 설명하면, 프로그래머가 굳이 원하는 타입으로 캐스팅 하지 않더라도, 컴파일러가 알아서 캐스팅해주는 것을 말합니다. 이해를 돕기
hongku.tistory.com
'Kotlin' 카테고리의 다른 글
4장. 클래스, 객체, 인터페이스 - (1) 클래스 계층 정의 (0) 2022.02.24 3장. 함수 정의와 호출 - 2 (0) 2022.02.23 3장. 함수 정의와 호출 - 1 (0) 2022.02.22 2장. 코틀린 기초 - 클래스와 프로퍼티 (0) 2022.02.21 2장. 코틀린 기초 - 함수와 변수 (0) 2022.02.20