240604_TIL
2024. 6. 4. 20:55ㆍTIL(Today I Learned)
# 상속
- 다형성을 구현할 수 있음
- 클래스의 내용을 변경해야 하는 경우 부모 클래스만 변경하는 것으로 공수 줄일 수 있음
fun main() {
var bird = Bird()
var chicken = Chicken()
var sparrow = Sparrow()
var pigeon = Pigeon()
bird.fly()
chicken.fly()
sparrow.fly()
pigeon.fly()
}
open class Bird {
fun fly() {
println("새는 날아요~")
}
}
class Chicken : Bird() {
}
class Sparrow : Bird() {
}
class Pigeon : Bird() {
}
* 수퍼클래스에스 생성자를 활용하는 경우에는 서브 클래스에 객체 생성 시 전달해줘야 함
fun main() {
var bird = Bird("새")
var chicken = Chicken("닭")
var sparrow = Sparrow("참새")
var pigeon = Pigeon("비둘기")
bird.fly()
chicken.fly()
sparrow.fly()
pigeon.fly()
}
open class Bird(name:String) {
var name: String = ""
init {
// this는 현재 클래스의 상태변수를 의미합니다
// var name: String = ""
this.name = name
}
fun fly() {
println("${name} 날아요~")
}
}
class Chicken(name: String) : Bird(name) {
}
class Sparrow(name: String) : Bird(name) {
}
class Pigeon(name: String) : Bird(name) {
}
서브클래스의 name에 들어온 값 => Bird의 name 값 => init => this
# 오버라이딩
- 수퍼클래스의 정보나 행위를 재설계 가능
- 주로 수퍼클래스의 행위를 재설계
- 공통적인 내용은 수퍼클래스에서 살리고, 각 서브클래스의 개성을 살리고 싶을 때 사용
* 단축키 ctrl + O : 오버라이딩할 수 있는 메소드 리스트 안내
fun main() {
var bird = Bird("새")
var chicken = Chicken("닭", 2)
var sparrow = Sparrow("참새", "갈색")
var pigeon = Pigeon("비둘기", "서울")
bird.fly()
chicken.fly()
sparrow.fly()
pigeon.fly()
}
open class Bird(name:String) {
var name: String = ""
init {
// this는 현재 클래스의 상태변수를 의미합니다
// var name: String = ""
this.name = name
}
open fun fly() {
println("${name}은 날아요~")
}
}
class Chicken(name: String, age: Int) : Bird(name) {
var age:Int = 0
init {
this.age = age
}
override fun fly() {
// super객체는 부모의 객체를 의미하며 자동으로 생성됨
// 즉 부모객체의 fly메소드를 부르는 행위임
// 필요없으니 주석처리완료
// super.fly()
println("${age}살의 ${name}가 날아봅니다~ 꼬끼오!")
}
}
class Sparrow(name: String, color: String) : Bird(name) {
var color:String = ""
init {
this.color = color
}
override fun fly() {
// super객체는 부모의 객체를 의미하며 자동으로 생성됨
// 즉 부모객체의 fly메소드를 부르는 행위임
// 필요없으니 주석처리완료
// super.fly()
println("${color}의 ${name}이 날아봅니다~ 짹짹!")
}
}
class Pigeon(name: String, address: String) : Bird(name) {
var address: String = ""
init {
this.address = address
}
override fun fly() {
// super객체는 부모의 객체를 의미하며 자동으로 생성됨
// 즉 부모객체의 fly메소드를 부르는 행위임
// 필요없으니 주석처리완료
// super.fly()
println("${address} 살고있는 ${name}가 날아봅니다~ 구구!")
}
}
# 오버로딩
- 동일한 이름의 메소드를 여러 형태로 만들 수 있음
- 매개변수의 개수나 자료형을 다르게 하면 동일한 이름으로 메소드를 만들 수 있음
- 반환형은 오버로딩에 영향 X
- 오버로딩이 필요한 이유:
fun main() {
var calc = Calculator()
var intResult = calc.add(1,2)
var doubleResult = calc.add(1.2, 2.2)
println("정수 덧셈결과: ${intResult}")
println("실수 덧셈결과: ${doubleResult}")
}
class Calculator {
fun add(num1: Int, num2: Int): Int {
return num1+num2
}
fun add(num1: Double, num2: Double): Double {
return num1+num2
}
}
# 인터페이스
- 근본적인 기능은 상속, 추가적인 기능들은 인터페이스로 추가할 수 있음
- 메소드의 로직이 없이 이름만 존재할 때 추상 메소드라고 함.
- Ex) 보통 새는 헤엄지는 경우가 없기 때문에 새 수퍼 클래스에 추가하기 어려움이 있으므로, 오리를 포함한 물에서 서식하는 조류에 대한 별도 기능이 필요함
fun main() {
var bird = Bird("새")
var chicken = Chicken("닭")
var sparrow = Sparrow("참새")
var pigeon = Pigeon("비둘기")
var duck = Duck("오리")
bird.fly()
chicken.fly()
sparrow.fly()
pigeon.fly()
duck.swim()
}
open class Bird(name:String) {
var name: String = ""
init {
// this는 현재 클래스의 상태변수를 의미합니다
// var name: String = ""
this.name = name
}
fun fly() {
println("${name} 날아요~")
}
}
class Chicken(name: String) : Bird(name) {
}
class Sparrow(name: String) : Bird(name) {
}
class Pigeon(name: String) : Bird(name) {
}
class Duck(name: String) : Bird(name), WaterBirdBehavior {
override fun swim() {
println("${name}가 수영해요~")
}
}
'TIL(Today I Learned)' 카테고리의 다른 글
240612_TIL (2) | 2024.06.12 |
---|---|
240605_TIL (2) | 2024.06.05 |
240603_TIL (0) | 2024.06.03 |
240531_온보딩 1주차 (4) (0) | 2024.05.31 |
240530_온보딩 1주차 (3) (0) | 2024.05.30 |