Kotlin
Kotlin in Action - 2. 코틀린 기초
yswn1531
2024. 5. 15. 20:00
1. 함수와 변수
- Hello World
- fun 키워드, 파라미터 이름, 파라미터 타입 순으로 적는다.
- 자바와 달리 클래스 안에 함수가 있는 것이 아닌, 함수를 최상위 수준에 정의 할 수 있다.
- 배열도 일반적인 클래스와 마찬가지이다.
- 감싼 Wrapper 클래스를 제공해 여러가지 자바 표준 라이브러리를 간결하게 사용할 수 있다.
- 세미 콜론을 붙이지 않아도 된다.
- 함수
- 함수 이름, 파라미터 목록 : 반환 타입 { 함수 본문 }
- 문과 식
- 식(expression) : 값을 만들어 내며 다른 식의 하위 요소로 계산 참여 가능
- 문(statement) : 자신을 둘러싸고 있는 가장 안쪽 블록의 최상위 요소
- 자바와 달리 대입식과 비교식을 잘못 바꿔 써서 버그가 생기는 경우가 없다.
- 자바: = 대입 / == 비교 -> 대입, 비교 둘 다 boolean을 반환
- 코틀린 : = 대입 / === 비교 -> 대입 Unit , 비교 boolean 반환
- 반환 타입을 생략할 수 있는 이유
- 식이 본문인 함수의 경우 컴파일러가 결과를 함수 반환 타입으로 정해준다 -> 타입 추론
- 변수
- 변수의 타입도 컴파일러가 식을 분석해서 초기화 식의 타입을 변수 타입으로 지정
- 초기화 식을 사용하지 않으려면 타입을 적어야 한다.
- val : 변경 불가능한 변수 , 자바에서는 final
- var: 변경 가능한 변수
- 기본적으로 변경 불가능한 변수로 선언하고 꼭 필요한 경우에만 var로 변경
- 변경 불가능한 참조와 변경 불가능한 객체를 부수 효과가 없는 함수와 조합해서 사용하면 코드가 함수형 코드에 가까워진다.
- val은 참조 자체가 불변일지라도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있다.
- var 키워드는 변수의 타입은 바뀌지 않는다.
- 문자열 템플릿
- 문자열에서 '$'을 사용해 변수를 사용한다.
- 컴파일된 코드는 StringBuilder 사용하여 append 연산
2. 클래스와 프로퍼티
- property
- 클래스의 목적은 데이터를 캡슐화 하고 캡슐화한 데이터를 다루는 코드를 한 주체 아래 두는 것
- 자바에서는 필드와 접근자를 한데 묶어 property라고 한다.
- 코틀린에서는 자동으로 값을 저장하기 위한 비공개 필드 + getter를 만들어 준다.(var의 경우 setter 까지)
- 커스텀 접근자
class Rectangle(val height: Int, val width:Int){ val isSquare : Boolean get() { return height == width } }
- 디렉토리와 패키지
- 코틀린은 자바와 달리 여러 클래스를 한 파일에 넣을 수 있다
- 패키지 구조와 디렉토리 구조가 맞아 떨어질 필요가 없다.
- 하지만 자바와 같이 패키지별로 디렉터리를 구성하는 편이 마이그레이션 할 때 좋다.
3. 선택 표현과 처리: enum과 when
- enum 클래스 정의
- enum은 soft keyword라 class 앞에서는 특별한 의미를 지니지만 그 외에서는 이름에 사용가능하다.
- enum에서도 생성자와 property를 선언한다.
- when으로 enum 다루기
- 자바의 switch문에 해당하는 것이 when
- when도 값을 만들어 내는 식
- when.과 임의의 객체를 함께 사용
- when은 자바의 switch와 달리 조건에서 임의의 객체를 함께 사용할 수 있어 강력하다.
- 객체 사이를 매치할 때 동등성을 사용한다.
- when의 대상을 변수에 포획할 수 있다.
- 인자 없는 when 사용
- 인자가 없는 when식 사용시 조건이 불필요한 객체를 생성하는 경우를 막을 수 있다.
- 스마트 캐스트: 타입 검사와 타입 캐스트를 조합
- is 를 사용해 변수 타입을 검사한다. 자바에서 instanceOf와 비슷
- 코틀린에서는 is로 검사 후 원하는 타입으로 컴파일러가 캐스팅해준다. (스마트 캐스트)
- 원하는 타입으로 명시적 캐스팅 하려면 as 사용
- if를 when으로 변경
- 언제 if와 when을 사용해야 할까
- if와 when의 분기에서 블록 사용
- '블록의 마지막 식이 결과' 라는 규칙은 블록이 값을 만들어내야 하는 경우 항상 성립
4. 대상을 이터레이션: while과 for 루프
- while 루프
- while, do-while
- 수에 대한 이터레이션 : 범위와 수열
- 자바에 for 루프가 없다. 대신 범위를 사용 ex) 1..100
- 수열 : 어떤 범위에 속한 값을 일정한 순서로 이터레이션 하는 것
- downTo를 통해 역방향 , step을 통해 증가의 절댓값 단계 설정
- 맵에 대한 이터레이션
- ,, 연산자를 숫자 타입의 값 뿐아니라 문자 타입의 값도 가능
- withIndex()를 통해 인덱스와 함께 컬렉션을 이터레이션 가능
- in으로 컬렉션이나 범위의 원소 검사
- in 연산자를 사용해 어떤 값이 범위에 속해있는지 검사할 수 있다.
- 반대의 경우 !in
- Comparable 인터페이스를 구현한 클래스라면 범위를 만들어 낼 수 있다.
- 컬렉션에도 in 연산자 사용 가능
5. 코틀린의 예외 처리
throw 는 식이다.
val percentage =
if (number in 1..100)
number
else
throw IllegalArgumentException("A percentage value must be between 0 and 100: $number")
- try, catch, finally
- 자바와의 차이는 throw에 뒤에 s가 없다.
- 함수를 작성할 때 함수 선언 뒤에 체크 예외를 명시적으로 할 필요가 없다.
- 체크 예외와 언체크 예외를 구별하지 않는다.
- 체크 예외 : 외부 환경에 의해 발생하는 예외 / 파일 입출력 오류, 네트워크 연결 문제, 데이터베이스 접근 오류 등등
- 언체크 예외 : 프로그래밍 오류나 잘못된 입력값 등으로 인해 발생하는 예외 / NPE, IllegalArgumentException 등등
- try-with-resource를 use를 통해 같은 기능을 구현
- try를 식으로 사용
- if, when과 마찬가지로 식이다. 그래서 값을 변수에 대입할 수 있다.