티스토리 뷰

클래스

  • 클래스 선언 및 인스턴스 생성
//클래스 선언
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
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함