티스토리 뷰
클래스
- 클래스 선언 및 인스턴스 생성
//클래스 선언
class Person{
}
//인자가 없는 생성자로 인스턴스 생성
val yejin:Person = Person()
//인자가 1개인 생성자로 인스턴스 생성
val yejin:Person = Person(24)
인터페이스
- 구현부가 없는 추상 함수들은 상속받은 클래스에서 반드시 오버라이딩 -> 빈 중괄호도 구현부이므로 추상함수가 아니다‼️
- 초기화되지 않은 변수 역시 상속받은 클래스에서 반드시 재정의
- 인터페이스 내에서 함수 구현 가능
- 여러개의 인터페이스 다중 상속 가능
- 인터페이스 간의 상속도 가능
- object: [인터페이스 이름] 형태로 인스턴스 생성 -> 인스턴스에는 생성자가 없으므로 괄호를 쓰면 안된다‼️
//인터페이스 선언
interface Person{
fun work() //추상 함수
fun sleep(){} //추상 함수가 아님
}
//인스턴스 생성
val yejin = object: Person { //object: [인터페이스 이름] 형태로 선언
override work(){
//함수 구현
}
}
추상 클래스
- 클래스 앞에 abstract를 붙혀서 선언
- abstract가 붙은 함수들은 상속받은 클래스에서 반드시 오버라이딩
- 다중상속 불가
- object: [생성자] 형태로 인스턴스 생성
//추상 클래스 선언
abstract class Person{
abstract fun work() //추상 함수
fun sleep(){} //추상 함수가 아님
}
//추상 클래스의 인스턴스 생성
val yejin = object: Person(){
override fun work(){
//함수 구현
}
}
데이터 클래스
- class 앞에 data를 붙혀서 선언
- 중괄호{} 대신 소괄호() 사용
- 변수나 상수 선언만 가능하며 쉼표로 구분
- 객체화 후 일반 클래스와 같이 프로퍼티의 값 변경 가능
data class Person(
val name = "yejin",
var age = "24",
var adress = "Seoul"
)
object 클래스 (싱글톤)
- class 대신 object로 선언
- 생성자를 만들 수 없음 -> 객체화 불가
- 다른 클래스나 함수에서 객체화 없이 클래스이름으로 바로 접근 가능하여 데이터와 함수 호출 가능
- activity, fragment 구분 없이 데이터 전달 가능
object Person{
var name: String = ""
var age: Int = 0
var adress: String = ""
fun personInfo(){
println("$name 's age is $age. $name 's address is $adress")
}
}
fun main(args: Array<String>){
Person.name = "yejin" //object 클래스 이름으로 바로 접근하여 값 할당
Person.age = 24
Person.adress = "Seoul"
Person.personInfo() //object 클래스 이름으로 바로 접근하여 함수 호출
}
열거형 클래스 (enum class)
- [열거클래스.values()]으로 열거 클래스 배열 타입의 배열 변수에 모든 열거 값 할당 가능
- [열거클래스.name]으로 해당 열거값의 이름, [열거클래스.ordinal]로 해당 열거값의 순서를 가져옴
- 해당 열거형 클래스 타입 변수에 열거값을 넣어서 열거형에 있는 값 사용
enum class AndroidBuddy{
YEJIN, SIYEON, CHANYOUNG, YEWON
}
val andBuddy: Array<AndroidBuddy> = AndroidBuddy.values()
for(i in 0...andBuddy.size-1)
println(andBuddy[i].name) //AndroidBuddy 클래스의 모든 열거 값 출력
중첩 클래스
- 특정 클래스 간 종속 관계가 있는 경우 사용
- 기본이 정적 중첩 클래스, 비 정적 중첩 클래스 선언 시 inner 키워드 사용
class Outer{
class StaticNested{ //정적 중첩 클래스
}
inner class NonStaticNested{ //비 정적 중첩 클래스
}
}
//Outer클래스의 인스턴스 생성 없이 생성 가능
val staticInstance = Outer.StaticNested()
//Outer클래스의 인스턴스 생성 후 생성 가능
val nonStaticInstance = Outer().StaticNested()
프로퍼티
- 코틀린에서는 클래스 생성시 멤버변수와 getter/setter 함수 자동 생성
class Person(
val name: String //읽기 전용 프로퍼티, getName() 함수 생성
var isMarried: Boolean // 쓰기 가능 프로퍼티, isMarried()와 setMarried() 함수 생성
)
//프로퍼티 이름으로 바로 사용해도 자동으로 getter,setter 함수로 변환
val person1 = Person("yejin", false)
println(person1.name) //'yejin' 출력
person1.isMarried = true //isMarried의 값을 true로 수정
커스텀 접근자
- 특정 연산 수행 결과를 반환해야 한다면 접근자를 커스텀하여 사용 가능
class Rectangle(val height: Int, val width: Int) {
var weight: Int = 0
set(value) { //value는 set()함수 호출 시 인자로 들어오는 새로 할당될 값
field = value + 10 //field는 set 함수를 가지는 프로퍼티
}
get() = field - 10 //블럭없이 식으로 사용 가능
}
lateinit
- 프로퍼티 선언 시점이나 생성자 호출 시점에 값을 할당할 수 없는 경우 사용
- var 프로퍼티에서만 사용 가능 -> val 프로퍼티는 반드시 선언 시점에 값 할당
class Person {
val name: String? = null //val 프로퍼티는 항상 선언과 동시에 값 할당
lateinit var address: String? //lateinit 키워드로 값을 나중에 할당함을 명시
}
접근제한자
- public : 접근제한자를 명시하지 않으면 기본으로 public / 어디서든 사용 가능
- private : 클래스 내부에서만 사용 가능
- protected : 상속받은 클래스 내에서 사용 가능
- internal : 같은 모듈 내에서 사용 가능
기본 생성자
- C++,java와 달리 클래스 선언 부분에서 바로 클래스 이름 뒤에 괄호를 붙혀 만드는 것이 특징
//클래스의 기본 형태
class Person{
}
//인자가 없는 생성자
class Person(){
}
//인자가 1개인 생성자
class Person(name: String){
}
//인자가 2개인 생성자
class Person(name: String, age: Int){
}
생성자 할당
- 초기화 영역 init : 기본 생성자의 인자는 init영역 안에서 사용 가능
class Person(name: String){
var name: String = ""
init{
this.name = name //인자로 넘어온 name값을 위에 선언한 변수 name에 할당
}
}
- 기본 생성자에서 초기화 : 생성자의 인자이며 클래스 변수이기 때문에 init 영역 필요없이 클래스 내에서 바로 사용 가능
class Person(var name: String, var age: Int){ //생성자 영역에서 바로 변수로 선언
fun personInfo(){
println("$name 's age is $age")
}
}
부수 생성자 constructor
- 여러개의 생성자를 만들 때 'constructor'키워드 사용
- constructor는 기본 생성자가 아니기 때문에 괄호 안에 인자를 변수로 선언 불가
class Person{ //기본 생성자가 없는 클래스
constructor(name: String){}
constructor(name: String, age:Int){}
}
class Person(){ //() -> 인자가 없는 생성자
var name: String = ""
constructor(name: String): this(){ //this() -> 기본 생성자를 상속받아야 함
this.name = name
}
}
class Person(age: Int) { //age를 인자로 가지고 있는 생성자
var name: String = ""
constructor(age: Int, name: String): this(age){ //constructor가 기본 생성자의 인자 num을 가져야함
this.name = name
}
}
'Android' 카테고리의 다른 글
[kotlin] 코틀린을 코틀린답게 (라이브러리 - 조건 확인 함수,컬렉션 생성 함수) (0) | 2020.03.08 |
---|---|
[kotlin] 안드버디 스터디 정리 - 1 (0) | 2020.03.05 |
[kotlin] 코틀린을 코틀린답게 (함수,람다표현식) (0) | 2020.03.05 |
[kotlin] 코틀린을 코틀린답게 (함수,상속과 구현,this,companion object,제네릭,예외,null 연산자) (0) | 2020.03.04 |
[kotlin] 코틀린을 코틀린답게 (변수,배열,컬렉션) (0) | 2020.02.28 |