반응형
Notice
Recent Posts
Recent Comments
Link
NOW OR NEVER
[Kotlin] Kotlin 기초 본문
반응형
Kotlin 기초
코틀린 문법, 특성
- 파라미터 이름 뒤 그 파라미터 타입 작성
- 여러가지 표준 자바 라이브러리 함수를 간결하게 사용할 수 있게 감싼 wrapper 제공 ex) Sysmtem.out.println -> println
- 자바와 다른 점
- 함수를 최상위 수준에 정의 가능 : 자바와 달리 클래스 안에 함수를 정의 할 필요 X
- 배열 처리를 위한 문법이 존재X
- 세미콜론을 붙이지 않아도 된다.
시작문(statement)과 식(expression)
- 식: 값을 만들어 내며 다른 식의 하위 요소로 계산에 참여 가능
- 문: 자신을 둘러싸고 있는 가장 안쪽 블록의 최상위 요소로 존재하며 아무런 값을 만들어내지 않는다
- 자바에서는 모든 제어구조가 문이며 코틀린에서는 루프를 제외한 대부분의 제어 구조가 식
- ex) 코틀린에서의 if는 식, 대입 문의 경우 자바에서는 식이며 코틀린에서는 문
함수
- 함수 선언은 fun 키워드로 시작
- 블록이 본문인 함수 : 블록이 본문인 함수본문이 중괄호로 둘러싸인 함수(인텔리J Tip: Convert to block body)
- fun 함수이름(파라미터 목록): 반환 타입 { 함수 본문 }
- 식이 본문인 함수: 등호와 식으로 이루어진 함수(인텔리J Tip: Convert to expression body), 등호를 식 앞에 붙이면 더 간결하게 함수 표현 가능
fun 함수이름(파라미터 목록): 반환 타입 = 함수 본문
변수
- 자바의 경우 변수 선언시 타입을 맨 앞에 작성, 하지만 코틀린의 경우 타입 지정 생략 가능
- 초기화 식을 사용하지 않고 변수 선언 시 변수 타입 반드시 명시: 변수에 저장될 값에 대해 아무런 정보가 없어 컴파일러가 타입 추론 불가능, 그래서 타입 이 경우 반드시 타입 지정
변경 가능(mutable)한 변수와 변경 불가능(immutable)한 변수
- val(value)
- 변경 불가능한 참조, 초기화 후 재대입 불가능, 자바에서의 final 변수에 해당
- 블록을 실행할 때 한번만 초기화 가능
- 객체 내부 값은 변경 가능 ex) list 등의 타입에서
- var(variable)
- 변경 가능한 참조, 자바에서의 일반 변수에 해당
- 변수 값 변경 가능 but 변수 타입은 고정으로 변경 불가능
타입 추론(Type Interface)
- 컴파일러가 타입을 분석해 프로그래머 대신 프로그램 구성 요소 타입을 정해주는 기능
- 식이 본문인 함수에서 반환 타입을 생략할 수 있는 이유: 사용자가 반환 타입을 적지 않아도 컴파일러가 함수 본문 식을 분석해서 식의 결과 타입을 함수 반환 타입으로 정해주기 때문
- 컴파일러는 변수 선언 시점의 초기화 식으로부터 변수의 타입을 추론하며 변수 선언 이후 변수 재대입이 이뤄질 경우 이미 추론한 변수 타입 염두에 두고 대입문 타입 검사
문자열 템플릿(String Template)
- 자바의 문자열 접합 연산("Hello"+name+"!")과 동일한 기능으로 효율적 그리고 그것보다 좀 더 간결
- $변수 이런 식으로 문자열과 사용하는 데 '$' 문자를 문자열에 넣고 싶으면 \을 사용해 '$'을 escape 시켜야 함
- unresolved reference error: 코틀린에서는 자바와 마찬 가지로 변수이름에 한글이 들어갈 수 있어 $로 변수 지정 시 변수명 바로 뒤에 한글을 붙여서 사용하면 코틀린 컴파일러가 영문자와 한글을 한꺼번에 식별자로 인식해 해당 오류가 발생할 수 있다. 그래서 변수이름을 {}로 감싸는 것을 추천
클래스(Class)와 프로퍼티(Property)
클래스(Class)
- 목적: 데이터를 캡슐화(encapsulate)하고 캡슐화한 데이터를 다루는 코드를 한 주체 아래 가두는 것
- 값 객체(value object) : 코드가 없이 데이터만 저장하는 클래스 ex) class Person(val name: String)
- 접근자 메서드(accessor method): 클래스가 자신을 사용하는 클라이언트에게 그 데이터에 접근하는 통로로 쓸 수 있게 제공하는 메서드
- 자바
- 데이터를 필드(field)에 저장
- 멤버 필드의 가시성은 보통 비공개(private)
- 코틀린의 기본 가시성은 public으로 변경자 생략 가능
프로퍼티(Property)
- 자바에서는 필드와 접근자를 묶어 프로퍼티라 부른다.
- 코틀린에서는 자바의 필드와 접근자 메서드를 완전히 대신 가능 : 비공개 필드, 세터(필드 값 저장). 게터(필드 값 읽기)로 이뤄진 디폴트 접근자 구현 제공
- 뒷받침 필드(backing field): 프로퍼티의 값을 저장하기 위한 필드
커스텀 접근자
class Rectangle(val height: Int, val width: Int) {
val isSquare: Boolean
get() {
return height == width
}
}
- 프로퍼티에 자체 값을 저장하는 필드가 필요 헚으며 자체 구현을 제공하는 게터가 존재. 클라이언트가 프로퍼티 접근 시 프로퍼티 값을 매번 계산
- 파라미터가 없는 함수 정의 방식과 커스텀 게터를 정의하는 방식의 구현이나 성능상 차이는 없고 가독성 차이만 존재.
디렉토리와 패키지
- 같은 패키지에 속해 있을 경우 다른 파일에서 정의한 선언이라도 직접 사용가능
- 다른 패키지에 정의한 선언 사용시 임포트를 통해 선언(임포트는 파일의 맨 앞 위치, import 키워드 사용)
- 자바와 달리 클래스 임포트와 함수 임포트에 차이 X, 모든 선언을 import 키워드로 가져올 수 있음
- 디렉토리 구조 차이
- 자바: 패키지의 구조와 일치하는 디렉터리 계층 구조를 만들고 클래스의 소스코드를 그 클래스가 속한 패키지와 같은 디렉토리에 위치시켜야 함
- 코틀린: 디스크상의 어느 디렉토리에 소스코드 파일을 위치 시키든 관계X
- 자바와 코틀린을 함께 사용하는 프로젝트에서는 자바 방식을 따르는 게 중요: 자바 클래스를 코틀린 클래스로 마이그레이션할 때 문제 발생 가능
선택 표현과 처리
enum
- 코틀린에서의 소프트 키워드(soft keyword)라 불림
- 단순히 값만 열거하는 것이 아닌 해당 클래스 안에 프로퍼티나 메서드 정의 가능
- enum 클래스 안에 메서드 정의 시 반드시 enum 상수 목록과 메서드 정의 사이에 세미콜론 삽입 필수
when
- 분기 조건이 같지 않으면 다음 분기 조건으로 넘어가며 모든 분기 식에서 만족하는 조건을 찾을 수 없다면 else 분기의 문장을 계산한다.
- 인자가 없는 when 식을 사용
- 불필요한 객체 생성 막을 수 있다. but 코드 가독성이 떨어지며 성능 향상을 위한 비용 감수가 발생할 수 있다.
- when에 아무 인자도 없으려면 각 분기의 조건이 boolean 결과를 계산하는 식이여야 함
스마트 캐스트
- 타입 검사와 타입 캐스트 조합
- 변수 타입 검사: 코틀린의 is == 자바의 instance Of
- 변수 타입 캐스팅 과정
- 자바: 변수의 타입을 instanceOfㅣ로 확인 후 그 타입에 속한 멤버에 접근하기 위해 명시적으로 변수 타입 캐스팅, 이런 멤버 접근 여러 번 수행해야 한다면 변수에 따른 캐스팅한 결과 저장 후 사용해야 함
- 코틀린의 스마트 캐스트(smart cast) : 프로그래머 대신 컴파일러가 캐스팅, 어떤 변수가 원하는 타입인지 일단 is로 검사 후 변수를 원하는 타입으로 캐스팅하지 않아도 처음부터 그 변수가 원하는 타입으로 선언된 것 처럼 사용 가능
- 클래스의 프로퍼티에 대해 스마트 캐스트 사용 시 해당 프로퍼티는 반드시 val이어야 하며 커스텀 접근자를 사용한 것이어도 안됨 : 해당 프로퍼티에 대한 접근이 항상 같은 값을 내놓는다고 확신 불가능 해서
- 명시적으로 타입 캐스팅 시 as 키워드 사용
이터레이션(iteration)
- 코틀린 특성 중 자바와 가장 비슷한 특성
- for 아이템 in 범위 형태로 많이 사용
- 범위
- 수열(progression): 어떤 범위에 속한 값을 일정한 순서로 이터레이션 하는 경우
- 시작값..끝값 : 시작값과 끝값을 포함한 범위 ex) 1..5 = 1,2,3,4,5
- 시작값 downTo 끝값: 역방향 수열 ex) 5 downTo 1 = 5,4,3,2,1
- step 숫자: 범위 뒤 붙여주면 범위의 증가 값의 절대값 변경 가능 ex) 5 downTo 1 step 2 = 5,3,1
- 시작값 until 끝값: 끝값을 포함하지 않는 반만 닫힌 범위(half-closed range, 반폐구간 또는 반개구간) ex) 1 until 5 = 1,2,3,4
- 구조 분해 구문
- 맵의 경우 키와 값을 동시에 이터레이션 할 수 있다 ex) for((key, value) in map){}
- 리스트의 경우 원소의 현재 인덱스를 유지하면서 컬렉션을 이터레이션 할 수 있다.ex) for((index, element) in list.withIndex){}
- in 연산자로 해당 값이 범위 안에 속하는 지 확인 가능
예외 처리
- 코틀린의 기본 예외 처리 구문은 자바와 비슷
- 자바와 다른 점
- 예외 인스턴스를 만들 때 new를 붙일 필요 x
- 자바와 달리 코틀린의 throw는 식이므로 다른 식에 포함 될 수 있다.
체크 예외(checked exception)
- 자바와의 가장 큰 차이: throws 절이 코드에 없다.
- 자바에서 함수 작성 시 함수 선언 뒤 throws IOException을 붙여야 하는 이유: IOException이 체크 예외이기 때문에
- 자바에서의 체크 예외
- 체크 예외 처리 강제
- 모두 명시적으로 처리
- 어떤 함수가 던질 가능성이 있는 예외나 그 함수가 호출한 다른 함수에서 발생할 수 있는 예외를 모두 catch 처리
- 처리하지 않는 예외는 throws 절에 명시
- 코틀린에서는 체크 예외와 언체크 예외(unchecked exception) 구별 x: 함수가 던지는 예외 지정하지 않고 발생한 예외 잡아내도 되고 안잡아내도 된다.
try
- 코틀린의 try 키워드는 식: try 값을 변수 대입 가능
- 내부에 여러 문장 있으면 마지막 식 값이 결과 값(catch도 마찬가지)
'Android > Kotlin' 카테고리의 다른 글
[Kotlin] 함수 정의와 호출 (1) | 2024.01.30 |
---|