enum class Calculator(val symbol: String): AbstractOperation {
PLUS("+") {
override fun operate(num1: Double, num2: Double): Double { //plus 재정의 with 오버로딩
return num1.plus(num2)
}
},
MINUS("-") {
override fun operate(num1: Double, num2: Double): Double {
return num1.minus(num2)
}
},
MULTIPLY("*") {
override fun operate(num1: Double, num2: Double): Double {
return num1.times(num2)
}
},
DIVIDE("/") {
override fun operate(num1: Double, num2: Double): Double {
return num1.div(num2)
}
};
companion object {
fun symbolOf(symbol: String): Calculator {
return values()
.firstOrNull() { it.symbol == symbol }
?: throw NoSuchFieldException("정의되지 않은 기호")
}
}
}
operator 키워드는 연산자를 오버로딩하기 위해 사용된다. kotlin에서 특정 연산을 지원하려면 해당 연산에 대한 특정 함수를 정의해야 한다. 그러나 일부 연산은 특정한 함수명을 가지고 있어 operator 키워드를 사용하지 않아도 자동으로 연산자 오버로딩이 작동할 수 있다. 예를 들어, + 연산자는 plus 함수에 대응되며, - 연산자는 minus 함수에 대응된다. kotlin은 이러한 관례를 자동으로 지원하므로 operator 키워드를 명시적으로 사용하지 않아도 된다. 따라서, 내가 작성한 코드에서 operate 함수는 plus, minus, times, div 함수를 오버라이딩하고 있다. 이 함수들은 이미 연산자 오버로딩에 사용되는 함수명이기 때문에 operator 키워드를 명시적으로 사용하지 않아도 잘 동작하는 것이다. 예를 들어, PLUS enum의 operate 함수는 실제로 + 연산을 수행하고 있다.
일반적으로 operator 키워드는 다음과 같은 연산자에 사용한다.
plus (+)
minus (-)
times (*)
div (/)
등
이미 operate 함수를 정의하고 있기 때문에 추가적인 연산자 오버로딩이 필요하지 않았던 것이다. operate 함수를 사용하여 각 연산의 동작을 정의하고 있다.
// 데이터 클래스 버전
data class Point(val x: Int, val y: Int) {
operator fun plus(other: Point): Point { //plus 연산자 재정의 with operator
return Point(x + other.x, y + other.y)
}
}
// 확장함수 버전
operator fun Point.plus(other: Point): Point{
return Point(x+other.x, y+other.y)
}
연산자를 오버로딩하는 함수 앞에는 꼭 operator 키워드가 붙어야한다. operator 키워드를 붙임으로써 함수가 관례를 따르는 함수임을 명확히 하는 것이다. operator 없이 관례에서 사용하는 함수 이름을 쓰면 “operator modifier is required .. “ 오류를 접하게 된다. 즉, plus처럼 미리 정해진 이름의 함수를 operator 키워드를 통해 선언하면 +와 연결되어 +호출로 연산을 수행할 수 있다.
출처: https://taehyungk.github.io/posts/android-kotlin-delegate/
출처: chatgpt
main 함수는 매개변수를 사용하지 않아도 된다. 매개변수를 생략하고 사용하는 것이 일반적이다. 매개변수 없이 main 함수를 정의하면 kotlin 컴파일러가 자동으로 명령행 인수(arguments)를 받아들이는 배열을 만들어서 이를 main 함수에 전달한다. 이 배열은 'args'와 같은 이름으로 사용될 수 있다. 두 가지 형태로 main 함수를 작성할 수 있다. 매개변수를 사용하면 명령행 인수를 더 직접적으로 다룰 수 있지만 간단한 프로그램이라면 매개변수 없이 사용하는 것이 일반적이다.
명령행 인수란? 프로그램이 실행될 때 전달되는 매개변수를 말한다. 이 매개변수들은 주로 터미널 또는 콘솔에서 프로그램을 실행할 때 지정된다. 명령행 인수를 사용하면 프로그램이 실행될 때 동적으로 값을 전달할 수 있다. kotlin에서는 main 함수의 매개변수로 문자열 배열을 받아 명령행 인수를 처리한다. 보통 args라는 이름의 매개변수를 사용한다.
fun main(args: Array<String>) {
// 여기에서 명령행 인수(args)를 처리
for (arg in args) {
println(arg)
}
}
위의 코드에서 args는 문자열 배열로 이 배열은 명령행에서 전달된 인수들을 포함한다. 프로그램을 명령행에서 실행할 때 입력된 값들이 args배열에 저장되며 프로그램은 이 값을 활용한다.
예를 들어, 명령행에서 위와 같이 실행할 경우:
kotlin MyProgram.kt arg1 arg2 arg3
그러면 args배열에는 ["arg1", "arg2", "arg3"]의 값이 저장될 것이다.
출처: chatgpt