본문 바로가기

Language/Swift

클래스와 상속

클래스란?

클래스는 정의하여 객체를 만들고 생성하여 사용할 수 있습니다.

예를 들면

import Foundation


class Enemy{
    
    var health:Int = 100
    var attackDamage:Int = 10
    
    func move(){
        print("Enemy move Forward")
    }
    
    func attack(){
        print("Enemy attack \(attackDamage)")
    }
    
    
}

이런식으로 객체로 쓸 수 있게 만들었습니다.

 

그러면 이 클래스를 개체로 쓰기 위해 하나의 파일을 만들어 보겠습니다.

import Foundation

var enemy:Enemy = Enemy()

//클래스에 있는 함수를 사용한다.
enemy.move()
enemy.attack()

//클래스에 있는 멤버변수의 값을 바꾼다.
enemy.attackDamage = 110
//클래스에 있는 함수를 사용하여 값이 바뀐다.
enemy.attack()

이것에 대한 print값은

Enemy move Forward
Enemy attack 10
Enemy attack 110
Program ended with exit code: 0

이런 방식으로 만듭니다. struct와 다르게 클래스의 멤버변수를 조작할 수 있습니다.

 

상속이란

부모가 가진것을 상속을 받아서 사용할 수 있습니다.

예를 들면 위에 Enemy 클래스를 상속받을 class를 만들어서 사용해 보겠습니다.

import Foundation

class Dragon:Enemy{
    
    
}

Dragon 클래스를 만들어서 Enemy 클래스를 상속받았습니다.

그 다음 사용해 보겠습니다.

var dragon:Dragon = Dragon()
dragon.move()
dragon.attack()

위에 Dragon 클래스에는 아무것도 작성을 안하였지만 Enemy 클래스를 상속받아서 Enemy안에 있는 함수를 사용할 수 있습니다.

값 또한

Enemy move Forward
Enemy attack 10

이렇게 나옵니다.

 

그러면 자식클래스인 dragon에서 멤버변수와 클래스를 다뤄볼까요?

 

import Foundation

class Dragon:Enemy{
    
    var wingSpan:Int = 15
    
    func vocal(speech:String){
        print("I'm \(speech)")
    }
    
}

이런 방식으로 class를 만들어서 Dragon 만의 함수를 작성하였습니다.

var dragon:Dragon = Dragon()
dragon.move()
dragon.attack()

dragon.vocal(speech: "vocal")
print(dragon.wingSpan)

위에 같이 작성하면

Enemy move Forward
Enemy attack 10
I'm vocal
15

이렇게 출력이 가능합니다.

또한 dragon 클래스에서 Enemy 클래스의 함수들을 상속받아 사용해 보겠습니다.

 

import Foundation

class Dragon:Enemy{
    
    var wingSpan:Int = 15
    
    func vocal(speech:String){
        print("I'm \(speech)")
    }
    
    //enemy의 move를 상속받았다
    override func move() {
        print("dragon move")
    }
    
    
    override func attack() {
        super.attack()//enemy의 attack함수를 사용하겠다하여 super를 사용한다.
        print("dragon attack")
    }
    
}

위와 같이 override를 사용하는 것은 상속을 받아서 사용하겠다는 뜻입니다. 

그리고 super를 쓰면 Enemy의 함수를 사용하겠다는 뜻 입니다.

var dragon:Dragon = Dragon()
dragon.move()
dragon.attack()

dragon.vocal(speech: "vocal")
print(dragon.wingSpan)

dragon.move()
dragon.attack()

그래서 이것에 대한 프린트 값은

I'm vocal
15
dragon move
Enemy attack 10
dragon attack
Program ended with exit code: 0

아까 super로 받은 값만 추가가 되고 다른 것은 바뀌게 출력이 되었습니다.

 

이렇듯이 클래스와 상속을 알아보았습니다. 처음에 앱을 만들때 viewDidLoad()에서 super라는 것을 보셨듯이 ViewController에서 상속받아 사용하는 것을 알 수 있습니다.

'Language > Swift' 카테고리의 다른 글

Closure (클로저)  (0) 2022.03.24
클래스 vs 구조체 차이  (0) 2022.02.19
Swift 기본 문법 - 자료형  (0) 2022.02.08