코틀린 객체지향 프로그래밍 - 클래스, 상속

두리두두·2024년 3월 2일

Android

목록 보기
2/25

클래스와 생성자

  • 클래스는 생성자로 생성. 주생성자와 보조생성자 존재
  • 둘 중 하나만 작성할 수도 있고 둘 다 작성할 수도 있다.

주생성자

  1. 작성
  • constructor 키워드로 작성. 클래스 선언부에 선언하며 필수는 아니다. - constructor 키워드 필수 아님. 개발자가 선언하지 않으면 컴파일러가 매개변수 없는 주생성자 자동으로 추가함.
class User constructor(){}
// 키워드 생략
class User(){{
// 개발자가 작성 안하면 자동으로 매개변수 없는 생성자 
class User{}
  1. init 영역
  • 주생성작에는 {} 추가 불가! 주생성자는 클래스 선언부에 있기 때문.
  • 주생성자 본문 작성하고 싶다면 init 키워드 사용
  • init 키워드로 지정한 영역은 객체를 생성할 때 자동으로 실행. 필수는 아님.
  • 보조생성자로 객체 생성할 때도 실행됨. 그러나 보조 생성자는 클래스 안에 선언하므로 {}를 이용해 본문 지정할 수 있으므로 주로 주생성자 본문 구현하는데에 쓰임.
class User(name: String, count: Int){
	init {
    	println("i am init..")
    }
}

fun main(){
	val user = User("du", 23)
}

/// 실행결과 : i am init..
  1. 매개변수
  • 기본
  • 생성자 매개변수를 클래스 멤버변수로 선언하는 방법
    => 생성자의 매개변수는 기본적으로 생성자에서만 사용할 수 있는 지역 변수임!!
class User(name : String, count: Int) {
	init{
    	println("name:$name", count:$count") //성공!!
    }
    
    fun someFun(){
        println("user is $name, her age is $count years old.")} // 실패!! 매개변수는 init에서만 사용가능함

}

fun main(){
    val user = User("duridudu", 23)
    user.someFun()
}
  • 그럼 어쩌라고?!
    방법1) init 영역에서 매개변숫값을 클래스 멤버변수에 대입
class User(name : String, count: Int) {
	// 클래스 멤버변수 선언!!!
	var name:String
    var count:Int
    
	init{
    	this.name = name
        this.count = count
    }
    
    fun someFun(){
        println("user is $name, her age is $count years old.")} // 

}

fun main(){
    val user = User("duridudu", 23)
    user.someFun()
}

방법2) 주생성자 매개변수를 var이나 val 키워드로 선언하면 클래스의 멤버변수가 됨;; << 훨씬 간편!

class User(val name : String, val count: Int) {
    fun someFun(){
        println("user is $name, her age is $count years old.")}

}

fun main(){
    val user = User("duridudu", 23)
    user.someFun()
}
  • 원래 매개변수 선언할 때 var, val 키워드 못 씀. only 주생성자에서만 가능!!

보조 생성자

  1. 작성
  • 클래스 본문에 constuctor 키워드로 선언
  • 여러개 추가 가능
  • 객체 생성할 때 자동으로 호출
class User {
    constructor(name:String){
        println("constructor1 call...")
    }

    constructor(name:String, count:Int){
        println("constructor2 calls/,,,")
    }


}

fun main(){
    val user = User("duridudu", 23)
    val user2 = User("duridudu")
}
  1. 특이사항,,
  • 주생성자와 보조생성자 모두 선언한다면 반드시 생성자끼리 연결해주어야함!!
class User(name:String) { //<<< 오류!!!
    constructor(name:String){
        println("constructor1 call...")
    }
}
  • this() 구문으로 보조생성자에서 주생성자를 호출해야한다.
class User(name: String) {
    constructor(name:String, count:Int):this(name){
        println("constructor2 calls/,,,")
    }

}

fun main(){
    val user = User("duridudu", 23)
    val user2 = User("duridudu")
}
  • 보조생성자 여러개라면 .. this로 어떻게든 주생성자가 호출되어야한다고 하는데 잘 모르겠다. 다시 알아보기,,,

상속

상속과 생성자

  1. 작성
  • 상위 클래스는 open 키워드 사용
  • 하위 클래스는 상속할 클래스를 선언부에 :로 추가
  • 상위 클래스에 매개변수 있다면 하위 클래스에도 추가!
open class Super(name:String){
}

class Sub(name:String):Super(name){
}
  • 하위 클래스에 보조생성자만 있다면 보조생성자에서 상위클래스 호출할 수 있음!
open class Super(name:String){
}

class Sub:Super{
	constructor(name:String):super(name){}
}

재정의(Overriding)

  1. 작성
  • 상속받은 클래스에서 상위 클래스에 정의된 멤버(변수, 함수) 재정의
  • 상위 클래스에서 상속해줄 멤버엔 open 키워드, 하위 클래스에서 상속받아 쓸 멤버엔 override 키워드 붙여야함!
open class Super{
    open var someData = 10
    open fun someFun(){
        println("i am super class function : $someData")
    }
}

class Sub():Super(){
    override var someData= 20
    override fun someFun() {
        println("i am sub class function : $someData")
    }
}

fun main(){
    val obj = Sub()
    obj.someFun()
}

접근 제한자

  • 클래스 멤버를 외부 어느 범위까지 허용할지 결정하는 키워드
  1. public
  • 모~든 파일 가능, 모든 클래스에서 가능
  1. internal
  • 같은 모듈 내에서 가능, 같은 모듈 내에서 가능
  1. protected
  • 최상위 이용 불가, 상속 관계의 하위 클래스에서만 가능
  1. private
  • 파일 내부에서만 이용 가능, 클래스 내부에서만 이용 가능
open class Super{
    var publicData = 10
    protected var protectedData = 20
    private var privateData = 30
}

class Sub:Super(){
   fun subFun(){
       publicData++
       protectedData++ // 상속받았으니가 갠춘
       privateData++   // 같은 클래스 아니라 오류!!
   }
}

fun main(){
    val obj = Super()
    obj.publicData++
    obj.protectedData++  // 상속받은 하위 클래스 아니라 오류!!
    obj.privateData++    // 같은 클래스 아니라 오류!!
}
profile
야금야금 앱 개발자

0개의 댓글