객체지향(OOP)
- 모든 class 기본적으로 capsulation
- getter/setter, private 자동 변환
- 객체간의 관계 : 집합관계, 사용관계, 상속관계
- 멤버 변수(Member Variable) : class 내부에서 선언된 변수
- 인스턴스 변수(Instance Variable) : 인스턴스과 함께 생성 및 종속되는 변수
- 클래스 변수(Class Variable) : class에 종속되는 변수
기본 구조
- 기본 public(java : private)
- 내부적으로는 private 변수, public getter/settrer를 생성한다고 함
constructor: class variableparameters: primary 생성 방식, 주생성자- 인스턴스 변수
val,var을 선언 → 인스턴스 변수val또는var없을 시 함수 parameter와 동일 - scope = properies, initget(getter),set(setter) 자동 생성 - 일반 변수처럼 할당처럼 사용 가능
properties: secondary 생성 방식, 부생성자- constructor, overloading 방식
constructor: class variable- 멤버 변수 및 메소드의 경우 class scope을 가짐
this(self-reference variable, 자기 자신 참조 변수) 없이 접근 가능
class ClassName [constructor](parameters) {
// properties(member variable)
// init {...}
// method(member fun)
}
class Person(height: Int, val weight: Int=200) { // parameters, 생략 가능
val name: String = "Alice" // 프로퍼티 (멤버 변수)
private var age: Int = 20 // private 프로퍼티
protected val height = height // Person과 서브클래스에서만 접근 가능
fun introduce() {
println("My name is $name") // 클래스 내부 어디서든 접근 가능
println("I am $age years old") // private라서 외부에서는 접근 불가
}
}
init
- 생성 함수
- primary → init → secondary → constructor 순서로 초기화
open class Parent {
private val a = println("Parent.a - #4")
constructor(arg: Unit=println("Parent primary constructor default argument - #3")) {
println("Parent primary constructor - #7")
}
init {
println("Parent.init - #5")
}
private val b = println("Parent.b - #6")
}
class Child : Parent {
val a = println("Child.a - #8")
init {
println("Child.init 1 - #9")
}
constructor(arg: Unit=println("Child primary constructor default argument - #2")) : super() {
println("Child primary constructor - #12")
}
val b = println("Child.b - #10")
constructor(arg: Int, arg2:Unit= println("Child secondary constructor default argument - #1")): this() {
println("Child secondary constructor - #13")
}
init {
println("Child.init 2 - #11")
}
}
fun main() {
val child = Child(1)
}
>>>
Child secondary constructor default argument - #1
Child primary constructor default argument - #2
Parent primary constructor default argument - #3
Parent.a - #4
Parent.init - #5
Parent.b - #6
Parent primary constructor - #7
Child.a - #8
Child.init 1 - #9
Child.b - #10
Child.init 2 - #11
Child primary constructor - #12
Child secondary constructor - #13
Default Constructor
- 생성자를 작성하지 않은 경우로 매개변수 없는 주 생성자와 동일
지연 초기화
선언 사실을 compiler에게 명시
setter로 초기화하는 방식과 유사
init으로 초기화 시 instance 생성과 함께 초기화 가능
lateinit var variable: type
- mutable, 즉
var사용- null 허용X
- get(), set() 사용 불가능
- 주생성자에서 사용 불가능
- 할당 전에는 사용 불가
class Person(age: Int) {
lateinit var name: String
var age: Int = age
// name = "c" // error
fun process(_name: String) {
name = _name
name += "bc"
println("name : $name, age : $age")
}
}
fun main() {
var p = Person(age=1)
// println(p.name) // 초기화X, error
p.process("a") // name : abc, age : 1
}
by lazyval과 함께 사용{}에 초기화 값 작성- 주생성자에서 사용 불가능
- 반환되는 값의 타입 →
{}내의 초기화로 추론 가능 → 생략 가능 - 선언 시에 초기화 코드를 작성하므로 별도의 초기화 불필요
- instance 시에 초기화 실행X,
{}의 객체가 호출될 시 초기화 실행
val person: Person by lazy { Person() }
val person by lazy { Person() }
접근 지정자(Visibility Modifier), scope
| 지정자 | 같은 클래스 | 서브클래스 | 같은 모듈 | 외부 |
|---|---|---|---|---|
public |
✅ | ✅ | ✅ | ✅ |
private |
✅ | ❌ | ❌ | ❌ |
protected |
✅ | ✅ | ❌ | ❌ |
internal |
✅ | ✅ | ✅ | ❌ |
예제
import kotlin.random.Random
class Member(
val name: String,
var age: Int,
var telno: String,
) {
private val id = Random.nextInt(10000)
private lateinit var password: String
var address: String
init{
println("Welcom $name\n")
address = ""
}
constructor(name: String, age: Int, telno: String, address: String): this(name, age, telno) {
this.address = address
}
fun createPassword(_password: String) {
password = _password
}
fun getInfo() {
println("name : $name\nage : $age\ntelno : $telno\naddress : $address")
}
fun getSecretInfo() {
println("id : $id\npassword : $password")
}
}
fun main() {
var member = Member("Sam", 100, "010-1234-5432", "hawai")
member.createPassword("0000")
member.getInfo()
println()
member.getSecretInfo()
}
C
Contents
