상속
// 부모 클래스
open class Car(val fuelType: String) {
fun drive() {
println("Car is driving.")
}
fun stop() {
println("Car has stopped.")
}
}
// 자식 클래스: SportsCar
class SportsCar(fuelType: String, val turbo: Boolean) : Car(fuelType) {
fun turboBoost() {
if (turbo) {
println("Turbo boost activated!")
}
}
}
// 자식 클래스: Truck
class Truck(fuelType: String, val cargoCapacity: Int) : Car(fuelType) {
fun loadCargo(weight: Int) {
if (weight <= cargoCapacity) {
println("Cargo loaded.")
} else {
println("Exceeds cargo capacity.")
}
}
}
// 메인 함수
fun main() {
// Car 클래스의 인스턴스 생성
val myCar = Car("Petrol")
myCar.drive()
myCar.stop()
// SportsCar 클래스의 인스턴스 생성
val mySportsCar = SportsCar("Petrol", turbo = true)
mySportsCar.drive()
mySportsCar.turboBoost()
mySportsCar.stop()
// Truck 클래스의 인스턴스 생성
val myTruck = Truck("Diesel", cargoCapacity = 1000)
myTruck.drive()
myTruck.loadCargo(500)
myTruck.stop()
}
쉬운 코드
// 부모 클래스 = open으로 시작하기
open class Animal {
open fun sound() {
println("Some sound")
}
}
// 자식 클래스 = 상속받을 때 (:)으로 받기
// class Dog에 부모 클래스인 Animal 상속
class Dog : Animal() {
override fun sound() {
// 부모 클래스의 sound() 메서드를 오버라이딩
println("Bark")
}
}
// 메인 함수
fun main() {
val myDog = Dog()
myDog.sound() // "Bark" 출력
}
Lv3 (상속 아님)
-객체를 주입해요
: 이 calc 안에서 만들x, 다른 곳에서 만든 객체를 매개변수로 주입 받아라
fun main() { //@1
val calc = Calculator()
println("1 더하기 2 결과는 : ${calc.addOperation(AddOperation(), 1, 2)} 입니다") //@3
}
class AddOperation{ //#1
fun operate(num1: Int, num2: Int): Double = //#2
(num1+num2).toDouble()
}
//..빼기, 곱하기, 나누기도 있어야 하는데 일단 헷갈리니까 뺌
class Calculator { //@2.
fun addOperation(operation: AddOperation, num1: Int, num2: Int): Double { //@4.
return operation.operate(num1, num2) //#3
} //@5.
}
*/
1) Operation에 대한 class 만들기
2) 이 class 안에는 method - operate 라는 method가 있는데, 얘들은 num1,2를 parameter로 받아서 Double이라는 애를 return해주는 method
AddOperation이라는 class안에 들어있는 것
[class AddOperation {
fun operation(num1: Int, num2: Int): Double {
return result = (num1, num2).toDouble()
return result}
}]
=> operate라는 메소드를 실행하면 매개변수로 num1, num2를 받아서 double 타입으로 result에 넣어줌
3) Calculator라는 class, 여기에 addOperation이라는 function이 있는데, 거기에 operation이라는 property를 받는데, 걔 타입이 위의 AddOperation 클래스 타입. 그리고 int 2개(num1, num2) 받음. Double을 return 해줌. return으로 그 operate 안에 있는 operation을 실행해서 return
@1) main에서 Calculator라는 class 생성
@2) Calculator라는 instance가 생성되겠지 (class Calculation) -> 그럼 @1의 calc는 @2의 addOperation을 부를 수 있음 = 이렇게 Calcultor라는 객체를 형성한 calc라는 이름을 가진 애를 만들었음
@3) 거기다가 ${calc.addOperation(AddOperation)} 아래의 addOperation 불러
@4) addOperation 여기 매개변수에 3가지가 들어가야 함
(AddOperation 객체 타입에 operation 들어가/ num1/ num2들어가야 됨)
*객체를 주입한다 = addOperation이라는 메소드를 부를 때 배개변수로 AddOperation이라는 객체를 집어넣음 (AddOperation()괄호열고닫앗으니 instance를 생성한다는 의미)
class Calculator에 class AddOperation이라는 객체가 들어옴
@5)
3번 return을 봐, operation은 2번의 AddOperation이니까 2번 operate를 실행해야 함. num1, num2를 매개변수로 넘김 -> 2번 실행되면 result로 반환함 -> 그걸 3번의 return이 받음 -> 3번의 return은 1번 'println("1더하기 ~~ : ${calc.addOperation(~~)})'의 addOperation에 응답을 줌 (실행된다)
fun main() {
val calc = Calculator()
println("1 더하기 2 결과는 : ${calc.addOperation(AddOperation(),num: 1,num: 2)} 입니다")
}
-> calculator에서 addOperation이라는 함수를 부른다. 그래서 세번째 단락이 나옴
그 안에 매개변수로 3개를 넣을 건데,
첫 번째) class AddOperation이라는 객체를 넣을 거고
두 번째) num1
세 번째) num2
여기서 특이한 건 첫 번째로 넣은 매개변수가 2번클래스라는 것임
우리 근데 AddOperation, SubstractOperation, MultiplyOperation, DevideOperation 있잖아 그래서 저 1main에 저기 안에 바꿔줘
//Lv 4.
abstract class AbstractOperation {
abstract fun operate(num1: Int, num2: Int): Double
}
class AddOperation : AbstractOperation() {
override fun operate(num1: Int, num2: Int): Double = (num1 + num2).toDouble()
}
class Calculator(private val operation: AbstractOperation) {
fun operate(num1: Int, num2: Int): Double {
return operation.operate(num1, num2)
}
}
fun main() {
val calc = Calculator(AddOperation())
println("1 더하기 2 결과는 : ${calc.operate(1,2)} 입니다")
}
*/