본문 바로가기
학습 log (이론)/kotlin

Kotlin기초 '객체'

by abbear25 2019. 11. 3.
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        var tag:Int=1
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        var b = Benz(500,"super engine") //객체 생성
        b.upSpeed(50) //함수 호출
        
        //3.사용법
        var inter: BaseCarInter = if(tag==1)Benz(500, "super engine") else Hyundai()
        userInterface(inter)
        
        //7.사용법
        var kim = Owner("VIP", 10)
        var son = Owner(grade=1)
        son.extra="구매의사있음"
        //copy. kim 의 모든 정보를 가져온 다음에 특정 값만 변경하기에 유용함
        var uKim = kim.copy(grade = 9)
        //uKim 의 이름을 가져와 변수 var에 할당
        var (name) = uKim
        print(name)
        
        //8.사용법
        SingleTon.sMsg("")
    }
}

//1.추상화 클래스
abstract class base{
    abstract fun base()
}

//2.인터페이스 선언, 인터페이스는 기본 값이 open
interface BaseCarInter{
    fun upSpeed(){
    }
}

//3.특정 객체를 주입하여 해당 구현 함수가 실행되도록 하는 함수
fun userInterface(inter: BaseCarInter){
    inter.upSpeed()
}

//4.클래스만 선언
open class Hyundai: BaseCarInter{
    constructor()
}

//5.클래스 선언과 함께 생성자 선언, open: 상속 가능한 class, function 선언
open class BaseCar(var speed:Int, var engine: String){
    var maxSpeed:Int
    var setEngine: String=""
    var setSpeed:Int = 0
    //객체 생성과 함께 초기화하는 함수, Primary 생성자가 호출 된 후 실행되는 함수
    init{
        this.maxSpeed = speed
        this.setEngine = engine
    }
    //여러개의 init 사용가능
    init{
        bootEngine()
    }
    //클래스 선언 외에 생성자 필요시 선언, 하위 생성자에서는 val, var 사용 불가능
    constructor(speed: Int) : this(speed, "default engine"){ }

    fun bootEngine(){
        Log.e("TAG", "engine: $engine")
    }

    open fun upSpeed(speed: Int){
        this.setSpeed = speed
        Log.e("TAG", "maxSpeed: $maxSpeed , upSpeed: $setSpeed")
    }
}


//Benz를 생성하면서 받은 speed와 engine 정보를 BaseCar에 전달
class Benz(speed:Int, engine: String):BaseCar(speed, engine), BaseCarInter{
    //static 변수 선언
    companion object{
        var staticVar = "Benz"
        fun staticFun()= print("Benz")
    }
    override fun upSpeed(){
        super.upSpeed() //html등록 오류 방지용 태그
        super.upSpeed(speed) //html등록 오류 방지용 태그
    }

    override fun upSpeed(speed: Int) {
        super.upSpeed(speed) //html등록 오류 방지용 태그
    }
    //6.내부 클래스 선언
    inner class Option{}
}
//7.데이터 클래스
//data class Owner(var name:String="Watcher", val grade: Int=0)
data class Owner(var name:String="Watcher", val grade: Int=0){
    var extra: String="없음"
    operator fun plus (o:Owner){
        this.grade + o.grade
    }
}

//8.static 클래스 (싱글톤)
object SingleTon{
    var sMsg = {msg: String -> print(msg)}
    /*private static SingleTon single;
      public SingleTon getInstance(){
        if(single==null)single = new SingleTon();
        return single;
      }*/
}

클래스의 종류

data class

getter와 setter 자동생성

분리 선언 가능

 *ex) val (v1, v2) = Sum(10, 20)

toString(), hashCode, equals 자동 오버라이딩

 

sealed class

enum class의 확장형태로 클래스를 묶은 클래스

안드로이드 UI의 상태 관리를 통한 생산성 및 유지보수 용이성을 높이는 클래스

when을 이용하여 쉽게 사용가능

 *when 문법은 컴파일러가 예상하는 모든 경우의 수에 대한 처리를 하지 않으면 컴파일 불가능

  따라서 sealed클래스는 컴파일러가 when의 경우의 수를 예측가능 

 

추상화, 인터페이스 (대규모 프로젝트 수행에 효율을 높여주는 요소)

Abstract (부모와 자식의 상속)

  자식 클래스가 반드시 구현해야할 항목을 정의하는데 활용 (설계)

  생성자 필요, 단일상속

Interface (다형성)

  각 필요 함수를 정의하는데 활용 (사용자와 개발자 사이의 통로, 사용자는 인터페이스만 알고 실제 구현은 개발자가)

  생성자 불필요, 다중상속

 

생성자 종류

Primary Constructor

  Class 정의와 동시에 정의한 생성자 

Second Constructor

  값을 받아오는 역할만 수행

  Class 생성 이후의 모든 생성자

반응형

'학습 log (이론) > kotlin' 카테고리의 다른 글

Kotlin기초 '유용한 함수'  (0) 2019.11.10
Kotlin기초 '함수형 프로그래밍'  (0) 2019.11.06
Kotlin기초 'Exception 처리'  (0) 2019.10.27
Kotlin기초 'Collection'  (0) 2019.10.24
Kotlin기초 'label'  (0) 2019.10.21