[앱 스쿨 2기 : Android] 4주차 2023.05.15 (Kotlin)

hxeyexn·2023년 5월 15일
0
post-thumbnail

📅 2023.05.15

📂Kotlin14_Inherite ~ 📂Kotlin20_Overriding

상속

클래스를 설계할 때 다른 클래스가 가지고 있는 부분을 물려 받는 것

부모 클래스

  • SuperClass
  • 상속을 하는 클래스
  • open 키워드 사용, 사용하지 않으면 Java 코드로 변경될 때 final 키워드 붙어 상속 불가

자식 클래스

  • SubClass
  • 상속을 받는 클래스
fun main() {
	val s1 = SubClass1()
    println("s1.subMember1 : ${s1.subMember1}")
   	s1.subMethod1()
    
    println("s1.superMember1 : ${s1.superMember1}")
    s1.superMethod1()
}

// 부모 클래스
open class SuperClass {
	var superMember1 = 100
    
    constructor() {
    	println("SuperClass의 기본 생성자")
    }
    
    fun superMethod1() {
    	println("SuperClass1의 메서드 입니다")
    }
}

// 자식 클래스
class SubClass1 : SuperClass() {
	val subMember1 = 200
    
    fun subMethod1() {
    	println("SubClass1의 메서드 입니다")
    }
}

부모 클래스에 기본 생성자가 없다면?

  • Kotlin은 자바 코드로 변경되어 자바 코드가 실행
  • 따라서 자바와 동일하게 클래스의 객체를 생성하면 부모 클래스의 기본 생성자(매개변수가 없는)가 자동 호출
  • 만약 부모 클래스에 기본생성자가 없다면 자식 클래스에서 명시적으로 호출해줘야 함
open class SuperClass2(var a1: Int)

class SubClass2 : SuperClass2 {
	// 부모의 생성자를 호출한다.
    constructor() : super(100) {
    	// 코드
     }
}

// 만약 생성자에 작성할 코드가 없다면..
class SubClass3 : SuperClass2(100)

📂Kotlin14_Inherite


패키지

kt 파일들을 폴더 별로 나누어 관리하는 개념

  • 파일이 많아지면 관리가 불편하고 배포가 힘듬
  • 특정 기준을 세워 파일을 폴더별로 나누어 관리하면 파일 관리가 용이

📂Kotlin16_PackageModule


모듈

패키지들을 모아 관리하는 개념

  • 패키지가 많아지면 관리하기가 어려워질 수 있음, 이 때 모듈로 묶어서 사용

📂Kotlin16_PackageModule


접근제한자

생략 시 public으로 설정되고 internal은 같은 모듈이라면 public가 동일

  • kotlin에서는 자바로 변경될 때 모든 멤버 변수가 전부 다 private 변수
  • kotlin에서 접근 제한자를 설정하면 Java로 변환될 때 setter/getter 생성에 대한 설정이 됨

class

  • private : 파일이 같을 경우에만 사용 가능
  • public : 패키지, 모듈이 달라도 사용 가능
  • protected : 클래스에 protected 설정 불가
  • internal : 패키지, 모듈이 다르면 사용 불가능

변수, 메서드

  • private : 모든 경우에 사용 불가능
  • public : 모든 경우에 사용 가능
  • protected : 상속 관계에서만 사용 가능, 패키지, 모듈이 달라도 사용 가능
  • internal : 모듈이 다르면 사용이 불가능

📂Kotlin17_AccessModifier


Property

캡슐화가 적용된 변수에 대해 메서드를 통해 값을 설정하거나 가져다 사용할 수 있도록 구성한 것

캡슐화

  • 변수의 직접적인 접근을 차단하여 외부에서 값을 변경하지 못하도록 막는 것

Property

  • 캡슐화가 적용된 변수는 외부에서 접근이 차단
  • 문법적으로 변수를 사용하는 것 처럼 작성
  • 실제로는 setter/getter 메서드를 사용하는 방식을 의미

Property 작성 방법

  • private 키워드를 변수에 설정하여 외부에서 접근하지 못하도록 막음
  • 외부에 공개하고자 하는 변수에 대해 setter와 getter를 지정

주 생성자 사용하기

  • 주 생성자의 매개 변수를 정의할 때 var, val를 지정하면 Property로 작성됨
  • 생성자의 매개변수로 선언된 변수들은 private 멤버로 정의
  • var : getter, setter 모두 작성됨
  • val : final 변수로 정의되고 getter만 제공됨
