70일차(2)/Android App(14) : Kotlin Extend, Interface / inner class 사용하기
- Kotlin에서의 상속Extend, Interface 생성 방법 익히기
- Kotlin에서 익명 이너클래스 만들기
- java 코드와 비교하기!
- 새 코틀린 클래스 생성
Step03_Extends
package com.example.kotlin_test
/*
클래스 선언시 기본값을 상속을 받지 못하게 되어 있다.
마치 java 에서 final class Phone{ } 처럼...
상속을 받을수 있게 하려면 open 이라는 예약어를 붙여 준다.
*/
open class Phone{
fun call(){
println("전화를 걸어요")
}
}
open class HandPhone : Phone(){
fun mobileCall(){
println("이동 중에 전화를 걸어요")
}
//재정의 가능한 메소드로 만들려면 open 예약어를 붙여야 한다.
open fun takePicture(){
println("100만 화소의 사진을 찍어요")
}
}
class SmartPhone : HandPhone(){
fun doInternet(){
println("인터냇을 해요!")
}
override fun takePicture() {
//super.takePicture()
println("1000만 화소의 사진을 찍어요")
}
}
fun main(){
val p1=Phone()
val p2=HandPhone()
p1.call()
p2.call() //Phone 클래스로부터 상속받은 메소드도 호출 가능
p2.mobileCall()
p2.takePicture()
val p3=SmartPhone()
p3.call()
p3.mobileCall()
p3.doInternet()
p3.takePicture()
}
- 코틀린에서는 클래스 선언시 기본값이 상속을 받지 못하게 되어 있다.
- java 에서 final class Phone{ } 이라고 작성된 것과 비슷하다.
- 상속을 받을 수 있게 하려면 open 이라는 예약어를 붙여 준다
- 코틀린에서는 상속 가능한 클래스를 open 으로 표기한다.
- : 클래스명() : 코틀린에서 클래스 상속시 표기법
- open을 메소드에도 붙여주어야 override가 가능하다.
- HandPhone() 은 Phone() 클래스를,
SmartPhone()은 HandPhone() 클래스를 상속받아서 만든 것!
- 상속하고 클래스 안에 커서를 놓고 alt+insert 하면 override할 수 있는 선택 창이나온다.
- 부모의 메소드( super.메소드명() ) 는 호출할 필요가 없으면 하지 않아도 된다.
- p3(SmartPhone type)는 Phone(), HandPhone()을 상속받았으므로 모든 메소드를 사용할 수 있다.
Step04_Interface
package com.example.kotlin_test
interface Remocon{
fun up()
fun down()
}
/*
in java => implements Remocon
in kotlin => Remocon
*/
class MyRemocon : Remocon{
override fun up() {
println("무언가를 올려요!")
}
override fun down() {
println("무언가를 내려요!")
}
}
fun main(){
val r1=MyRemocon()
r1.up()
r1.down()
/*
in java
Remocon r = new Remocon(){
@override
public void up(){}
@override
public void down(){}
};
in kotlin
var r = object : Remocon{
override fun up(){}
override fun down(){}
}
*/
/*
object : 클래스 정의(인터페이스를 구현하거나, 클래스를 상속받음)
정의된 클래스로 객체를 생성해서 object 에 담는 느낌
var object = 객체 생성
var r2 = object
*/
var r2 = object : Remocon{
override fun up() {
println("무언가를 올려요")
}
override fun down() {
println("무언가를 내려요")
}
}
r2.up()
r2.down()
}
- Remocon 인터페이스 만들어주고
MyRemocon 클래스에 : Remocon 으로 구현하기
- 인터페이스는 () 없이 인터페이스명만 넣어주면 된다.
- 구현될 것을 전제로 만들어졌기 때문에 open이라는 예약어가 필요없다.
- 코틀린은 java 코드와 100% 호환된다.
- spring을 코틀린으로 코딩할 수도 있다!
- 타입 추론이 가능하기 때문에 Remocon 의 타입을 따로 넣을 필요는 없다.
- r1 상수를 만들어주면 up(), down() 메소드를 사용할 수 있다.
- java: 익명의 이너클래스를 이용해서 인터페이스의 참조값을 얻어내기
- kotlin: object 라는 예약어를 사용한다.
- 파란색으로 예약어라고 나온다! 밑줄 쳐지는 부분에 alt+enter 하면 메소드 오버라이드 가능
- 익명의 이너클래스를 특이한 구조로 만든다.. 구조 익혀두기!
- 클래스 정의와 동시에 객체를 생성하고,
그것을 object에 담아서 r2에 대입하는 것이라고 보면 된다.
object : 인터페이스명{
override하는 메소드
}
- 익명클래스를 통해서 참조값을 얻어낼 수 있다.
- remocon 인터페이스를 구현한 익명클래스가 이곳에 있다고 보면 된다.
- 콜론 우측에 클래스가 정의되어 있는데, 여기서 객체를 바로 생성해서 object에 담는다고 생각하면 된다.
- 이 object가 대입연산자에 담겨서 들어간다.
'국비교육(22-23)' 카테고리의 다른 글
71일차(2)/Android App(16) : Fragment(1) (1) | 2023.01.18 |
---|---|
71일차(1)/Android App(15) : Kotlin Abstract Class, Companion, Map (0) | 2023.01.17 |
70일차(1)/Android App(13) : Custom Adapter 생성, Serializable 인터페이스 구현 (0) | 2023.01.16 |
69일차(2)/Android App(12) : ListView, Adapter 활용 예제 / java to kotlin 작성 연습 (0) | 2023.01.15 |
69일차(1)/Android App(11) : Kotlin Constructor, field / null 값 허용 문법 (0) | 2023.01.14 |