728x90
🟦 1. 코틀린 기본 정리
🟧 1. 변수와 상수
- 변수 : var 키워드
- 상수 : val 키워드
→ 코틀린은 기본적으로 변수의 타입을 ‘형추론’ 하여 자료형 명시 없이도 알아서 추론할 수 있다.
🟧 2. 기본 자료형
→ 기본형 : 순수하게 값 저장하는 자료형
→ 참조형 : 객체를 참조하는 자료형
- 코틀린의 자료형은 모두 참조형이다. 즉, 모든 자료형이 ‘객체 형태’라고 생각하면 된다.
◾숫자 자료형
-
- 정수 자료형 : Byte, Short, Int, Long
-
- 실수 자료형 : Double, Float
◾문자 자료형
-
- 문자 자료형 : Char
-
- 문자열 자료형 : String
◾논리 자료형
- Boolean
◾배열 자료형
- Array
→ arrayOf() 함수로 배열 생성 O
🟧 3. 함수
- Unit형 = 자바의 void에 대응. 반환값 X. 생략O
- 다만, 반환값 있는 함수의 경우 반드시 반환형 명시해주어야 한다.
- 단일 표현식 함수 : 실행 코드가 표현식 하나로 구성된 함수
- → 단일 표현식 함수와 Unit형만 반환형 생략 O
//함수 기본 형태
fun 함수명(매개변수) : 반환형 {
//실행 코드
}
🟦 2. 제어문
- 코틀린은 직관적이고 간결한 제어문 제공
🟧 1. 범위 클래스
- 특정 범위 값들을 간편하게 표현 가능하도록 제공하는 클래스
- ex. IntRange. LongRange, CharRange
val numRange : IntRange = 1..5 //Int형 1~5 범위내의 값들을 numRange 범위 클래스에 담음
println(numRange.contains(3)) // numRange 가 갖는 범위 내에 3이 존재 O -> T 출력
println(numRange.contains(10) // numRange 가 갖는 벙위 내에 10 존재 X -> F 출력
🟧 2. for문
- in 연산자 : 범위 지정
- downTo 키워드 : 역순 지정
- step 키워드 : 간격 지정
//1) 순행 출력 -> 1, 2, 3, 4, 5
for(i in 1..5) {
println(i)
}
//2) 역순 출력 -> 5, 4, 3, 2, 1
for(i in 5 downTo 1) {
println(i)
}
//3) 간격 출력 -> 1, 3, 5, 7, 9
for(i in 1..10 step 2) {
println(i)
}
◾ 배열의 요소 출력
- withIndex() 함수 이용 → 배열 각 요소의 index값도 가져올 수 있다.
val studens = arrayOf("A", "B", "C", "D")
for (name in studens){
println(name)
}
//withIndex() 함수로 인덱스값, 요소값 동시에 들고오기
for( (index, name) in studens.withIndex() ) {
println("Index: ${index} Name: ${name)")
}
🟧 3. while 문/do while문
- 조건 참인 동안만 반복하는 제어문
🟧 4. if 문 / if-else문
-
- 명령문 : 어떤 동작 수행하는 문장
-
- 표현식: 하나의 값을 반환하는 문장
→ if문을 표현식에도 사용 가능하다.
val myAge = 40
val isAdult = if(myAge>30) true else false
println("성인여부= $isAdult")
🟧 5. when문
- 자바의 switch문이 코틀린에서는 제공X
when(weather) {
1 -> { }
2 -> { }
//변수값이 어떤 범위 내의 값인 경우 실행
in 15..26 -> { }
//변수값이 어떤 범위 내에 안들어가는 경우 실행
!in 15..27 -> { }
. . .
else -> { }
}
🟦 3. 컬렉션
- 자바의 여러 컬렉션 자료구조 : 리스트(List), 셋(Set) , 맵(Map)
- 코틀린은 이 컬렉션 자료구조 모두 사용 O
- 코틀린은 컬렉션 자료구조를 ‘읽기 전용’ + ‘읽기-쓰기’ 전용 2가지로 나눈다.
🟧 1. 리스트(List)
- 순서가 있는 자료구조
- 1) 읽기 전용 리스트 : listOf() 함수 사용
- 2) 읽기-쓰기 전용 리스트 : mutableListOf() 함수
-
- 리스트 속 요소값 존재 여부 확인 시 : contains() 함수 사용
🟧 2. 셋(Set)
- 순서가 없고, 내부 요소에 값 중복 X 자료구조
- 1) 읽기 전용 셋 : setOf() 함수 사용
- 2) 읽기-쓰기 전용 셋 : mutableSetOf() 함수 사용
🟧 3. 맵(Map)
- 키-값 자료구조
- 키는 중복X
- 1) 읽기 전용 맵 : mapOf() 함수
- 2) 읽기-쓰기 전용 맵: mutableMapOf() 함수
🟦 4. 클래스
- 클래스 : 객체 정의 설계도
🟧 클래스 생성자
- 생성자 : 객체 생성 시 항상 실행되는 특수 함수. 객체 초기화 목적
- 1) 주 생성자 : 클래스 이름 옆에 contructor(생략O) 존재하는 부분
class Person(name : String) { ... }
class Person constructor(name : String) { ... }
- 2) 보조 생성자 : 클래스 Body 내부에서 constructor 키워드로 만든 부분
- → 주생성자, 보조 생성자 모두 존재하는 경우,
- 반드시 보조 생성자에서는 this 키워드를 사용하여 주 생성자 호출해야 함
class Person(name: String){ //주 생성자
//보조 생성자
constructor(name: String, age: Int) : this(name) //주 생성자의 name 호출{
// 이 객체 생성 시 실행될 코드
}
}
- 3) 초기화 블록 : init{ }
- init{ } 안의 코드들은 객체 생성 시 가장 먼저 실행된다.
class Person(name:String) { //필드 val name : String //초기화 블록 init { if(name.isEmpth()){ throw IllegalArgumentException("이름 없다.") } this.name = name } }
🟧 클래스의 상속
- 코틀린에서 상속할 부모 클래스는 open 키워드 붙여야 한다.
- 부모 클래스의 메소드 상속될 메소드에 대해서도 open 키워드 붙여야 한다.
- open 메소드는 자식 클래스에서 override 재정의하여 함수 사용
- 자식 클래스에서 부모 클래스 생성자 호출 원하면 ‘명시적’ 호출 필요
//부모클래스
open class Flower {
//상속될 메소드
open fun waterFlower() { ... }
}
//자식클래스
class Rose : Flower() {
//재정의
override fun waterFlower() {
super.waterFloser() //부모의 메소드 먼저 실행
//추가부분
]
}
🟧 접근 제한자
◾ 접근 제한자 공개 범위
- public : 기본 접근 제한자. 모든 클래스에서 접근 O
- internal : 같은 모듈 내에서 접근 가능
→ ex. 한 프로젝트 내 의 같은 모듈 안에서는 접근 허용
- protected : 상속받은 클래스 내에서 접근 가능
- private : 동일 클래스 내에서만 접근 가능
🟧 컴패니언 객체 : companion 키워드
- 자바의 static 정적 키워드 역할
- 별도 객체 생성 없이도 바로 해당 객체 내부에 접근 가능한 객체 의미
🟧 싱글톤 객체 : object 키워드
- opject키워드로 생성된 객체는 여러 번 호출해도 하나의 객체를 재사용한다. 매번 새 객체 생성 X
🟧 추상 클래스 : abstract 키워드
- 추상 클래스 : 그 자체로는 객체 생성 X.
- 이를 상속하는 자식 클래스들이 내부에 정의해놓은 추상 메소드 재정의하여 구현한 뒤 사용하는 객체
- 내부 추상 메소드들에 대해서도 반드시 abstract 키워드 붙일 것
🟧 데이터 클래스 : data class
- 데이터 전달용 객체이다.
- 데이터 클래스의 주 생성자에는 반드시 val/var 프로퍼티 적어도 하나 이상 필수이다.
🟦 5. 인터페이스
🟧 인터페이스 정의
- interface 키워드 사용
- 인터페이스 한정. 내부 추상 메소드들의 abstract키워드는 생략 가능하다.
🟧 디폴트 메소드 (default)
- 특별한 키워드 없이 내부 실행문 존재하는 함수 = 자동 default 함수이다.
- 이후 이 인터페이스 구현 클래스에서 따로 override 없어도 자동 실행된다.
🟧 인터페이스의 구현
class 구현클래스 : 상위 인터페이스 {
}
🟧 다중 인터페이스 구현
- 하나의 클래스는 하나의 클래스만 상속 O. 즉, 다중 상속 지원X
- 단, 인터페이스는 여러 개 구현 O
🟧 클래스 상속과 인터페이스 구현
- 다중 상속은 불가능 하지만, 한 개의 클래스 + 여러 인터페이스 구현 가능O
🟦 6. Null 처리
- cf. 자바에서는 객체 반환할 함수가 반환할 객체 없을 경우 null을 반환했기 때문에
- Null 체크가 필요했다. 예외 발생하므로
- 코틀린은 기본적으로 객체 null을 허용하지 않는다.1) 기본 null 불허용
- 자료형 뒤에 ? 기호 붙이면 = 해당 변수 null 허용
- 2) 명시적 null 허용
- → 따라서 반드시 코틀린은 모든 객체들을 생성과 동시에 초기화해야 한다.
🟧 셰이프 콜 연산자 | ? 연산자
- 안전 호출 연산자라고도 한다.
- ? 연산자 사용하여 셰이프 콜 시, 해당 참조가 null이면 반환값도 null로 한다.
fun reverseName(name: String? ) : String? {
return name?.reversed() //만약 들어온 name값이 null이면 null 그대로 반환
}
🟧 엘비스 연산자 | ?: 연산자
- ? 연산자 사용하여 셰이프 콜 시, null 대신 기본값을 반환한다.
fun reverseName(name : String? ) : String? {
return name?.reversed() ?: "이름을 확인해주세요" //만약 name값 null이면 기본값 반환
}
🟧 확정 연산자 | !! 연산자
- “null 허용이라고 선언했지만, 이 변수는 절대 null 이 아니다” 를 표현함
fun reverseName(name : String?) : String { //반환 자료형에 ?없으므로 null 반환 불가능
return name!!.reversed() //반환값이 절대 null 아니다.를 표현
}
🟧 laze init 키워드, lazy 키워드
1) laze init 키워드 : var 변수의 늦은 초기화
2) lazy 키워드 : val 상수의 늦은 초기화
- lazy{ } : 최초 호출 시 lazy내부 코드 실행되면서 초기화된다.
val lazyBean : String by lazy {
// 늦은 초기화
}
🟦 7. 람다식
- 값처럼 사용할 수 있는 ‘익명 함수’
🟧 람다식 정의
- 변수 = (인수 자료형) → (반환형) = { 인수 → 실행코드 }
val squareNum : (Int) -> (Int) = {number -> number*number}
//호출 시 인수에 값 담아서 호출
println(squareNum(25) ) // 25* 25 실행 결과값이 출력될 것이다.
728x90
'App(앱)_관련 공부 모음 > [문법]_Kotlin(코틀린)' 카테고리의 다른 글
Android를 위한 Kotlin 문법 [최종편] (0) | 2022.05.07 |
---|---|
Android를 위한 Kotlin 문법 [심화편] (0) | 2022.05.07 |
Android를 위한 Kotlin 문법 [기본편 2] (0) | 2022.05.07 |
Android 를 위한 Kotlin문법 [기본편 1] (0) | 2022.05.07 |
2강. [코틀린 고급 문법] (0) | 2022.03.05 |