class User {
var str = "string" // 변수
constructor(name: String) { // 생성자
this.name = name
}
fun someFun() { // 함수
println("이름: $name")
}
class SomeClass {} //내부 클래스
}
new
키워드를 사용하지 않음val user = User("kim")
constructor
키워드 사용 -> 클래스 선언부에 선언constructor
키워드는 생략 가능init
키워드 사용- 객체를 생성할 때 자동 실행class User constructor(name: String, count: Int) { //생성자의 매개변수
init{ //본문
println("Hellow")
}
}
class User() {
} //constructor 키워드 생략
class User {
} //매개변수가 없는 주 생성자 자동 선언
var
, val
키워드로 매개변수를 선언하면 클래스의 멤버 변수가 됨class User(val name: Stirng, val count: Int) {
fun someFun() {
println("이름: $name, 횟수: $count") //Ok
}
}
fun main() {
val user = User("Kim", 10)
user.someFun()
}
constructor
키워드로 선언this()
구문 사용하여 주 생성자 호출/ 주 생성자의 매개 변수가 없다면 생략class User(name: String) {
constructor(name: String, count: Int): this(name) {
...
}
}
fun main() {
val user = User("kim", 10)
}
this() 구문으로 주 생성자를 먼저 호출하고 그 다음 보조 생성자인 constructor 실행
:(클래스 이름)
입력open
키워드 사용open class Super(name: String) {
}
class Sub(name: String): Super(name) {
}
open class Super(name: String) {
}
class Sub: Super {
constructor(name: String): Spuer(name) {
}
}
open
override
키워드를 각각 붙여주어야 함open class Super {
open var someData = 10
open fun someFun() {
println("hello $someData")
}
}
class Sub: Super() {
override var someData = 20
override fun someFun() {
println("world $someData")
}
}
fun main() {
val obj = Sub()
obj.someFun()
}
obj의 멤버변수 몇 개?
재정의를 하면 상위 클래스의 멤버 변수의 이름을 복사해서 새로운 멤버 변수를 만들기 때문에 Super의 someData, Sub의 someData로 총 2개 이다.접근 제한자
클래스의 멤버를 외부 어느 범위까지 이용 가능하게 할지 결정
접근 제한자 최상위에서 이용 클래스 멤버에서 이용 public 모든 파일에서 가능 모든 클래스에서 가능 internal 같은 모듈 내에서 가능 ex) app 파일 내에서(package와 유사) protected 사용 불가 상속 관계의 하위 클래스에서만 가능 private 파일 내부에서만 이용 클래스 내부에서만 이용
data
키워드로 선언VO 클래스는 ValueObject로 데이터의 묶음을 상수로 사용하는데 용이하다.
ex) 주소 -> 시, 구, 동
class NonDataClass(val name: String, val email: String, val age: Int) //
data class DataClass(val name: String, val email: String, val age: Int) // data 클래스
val non1 = NonDataCalss("Kim", "@.com", 10)
val non2 = NonDataCalss("Kim", "@.com", 10)
val data1 = NonDataCalss("Kim", "@.com", 10)
val data2 = NonDataCalss("Kim", "@.com", 10)
equals() 함수로 비교하면 true일까?
equals() 함수는 객체의 데이터(id)를 비교하는 함수로
data1과 data2는 데이터를 묶어 상수로 취급하기 때문에 자동으로 equals() 함수가 자동으로 재정의가 되어 들어간 데이터 값이 같으면 같은 객체로 보게된다.
따라서 data1과 data2는 true값이 나오지만 non1과 non2는 false가 나오게 된다.
equals() 함수는 클래스의 주 생성자 멤버 변수의 데이터만 대상으로 삼음. 또한 상수를 비교하는 것이기 때문에 선언할 때 var 키워드는 사용하지 않는다.
toString() 함수로 데이터 클래스 객체가 가지는 값을 확인할 수 있다.
object
키워드 사용val obj = object {
var data = 10
fun some() {
println("hi, $data")
}
}
fun main() {
obj.data = 20 //오류
obj.some() //오류
}
오류가 나는 이유?
객체의 클래스를 알 수 없기 때문에 최상위인 Any 클래스로 취급하며 data라는 변수나 some() 함수를 찾을 수 없기 때문이다.
그렇다면?
어떤 클래스인지 알려주는 상위 클래스가 필요
open class Super {
open var data = 10
open fun some() {
println("hi")
}
}//또는
interface class Super {
var data = 10
fun some() {
println("hi")
}
}
val obj = object: Super() {
override var data = 10
override fun some() {
println("hi, $data")
}
}
fun main() {
obj.data = 20 //오류
obj.some() //오류
}
클래스 이름
으로 접근할 때 사용companion
키워드 사용class someClass {
companion object {
var data = 10
fun some() {
println(data)
}
}
}
fun main() {
someClass.data = 30
someCalss.some()
}