본문으로 바로가기

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(인터페이스)


  • 인터페스 자체로 객체가 될 수 없다.
    생성자(단독 생성불가), 초기화 블록 존재하지 않음.
  • 멤버 변수와 메서드로만 구성된다.
    1. 멤버 변수 작성 방법
      - 모든 멤버 변수는 반드시 public static final 이어야한다. 따라서 이 3개의 제어자는 생략할 수 있다.
      - 생성자가 없기 때문에 blank final 형태로 구성할 수 없다.
    2. 메서드 작성 방법
      - 모든 메서드는 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