class TestClass1(var a1: Int, val a2: Int)

클래스의 멤버 변수

  • 클래스의 변수를 선언할 때 var와 val에 따라 Property가 작성됨
  • 클래스에 정의한 모든 변수는 private으로 정의됨
  • var : getter, setter 모두 작성됨
  • val : final 변수로 정의되고 getter만 작성됨
class TestClass2 {
	var v1 = 0
    val v2 = 0
    // getter/setter를 원하는 대로 만들고 싶다면? 아래처럼!
    var v3 = 0
    	get() {
        	// 코드
            return ~~
        }
        set() {
        	// 코드
        }
	val 4 = 0
    	get() {
        	// 코드
            return ~~
        }
}

📂Kotlin18_Property


지연 초기화

프로퍼티의 값을 나중에 셋팅할 때 지연 초기화를 사용

  • Kotlin은 변수를 선언할 때 값을 무조건 설정해야 함
  • 이를 지연 시키는 것을 지연 초기화

lateinit

  • var 프로퍼티에만 사용 가능
  • 변수를 정의할 때 값을 저장하지 않아도 됨
  • 기본 자료형(Int, Double 등)에서는 사용할 수 없음
lateinit var a1: String

lazy

  • val 프로퍼티에서 사용하는 키워드
  • val 프로퍼티에 저장할 값을 어떠한 처리를 통해서 구해야 할 때 사용
  • 나중에 프로퍼티의 값을 셋팅 해준다는 의미가 아닌 사용할 때 값을 초기화 한다는 의미를 가지고 있음
val a1: Int by lazy {
    val temp = 1 + 2 + 3 + 4 + 5
    temp
}

📂Kotlin19_LateInit


Overriding

부모 클래스가 가지고 있는 메서드를 자식 클래스에서 재정의하는 개념

  • 부모가 가지고 있는 메서드의 이름, 매개변수 형태 모두 동일해야함
  • 부모 클래스 타입 변수를 통해 overriding한 메서드를 호출할 경우 부모의 것이 아닌 자식의 것이 호출
  • 메서드 앞에 final 붙어있으면 overriding 불가, overriding이 가능하게 하기 위해서 open 키워드 사용
  • overriding하는 메서드는 override라는 키워드를 붙혀주도록 강제하고 있음
fun main() {
	val obj1 = SubClass()
    obj1.superMethod()

    val obj2: SuperClass = SubClass()
    obj2.superMethod()
}

open class SuperClass {
	var superA1 = 300
    
    open fun superMethod() {
    	println("SuperClass의 superMethod 입니다")
    }
} 

class SubClass : SuperClass() {
	override fun superMethod() {
        // 부모의 메서드 호출
        super.superMethod()
        println("SubClass의 superMethod 입니다")
    }
}

super

  • 메서드를 overriding한 경우 부모의 메서드를 호출하고자 한다면 super 키워드 사용
  • super는 상속관계에서 부모를 의미

객체를 생성하여 자기 타입 변수에 담을 때

  • 자식 클래스 타입이므로 자기 것과 부모 것 모두 사용 가능
fun main() {
	val obj1 = SubClass()
    
    println("obj1.subA1 : ${obj1.subA1}")
    println("obj1.superA1 : ${obj1.superA1}")
    obj1.subMethod()
    obj1.superMethod()
}

open class SuperClass {
    var superA1 = 100

    fun superMethod() {
        println("SuperClass의 superMethod 입니다")
    }
}

class SubClass : SuperClass() {
    var subA1 = 200

    fun subMethod() {
        println("SubClass의 subMethod 입니다")
    }
}

객체를 생성하여 부모 클래스 타입에 담을 때

  • 부모 클래스 타입이기에 부모 것만 사용 가능
fun main() {
	var obj2: SuperClass = SubClass()
    
    println("obj2.superA1 : ${obj2.superA1}")
    obj2.superMethod()
}

open class SuperClass {
    var superA1 = 100

    fun superMethod() {
        println("SuperClass의 superMethod 입니다")
    }
}

class SubClass : SuperClass() {
    var subA1 = 200

    fun subMethod() {
        println("SubClass의 subMethod 입니다")
    }
}

📂Kotlin20_Overriding


profile
Android Developer

0개의 댓글