Search
castle

객체지향(OOP)

  • 모든 class 기본적으로 capsulation
    • getter/setter, private 자동 변환
  • 객체간의 관계 : 집합관계, 사용관계, 상속관계
  • 멤버 변수(Member Variable) : class 내부에서 선언된 변수
    • 인스턴스 변수(Instance Variable) : 인스턴스과 함께 생성 및 종속되는 변수
    • 클래스 변수(Class Variable) : class에 종속되는 변수

기본 구조

  • 기본 public(java : private)
    • 내부적으로는 private 변수, public getter/settrer를 생성한다고 함
  • constructor : class variable
  • parameters : primary 생성 방식, 주생성자
    • 인스턴스 변수
    • val, var을 선언 → 인스턴스 변수
    • val 또는 var 없을 시 함수 parameter와 동일 - scope = properies, init
    • get(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 lazy
    • val 과 함께 사용
    • {}에 초기화 값 작성
    • 주생성자에서 사용 불가능
    • 반환되는 값의 타입 → {} 내의 초기화로 추론 가능 → 생략 가능
    • 선언 시에 초기화 코드를 작성하므로 별도의 초기화 불필요
    • 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()
}
left
right

C

Contents