본문 바로가기

차근차근 코틀린

차근차근 코틀린(7) - 설계

1) Package

: 클래스와 소스 파일을 관리하기 위한 디렉터리 구조의 저장공간

package MainDirectory.SubDirectory
class 클래스{
}

- 디렉터리가 계층구조로 만들어져 있으면 온점(.)으로 구분해서 각 디렉터리를 모두 나열해준다.

 

2) 추상화

- 설계 단계 : 클래스의 이름과 그 안에 포함될 기능들을 유추하여 메서드 이름으로 먼저 나열한다.

- 이 때 명확한 코드는 설계단계에서 메서드 블록 안에 직접 코드를 작성, 그렇지 않은 경우는 구현 단계에서 코드를 작성하도록 메서드 이름만 작성한다. → 이것을 추상화라고 하며 abstract 키워드를 사용해서 명시한다.

1
2
3
4
5
6
7
abstract class AnimalClass {
    abstract fun birth()
 
    fun run(animal : String){
       println("${animal} is running")
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class DogClass : AnimalClass(){
    val name : String = "모찌"
    val bithday : String = "9월 26일"
    override fun birth() {
        println("우리 ${name}는 ${bithday}에 태어났어")
    }
}
 
fun main(args: Array<String>){
 
   val dogClass = DogClass()
    dogClass.birth()
    dogClass.run(dogClass.name)
 
}
cs

→ 추상 클래스는 독립적으로 인스턴스화 할 수 없기 때문에 구현 단계가 고려되지 않는다면 잘못된 설계가 될 수 있다.

 

3) 인터페이스

- 실행코드 없이 메서드 이름만 가진 추상 클래스라고 봐도 무방하다.

- 즉, 누군가 설계해 놓은 개념 클래스 중에 실행 코드가 한 줄이라도 있으면 추상화, 코드 없이 메서드 이름만 나열되어 있으면 인터페이스이다.

- 인터페이스는 상속 관계의 설계보다는 외부 모듈에서 내가 만든 모듈을 사용할 수 있도록 메서드의 이름을 나열해둔 일종의 명세서로 제공된다.

- interface 예약어를 사용하여 정의할 수 있고, 인터페이스에 정의된 메서드를 오버라이드해서 구현할 수 있다.

- 코틀린은 프로퍼티도 인터페이스 내부에 정의할 수 있는데, 대부분의 객체지향 언어에서는 지원하지 않는다.

1
2
3
4
5
6
interface InterfaceTest{
    var score1 : Int
    var score2 : Int
 
    fun testScore()
}
cs

- 인터페이스의 프로퍼티와 메서드 앞에는 abstract 키워드가 생략된 형태이다.

- get() / set()을 통해 값을 지정할 수도 있다.

 

· 클래스에서 인터페이스 구현

 

1) 인터페이스를 클래스에서 구현할 때는 상속과는 다르게 생성자를 호출하지 않고 이름만 지정해주면 된다.

    콜론(:)을 사용한다.( java에서는 implement)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class InterfaceImplClass : InterfaceTest{
    override var score1: Int = 60
 
    override var score2: Int = 90
 
    override fun testScore() {
        println(score1+score2)
    }
}
 
fun main(){
    val interfaceImplClass = InterfaceImplClass()
    interfaceImplClass.testScore()
}
cs

 

 

2) 인터페이스를 클래스의 상속형태가 아닌 소스코드에서 직접 구현할 때도 있는데, object 키워드를 사용해서 구현해야한다.

    → 안드로이드 프로젝트에서 자주 사용하는 형태

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class InterfaceImplClass {
 
    val interfaceTest = object : InterfaceTest{
        override var score1: Int = 100
 
        override var score2: Int = 100
 
        override fun testScore() {
           val total =  score1 + score2
            println(total)
        }
    }
}
 
fun main(){
    val interfaceImplClass = InterfaceImplClass()
 
    interfaceImplClass.interfaceTest.testScore()
}
cs