Abstract Class (추상 클래스)
- 자손 클래스들에서 어자피 재정의 해서 사용되기 때문에 조상 입장에서는 구현할 필요가 없거나
조상 레벨에서 아직 작성할 수 없는 메서드에 대해 추상클래스임을 선언한다. - 작성 방법 : 선언부만 작성하고 구현부를 세미콜론(;)으로 대체하고 구현부가 없다는 의미로 abstract 키워드를 선언부에 추가한다.
- 또한, 클래스가 abstract 메서드를 포함하고 있는 경우 반드시 클래스 선언부에도 abstract 키워드를 추가해야한다.
- 이런 형태의 프로그래밍 기법을 'abstract method design pattern'이라고 한다.
- 구현된 함수와 구현되지 않은 함수가 모두 정의 되어 있다.
- 단독으로 객체를 생성할 수 없다.
- 추상 함수를 반드시 override 해주어야한다.
- 추상 클래스와 추상함수는 default 값이 open이다.
- 추상 클래스 정의 -
1
2
3
4
5
6
7
|
abstract class Weapon{
fun move(){
println("이동합니다.")
}
//추상 함수(모양만 정의된 함수)
abstract fun attack()
}
|
cs |
- 추상 클래스 오버라이드 -
1
2
3
4
5
6
7
|
class MyWeapon : Weapon(){
//추상 함수 오버라이드
override fun attack() {
println("지상 공격을 해요")
}
}
|
cs |
- 출력 -
1
2
3
4
5
6
|
fun main(){
var w1=MyWeapon()
w1.move() //이동합니다
w1.attack() //지상 공격을 해요
}
|
cs |
추상 클래스를 상속받은 Anonymous inner Class(추상 익명 클래스)
object 라는 예약어를 이용해서 익명 클래스를 만든다.
1
2
3
4
5
6
7
8
9
10
11
|
fun main(){
//Anonymous inner Class(추상 익명 클래스)
var w2=object : Weapon(){
override fun attack() {
println("공중 공격을 해요")
}
}
w2.move() //이동합니다.
w2.attack() //공중 공격을 해요
}
|
cs |
Interface(인터페이스)
- 인터페스 자체로 객체가 될 수 없다.
생성자(단독 생성불가), 초기화 블록 존재하지 않음. - 멤버 변수와 메서드로만 구성된다.
- 멤버 변수 작성 방법
- 모든 멤버 변수는 반드시 public static final 이어야한다. 따라서 이 3개의 제어자는 생략할 수 있다.
- 생성자가 없기 때문에 blank final 형태로 구성할 수 없다. - 메서드 작성 방법
- 모든 메서드는 public abstract(추상 메서드) 이어야한다. 따라서 이 2개의 제어자는 생략할 수 있다.
- 멤버 변수 작성 방법
- 인터페이스는 다중 extends(상속) 받을 수 있으며 개수의 제한은 없다.
(클래스는 단일 extends만 가능) - data type의 역할을 할 수 있다.
- 인터페이스 정의 -
1
2
3
4
|
interface Remocon{
fun up()
fun down()
}
|
cs |
- 인터페이스 구현 -
1
2
3
4
5
6
7
8
9
10
|
class TvRemocon:Remocon{
override fun up() {
println("tv 채널을 올려요")
}
override fun down() {
println("tv 채널을 내려요")
}
}
|
cs |
-출력-
1
2
3
4
5
6
7
|
fun main(){
println("----TvRemocon----")
var r1=TvRemocon()
r1.up() //tv 채널을 올려요
r1.down() //tv 채널을 내려요
}
|
cs |
인터페이스를 구현한 Anonymous inner Class
object 라는 예약어를 이용해서 익명 클래스를 만든다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
fun main(){
var r2=object:Remocon{
override fun up() {
println("볼륨을 올려요")
}
override fun down() {
println("볼륨을 내려요")
}
}
r2.up()
r2.down()
}
|
cs |
다형성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//Weapon 클래스 상속 받고 Weapon 인터페이스를 구현한 클래스
class MultiClass:Weapon(), Remocon{
override fun attack() {
println("아무거나 공격해요")
}
override fun up() {
println("파워를 올려요")
}
override fun down() {
println("파워를 내려요")
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
fun main(){
var r3=MultiClass()
r3.move()
r3.attack()
r3.up()
r3.down()
//다형성 : MultiClass 객체의 참조 값을 다양한 type 변수에 담기
var m1:MultiClass= MultiClass()
var m2:Weapon= MultiClass()
var m3:Remocon= MultiClass()
}
|
cs |
Java와 비교해보기 : https://sallykim5087.tistory.com/96
'Android' 카테고리의 다른 글
[Kotlin] companion(static 자원 in Java) / private 제어자 (0) | 2020.03.31 |
---|---|
[Kotlin] Collection - List / Set / Map (0) | 2020.03.31 |
[Kotlin] Extensions(상속) - class, fun (0) | 2020.03.30 |
[Kotlin] Class(클래스) / Constructor(생성자) (0) | 2020.03.30 |
[Warning]App is not indexable by Google Search; consider adding at least one Activity with an ACTION-VIEW intent filter. (0) | 2020.03.25 |