푸르미르

[error]"Explicit 'this' or 'super' call is required. There is no constructor in superclass that can be called without arguments" 에러 본문

Android

[error]"Explicit 'this' or 'super' call is required. There is no constructor in superclass that can be called without arguments" 에러

((•_•)) 2021. 1. 8. 22:43

오늘은 Explicit 'this' or 'super' call is required. 

There is no constructor in superclass that can be called without arguments

에러를 살펴보도록 하겠다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
open class Car2 {
    var color : String = ""
    var speed : Int = 0
    companion object {
        var carCount : Int = 0
        const val MAXSPEED :Int = 200
        const val MINSPEED : Int = 0
        fun currentCarCount() : Int{
            return carCount
        }
    }
    constructor(color : String, speed : Int){
        this.color = color
        this.speed = speed
        carCount++
    }
    open fun upSpeed(value : Int){
        if (speed + value >= MAXSPEED)
            speed = 200
        else
            speed += value
    }
    fun downSpeed(value : Int){
        if (speed - value <= MINSPEED)
            speed = 0
        else
            speed -= value
    }
}
class Automobile2 : Car2 {
    var seatNum: Int = 0
    constructor() {
    }
    fun countSeatNum(): Int {
        return seatNum
    }
    override fun upSpeed(value: Int) {
        if (speed + value >= 300)
            speed = 300
        else
            speed += value
    }
}
fun main() {
    var auto: Automobile2 = Automobile2()
    auto.upSpeed(250)
    println("승용차의 속도는 " + auto.speed + "km입니다.")
}
cs

 

 클래스 Automobile2가 클래스Car2의 자식클래스이고 클래스Car2는 상속을 위해 open이라는 키워드가 사용된 것을 볼 수 있다. 코틀린 코드를 작성하는 도중 발생하는 실수로 인해 이 에러가 발생할 수 있다. 왜 에러가 발생하는 것일까?

 

이유는 자식클래스에서 부모클래스를 호출하는 생성자를 쓰지 않았고, 상속받는 자식클래스에서 부모클래스를 호출하는 생성자를 만들어주더라도 해당되는 파라미터를 가진 부모클래스의 생성자가 없기때문에 부모클래스를 호출하지 못하기 때문이다. (부모클래스를 호출하는 방법은 super() 메서드를 사용하면 된다.)

 

그래서 코드를 수정해보면 우선 자식클래스에 부모클래스 생성자를 호출해주어야 하는데  32번째 줄에서 33번째 constructor블록을 constructor() :super()으로 수정을 해준다. 이때 부모클래스 생성자 (12번째 줄)  constructor(color : String, speed : Int)이 생성자를 호출해주는 것이 아닌, constructor()을 호출한다. 하지만 부모클래스에서는 constructor()가 없기 때문에 만들어주어야 한다. 부모클래스에 가서 만들어주자.

그러면 최종적으로 코드는 이렇게 수정이 된다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
open class Car2 {
    var color : String = ""
    var speed : Int = 0
    companion object {
        var carCount : Int = 0
        const val MAXSPEED :Int = 200
        const val MINSPEED : Int = 0
        fun currentCarCount() : Int{
            return carCount
        }
    }
    constructor(){}
    constructor(color : String, speed : Int){
        this.color = color
        this.speed = speed
        carCount++
    }
    open fun upSpeed(value : Int){
        if (speed + value >= MAXSPEED)
            speed = 200
        else
            speed += value
    }
    fun downSpeed(value : Int){
        if (speed - value <= MINSPEED)
            speed = 0
        else
            speed -= value
    }
}
class Automobile2 : Car2 {
    var seatNum: Int = 0
    constructor() :super()
    fun countSeatNum(): Int {
        return seatNum
    }
    override fun upSpeed(value: Int) {
        if (speed + value >= 300)
            speed = 300
        else
            speed += value
    }
}
fun main() {
    var auto: Automobile2 = Automobile2()
    auto.upSpeed(250)
    println("승용차의 속도는 " + auto.speed + "km입니다.")
}
cs