- 줄 끝에 세미콜론을 부팅지 않아도 됨
- 예외 : enum 클래스 안에 메소드를 정의하는 경우 반드시 enum 상수 목록과 메소드 정의 사이에 세미콜론을 넣어야 함
2.1 기본 요소: 함수와 변수
변수
- 초기화 할 경우 타입 생략 가능
- 초기화 식을 사용하지 않고 변수를 선언할 경우 변수 타입을 반드시 명시해야 함
val
변경 불가능한 참조를 저장함
- 블록을 실행할 때 정확히 한 번만 초기화 되어야 함
- 어떤 블록이 실행될 때 오직 한 초기화 문장만 실행됨을 컴파일러가 확인할 수 있다면 조건에 따라 다른 여러 값으로 초기화 할 수 있음
- val message: String if (canPerformOperation()) { message = "Success" } else { message = "Failed" }
- val 참조 자체는 불변일지라도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있음
- val languages = arrayList("Java") languages.add("Kotlin")
var
변경 가능한 참조
- 변수의 값을 변경할 수 있지만 변수의 타입은 고정돼 바꿀 수 없음
- 바꿀 경우 "Error: type mismatch" 컴파일 오류 발생
함수
- 함수를 최상위 수준에 정의할 수 있음
- 블록이 본문인 함수 : 본문이 중괄호로 둘러싸인 함수
- 값을 반환한다면 반드시 반환 타입을 지정하고 return문을 반드시 사용해 반환값을 명시해야 함
- (if 나 while에서 블록에서 마지막 라인에 return을 명시하지 않아도 블록 전체의 결과가 되는 것과 차이가 있음)
- 식이 본문인 함수 : 등호와 식으로 이루어진 함수
- 반환 타입을 생략 할 수 있음
- 타입 추론 : 굳이 사용자가 반환 타입을 적지 않아도 컴파일러가 함수 본문 식을 분석해서 식의 결과 타입을 함수 변환 타입으로 정해줌
2.2 클래스와 프로퍼티
JavaBean 클래스 Person와 프로퍼티 name
/** Java */
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
/** Kotlin */
class Person(val name: String)
변경 가능한 프로퍼티
자바에서는 필드와 접근자를 한데 묶어 프로퍼티라고 부름
/** Kotlin */
class Person(
val name: String, // 읽기 전용 프로퍼티로 비공개 필드, 공개 getter가 만들어짐
var isMarried: Boolean // 비공개 필드, 공개 getter, 공개 setter가 만들어짐
}
사용하기
/** Java */
Person person = new Person("Bob", true);
person.getName();
person.isMarried();
person.setMarried(false);
/** Kotlin */
val person = Person("Bob", true)
person.name
person.isMarried
person.isMarried = false
2.3 선택 표현과 처리: enum과 when
when
- Java의 switch와 비슷
- when의 분기조건에 임의의 객체를 허용함
- Java의 switch는 분기 조건에 상수(enum 상수나 숫자 리터럴)만을 사용할 수 있음
스마트 캐스트
is로 어떤 변수가 원하는 타입인지 일단 검사하고 나면 실제로는 컴파일러가 캐스팅을 수행해주기 때문에 굳이 변수를 원하는 타입으로 캐스팅하지 않아도 마치 처음부터 그 변수가 원하는 타입으로 선언된 것 처럼 쓸 수 있음
if (e is Sum) {
return eval(e.right) + eval(e.left)
}
e가 Sum 객체일 경우 명시적 캐스팅 없이 Sum의 right, left를 사용할 수 있음
명시적 타입 캐스팅
val n = e as Num
2.4 대상을 이터레이션
for
for <아이템> in <원소들>
범위 range
두 값으로 이루어진 구간
보통 그 두 값은 정수 등의 숫자 타입의 값이며, .. 연산자로 시작 값과 끝 값을 연결해서 범위를 만들음
- 수열 progression
- 어떤 범위에 속한 값을 일정한 순서로 이터레이션 하는 경우
- A .. B : A부터 B까지 양 끝을 포함하는 구간
- A until B : A부터 B-1까지 포함함 A .. B-1
- A downTo B : A부터 역방향 수열을 만듦
- step C : 증가값 C의 수열에 대해 이터레이션 함
for (i in 100 downTo 1 step 2) {
}
100 부터 1까지 2 씩 내려감 => 100, 98, 96, ... 2
2.5 코틀린의 예외 처리
if (percentage !in 0..100) {
throw IllegalArgumentException(
"A percentage value must be between 0 and 100: ${percentage}")
}
- new를 붙일 필요가 없음
- 자바와 달리 코틀린의 throw는 식이므로 다른 식에 포함될 수 있음
- val percentage = if (number in 0..100) number else throw IllegalArgumentException( "A percentage value must be between 0 and 100: ${percentage}")
try, catch, finally
- 코틀린에서는 함수가 던지는 예외를 지정하지 않고 발생한 예외를 잡아내도 되고 안잡아내도 됨
- 어떤 함수가 던질 가능성이 있거나 발생할 가능성이 있는 예외를 catch에서 처리해야 하며, 처리하지 않은 예외는 throws절에 명시해야함 (함수 선언 뒤에 throws IOException)
- 자바에서는 체크 예외를 명시적으로 처리해야 함
- try를 식으로 사용
- try의 분문을 반드시 중괄호로 둘러싸야 함
- try 블록 내부에 여러 문장이 있으면 마지막 식의 값이 전체 결과 값임
반응형
'reviews > Kotlin in Action' 카테고리의 다른 글
1. 코틀린이란 무엇이며, 왜 필요한가? (0) | 2022.01.07 |
---|