728x90
반응형
✅ 기본 요소 : 함수와 변수
📌 코틀린의 함수
코틀린에서는 함수 하나로 프로그램을 만들 수 있음
fun main(args: Array<String>) {
println("Hello, World!")
}
- 코틀린 프로그래밍에서는 함수를 선얼할 때 fun 키워드를 사용
- 파라미터 이름 뒤에 해당 파라미터의 타입을 작성
- 함수를 최상위 수준에 정의할 수 있음(자바와 다르게 클래스 안에 함수를 넣어야 할 필요가 없음)
- 배열도 일반적인 클래스와 마찬가지(배열 처리를 위한 문법이 따로 존재하지 않음)
- Sysem.out.println 대신 prinln으로 해결(함수를 간결하게 사용할 수 있는 래퍼를 제공하기 때문)
- 세미콜론을 붙이지 않아도 됨🥹
// 함수 선언 기본(블록이 본문인 함수)
fun max(a: Int, b: Int) : Int {
return if(a>b) a else b
}
// 식이 본문인 함수
fun max(a: Int, b: Int) : Int = if(a>b) a else b
- 코틀린에서는 함수를 선언하는 방식이 2가지
- 하나는 일반적인 함수 선언 방식인 블록이 본문인 함수이고, 또 하나는 등호를 활용한 식이 본문인 함수
- 코틀린에서는 식이 본문인 함수가 자주 쓰임
- 또한 식이 본문인 함수에서는 반환타임을 생략하여 더 간략하게 만들 수 있음
📌 코틀린의 변수
- 자바에서는 변수를 선언할 때 타입이 맨 앞에 오지만 코틀린에서는 타입 지정을 생략하는 경우가 흔함
- 하지만 변수 이름 뒤에 타입을 명시하여 사용할 수 있음
val question = "dahoon" // question의 타입이 String으로 초기화
val answer = 42 // answer의 타입이 Int로 초기화
📌 변경 가능한 변수와 변경 불가능한 변수
- val
- 값을 뜻하는 value에서 따옴
- 변경 불가능한(immutable) 참조를 저장하는 변수
- val로 선언된 변수는 다시 초기화하는 것이 불가능하며 자바의 final 변수에 해당
- var
- 변수를 뜻하는 variable에서 따옴
- 변경 가능한(mutable) 참조를 저장하는 변수
- 변수의 값은 바뀔 수 있으며 자바의 일반 변수에 해당
- val 변수는 블록을 실행할 때 정확히 한 번만 초기화해야 함
- 하지만 어떤 블록이 실행될 때 오직 한 초기화 문장을 실행됨을 컴파일러가 확인할 수 있다면 조건에 따라 val 값을 다른 여러 값으로 초기화할 수 있음(아래 코드 예시)
val message : String
if (canPerformOperation()) {
message = "Success"
// ..연산 수행
}
else {
message = "Failed"
}
- val 참조 자체는 불변이어도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있음
val language = arrayListOf("Java") // 불변 참조 선언
languages.add("Kotlin") // 참조가 가리키는 객체 내부를 변경
- var 키워드를 사용하면 변수의 값을 변경할 수 있지만 변수의 타입은 고정되어 다른 타입으로의 변환은 불가
var answer = 42
answer = "no answer" // Error : type mismatch -> 컴파일 오류 발생
📌 문자열 템플릿
// 문자열 템플릿 사용 예제
fun main(args: array<String>) {
val name = if (args.size > 0) args[0] else "Kotlin" // 인자가 넘어갔을 때 조건 판별 후
println("Hello, $name!") // 인자가 없으면 Kotlin 출력
}
// 복잡한 식인 경우에 {}로 둘러싸서 문자열 템플릿 안에 넣을 수 있음
fun main(args: Array<String>) {
if(args.size > 0) {
println("Hello, ${args[0]}!") // args 배열의 첫 번째 원소를 넣기 위해 ${}로 구분
}
}
// 중괄호로 둘러싼 식 안에서 큰 따옴표를 사용할 수도 있음
fun main(args: Array<String>) {
println("Hello, ${if (args.size > 0) args[0] else "someone"}!")
}
- 다른 프로그래밍 언어와 마찬가지로 변수를 문자열 안에 사용할 수 있음
- 문자열 리터럴의 필요한 곳에 변수를 넣되 변수 앞에 $를 추가해야 함
✅ 클래스와 프로퍼티
// 자바 Person 클래스
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
// 코틀린으로 변환한 Person 클래스
class Person(val name: String)
- 코틀린에서와 같은 유형의 클래스(코드가 없이 데이터만 저장하는 클래스)를 값 객체라 부름
- 코틀린의 기본 가시성 변경자는 public으로 이런 경우 변경자를 생략함
📌 프로퍼티
- 클래스라는 개념의 목적은 데이터를 캡슐화하고 캡슐화한 데이터를 다루는 코드를 한 주체 아래 가두는 것
- 자바에서는 데이터를 필드에 저장하며, 멤버 필드의 가시성은 보통 private
- 클래스는 자신을 사용하는 클라이언트가 그 데이터에 접근하는 통로로 쓸 수 있는 접근자 메서드를 제공
- 보통은 필드를 읽기 위한 Getter를 제공하고 필드를 변경하게 허용해야 할 경우 Setter를 추가 제공할 수 있음
- 자바에서는 필드와 접근자를 한데 묶어 프로퍼티라고 부름
- 코틀린은 프로퍼티를 언어 기본 기능으로 제공하며, 코틀린 프로퍼티는 자바의 필드와 접근자 메서드를 완전히 대신함
- 변수를 선언하는 방법과 마찬가지로 val이나 var를 사용
- val로 선언한 프로퍼티는 읽기 전용
- var로 선언한 프로퍼티는 변경 가능
// 클래스 안에서 변경 가능한 프로퍼티 선언하기
class Person {
val name: String, // 읽기 전용 프로퍼티로, 코틀린은 (비공개) 필드와 필드를 읽는 단순한(공개) 게터를 만들어냄
var isMarried: Boolean // 쓸 수 있는 프로퍼티로, 코틀린은(비공개) 필드, (공개) 게터, (공개) 세터를 만들어냄
}
- 기본적으로 코틀린에서 프로퍼티를 선언하는 방식은 프로퍼티와 관련 있는 접근자를 선언하는 것
- 읽기 전용 프로퍼티의 경우 게터만 선언하며 변경할 수 있는 프로퍼티의 경우 게터와 세터를 모두 선언
- 코틀린은 값을 저장하기 위한 비공개 필드와 그 필드에 값을 저장하기 위한 세터, 필드의 값을 읽기 위한 게터로 이뤄진 간단한 디폴트 접근자 구현을 제공함
// 자바에서 Person 클래스를 사용하는 방법
Person person = new Person("Bob", true);
System.out.println(person.getName());
System.out.println(person.isMarried());
// 코틀린에서 Person 클래스를 사용하는 방법
val person = Person("Bob", true) // new 키워드를 사용하지 않고 생성자를 호출
println(person.name) // 프로퍼티 이름을 직접 사용해도
println(person.isMarried) // 코틀린이 자동으로 게터를 호출해줌
📌 커스텀 접근자
// 커스텀 접근자 예시 코드
class Rectangle(val height: Int, val width: Int) {
val isSquare: Boolean
get() {
return height == width
}
}
- 위 프로퍼티에는 자체 구현을 제공하는 게터만 존재
- 클라이언트가 프로퍼티에 접근할 때마다 게터가 프로퍼티 값을 매번 다시 계산
- 일반적으로 클래스의 특성을 정의하고 싶은 경우 사용하여 가독성을 높일 수 있음
728x90
반응형
'Studying > Kotlin' 카테고리의 다른 글
[Kotlin In Action] 3장. 함수 정의와 호출(1) - 컬렉션과 함수 만들기 (0) | 2023.05.02 |
---|---|
[Kotlin In Action] 2장. 코틀린 기초(4) - 코틀린의 예외 처리 (0) | 2023.04.24 |
[Kotlin In Action] 2장. 코틀린 기초(3) - while과 for 루프 (0) | 2023.04.24 |
[Kotlin In Action] 2장. 코틀린 기초(2) - enum과 when (0) | 2023.04.24 |
[Kotlin In Action] 1장. 코틀린이란 무엇이며, 왜 필요한가? (0) | 2023.04.17 |