GDSC HUFS 3기/Android with Kotlin Team 4

[4팀] Section 7 - (2) : Kotlin - Object Oriented Programming

devDonghyun 2021. 10. 5. 16:52

이 글은 udemy 강의를 참고하여 작성하였습니다.

작성자 : 안동현

개발환경은 Windows, Android Studio입니다. 

 

🥰 Section 7 - (1) : Kotlin - Object Oriented Programming : https://gdschufs.tistory.com/20

 

[4팀] Section 7 - (1) : Kotlin - Object Oriented Programming

이 글은 udemy 강의를 참고하여 작성하였습니다. 작성자 : 안동현 개발환경은 Windows, Android Studio입니다. 1. Kotlin의 함수  fun 키워드를 사용하여 함수를 선언하며, 괄호() 안에는 함수의 매개 변수를

gdschufs.tistory.com

 

 

1. Kotlin의 접근 제한자 : Visibility Modifier


 접근 제한자클래스의 멤버외부의 어느 범위까지 이용하게 할 것인지를 결정하는 키워드입니다.

 

접근 제한자 최상위에서 이용 클래스 멤버에서 이용
public 모든 파일에서 가능 모든 클래스에서 가능
internal 같은 모듈 내에서 가능 같은 모듈 내에서 가능
protected 사용 불가 상속 관계의 하위 클래스에서만 가능
private 파일 내부에서만 이용 클래스 내부에서만 이용
open class Super {    // open : 뒷 내용에서 설명
	var publicNum = 10
	protected var protectedData = 20
	private var privateData = 30
}

class Sub: Super() {
	fun increaseNum () {
	publicNum++     // Success!
	protectedNum++  // Success!
	privateNum++    // Error!
	}
}

fun main() {
	val obj = Super()  // Success!
	obj.protectedNum++ // Error! 
	obj.privateNum++   // Error!
}

 

2. Kotlin Constructor : Primary & Secondary


 Kotlin의 클래스는 생성자를 주 생성자(Primary Constructor)보조 생성자(Secondary Constructor)로 구분합니다.

한 클래스 안에 주 생성자만 선언할 수도 있고, 보조 생성자만 선언할 수도 있습니다.

물론 둘 다 선언할 수도 있죠.

 

* 주 생성자 : Primary Constructor 

// 주 생성자 선언

class CustomClass constructor() {
}

 주 생성자constructor 키워드로 클래스 선언부에 선언합니다.

주 생성자 선언은 필수는 아니며, 한 클래스에 하나만 가능합니다.

 

주 생성자를 선언할 때, constructor 키워드는 생략할 수 있습니다.

// constructor 키워드 생략 예

class CustomClass() {
}

 

 만약 개발자가 클래스의 주 생성자를 선언하지 않으면,

컴파일러가 매개변수가 없는 주 생성자를 자동으로 추가합니다.

// 매개변수가 없는 주 생성자 자동 선언

class CustomClass {
}

 

주 생성자를 선언할 때 필요에 따라 매개변수를 선언할 수도 있습니다.

// 주 생성자의 매개변수

class CustomClass(name: String, age: Int) {
}

 

* 보조 생성자 : Secondary Constructor

 

 보조 생성자클래스의 본문constructor 키워드로 선언하는 함수입니다.

클래스 본문에 선언하므로 여러 개를 추가할 수 있는 것입니다.

 

// 보조 생성자

class Person {
	constructor(name: String) {
    	println("constructor(name: String) call...")
    }
    constructor(name: String, age: Int) {
    	println("constructor(name: String, age: Int) call...")
    }
}

fun main() {
	val person1 = Person("An")
	val person2 = Person("An", 22)
}

 

 

 Kotlin에서 클래스를 선언할 때 주 생성자와 보조 생성자 중 하나만 선언하면 문제가 없지만,

만약 주 생성자와 보조 생성자를 모두 선언한다면 반드시 생성자끼리 연결해주어야 합니다.

 

 보조 생성자는 객체를 생성할 때 호출되며,

이때 클래스 내에 주 생성자가 있다면 this() 구문을 이용해,

주 생성자를 호출해야 합니다.

 

// 보조 생성자 사용할 때 주 생성자 불러오기

class Person(name: String) {
	constructor(name: String, age: Int): this(name) {
    // ...
    }
 }
 
 fun main() {
 	val person = Person("An", 22)
}

 

 

 주 생성자가 있는 상태에서 보조 생성자를 여러 개 선언한다면,

보조 생성자에서 this()로 다른 보조 생성자를 호출할 수도 있습니다. 

 

그런데, 이때에도 보조 생성자로 객체를 생성한다면 어떤 식으로든 주 생성자가 호출되게 해야 합니다.

 

// 여러 개의 보조 생성자

class Person(name: String) {
	constructor(name: String, age: Int): this(name) {
    // ...
    }
    constructor(name: String, age: Int, email: String): this(name, age) {
    // ...
    }
 }
 
 fun main() {
 	val person = Person("An", 22, "donghyun@.com")
}

 

 

3. Kotlin Inheritance


클래스를 선언할 때 다른 클래스를 참조해서 선언하는 것을 상속 : Inheritance라고 합니다.

open class Super {   // 상속할 수 있게 open 키워드 이용
}
class Sub: Super() { // Super를 상속받아 Sub 클래스 선언
}
상위 클래스 : 상속 대상이 되는 클래스
하위 클래스 : 상속받는 클래스

 

 Kotlin의 클래스는 기본적으로 다른 클래스가 상속할 수 없게 되어 있으므로,

상속할 수 있게 선언하려면 open 키워드를 사용합니다.


* 재정의 : Override

 

상속이 주는 최고 이점은 상위 클래스에 정의된 멤버(변수, 함수)를

하위 클래스에서 자신의 멤버처럼 사용할 수 있다는 것입니다.

 

// Override 예제

open class Super {
	open var data = 10
    open fun customFunc() {
    	println("I'm Super Class function : $data")
    }
}

class Sub: Super() {
	override var data = 20
    override fun customFunc() {
    	println("I'm Sub Class function : $data")
    }
}

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


// 실행 결과는?


// I'm Sub Class function : 20

 

 

4. Kotlin Polymorphism and Abstraction


* 같은 모양의 코드가 다른 기능을 하도록 만들 수 있는 특징 (Override 등)

 

 

* Overloading vs Overriding

  Overloading이름은 같은 method지만, 매개변수 등을 다르게 해서 계속해서 재정의해서 사용하는 것을 말합니다.

 

* 추상 클래스 : Abstract Class

 

구현할 필요가 없거나, 아직 구현할 수 없기에 선언만 된 추상 method로 이루어진 클래스입니다.

 

 추상 클래스는 아직 method가 구현되어있지 않기 때문에 객체 생성을 할 수 없습니다.

따라서, 반드시 상속을 받는 자식 클래스를 필요로 합니다.

 

 추상 클래스는 abstract 키워드와 함께 선언부만 작성합니다.

// 추상 클래스 선언

open abstract class AbstractClass {
    open abstract fun abstractMethod()
}
 
class Sub : AbstractClass() {
    override fun abstractMethod() {
        println("implement abstract method here!")
    }

😀 추상 method는 자식 클래스에서 override 해서 사용할 수 있습니다.