iOS/swift

Swift - Class & Inheritance

돌맹이시터 2021. 7. 19. 22:36

 

클래스는 구조체와 마찬가지로 청사진을 정의하는 하나의 방법이다.

property와 method들을 설계할 수 있도록 하고, init()을 통해 어플을 실행했을 때 클래스를 실제 객체로 초기화할 수 있다.

 

 

클래스로부터 어떻게 객체를 만들 것인지,

그리고 상속(inheritance), subclass, superclass와 같은 객체 지향 프로그래밍의 핵심 개념 중 일부는

메소드를 재정의한다는 것이 의미하는 것,

슈퍼클래스에서 메소드를 호출한다는 것이 의미하는 것이 있는데,

그것들에 대해 다룬다.

 

 

xcode에서 new project를 만들 것이다.

전체 어플을 만들지는 않지만, 여러 개의 swift file을 가질 수 있는 프로젝트를 만들 것이기 때문에

playground를 만들어서 연습하는 대신

macOS - Command Line Tool을 선택하여 새로운 프로젝트를 만든다. (ClassesDemo)

 

 

class를 만드는 방법은 struct를 만들 때처럼 간단하다.

 

class ClassName {

 

}

 

위와 같이 정의해줄 수 있는데, struct에서처럼 클래스이름의 첫 글자를 대문자로 지어준다.

그리고 class의 이름은 해당 파일의 이름과 동일하게 만들어주는 것이 관습이다.

 

 

class를 사용(호출)하는 방법도 여태껏 함수나 구조체를 사용할 때와 동일하다.

 

ClassName()

 

 

 

 

 

 

Enemy.swift 파일 안에 class를 만들어주었기 때문에 class의 이름도 Enemy로 지어줬다.

 

 

 

Enemy라고 이름지은 클래스에서 Enemy character에 대한 속성과 행동들을 정의했다.

체력과 공격력을 정해줬고, 이동/공격을 메소드로 정의해줬다.

 

 

   

 

 

main.swift에서 클래스를 사용해봤는데,

위와 같이 Enemy.swift에서 클래스를 생성한 것 만으로

간략한 코드를 사용해 여러 enemy의 속성 및 행동들을 정의할 수 있다.

 

 


 

 

 

여기까지는 class와 struct의 차이점이 없었다면,

class는 Superclass로부터 상속받을 수 있는 특별한 능력이 있다는 차이가 있다.

클래스들 사이에 관계를 가질 수 있다는 것이다.

superclass는 특정한 일을 하는 방법을 알고, 특정한 속성과 방법을 가지고 있다.

기존 기능을 사용하고 그 위에 구축하기 위해서는 기존 클래스에 코드를 추가해도 되지만,

상속이라는 class의 특성을 이용하여 다른 방법을 사용할 수도 있다.

subclass를 만들고, 거기에 기능을 추가할 수 있다.

 

superclass를 부모로, subclass를 자식으로 생각하면 이해가 쉽다.

superclass는 subclass가 할 수 있는 모든 것을 배운다.

subclass는 superclass의 모든 속성과 메소드에 액세스할 수 있으며, 자체 기능을 개발할 수 있다.

 

 

 

위에서 Enemy로 skeleton을 만들었다면,

Enemy class를 활용해서 더 많은 행동을 하는 더욱 강력한 적을 만들고자 한다.

 

동일한 폴더 안에 새로운 swift 파일을 만들고, xcode에서 제공하는 snippet을 사용해서 새로운 클래스를 만들어준다.

-> Dragon.swift 파일을 만들고 class를 생성했다.

 

 

위와 같은 항목들을 입력하도록 되어있는데,

다른 클래스에서 상속하는 class의 기능을 사용하는 것이다.

 

name : 클래스명

super class : 해당 클래스의 superclass 이름. 이 클래스로부터 상속받을 것이다.

 

즉,

 

 

이렇게 class를 생성함으로써

Enemy class 안에 있는 property와 method들을 재입력할 필요 없이 그대로 가져오게 되는 것이다.

 

코드블럭에 아무것도 입력하지 않았지만,

 

 

main.swift 에서 Dragon class를 사용해보면

 

 

Enemy class 에서 입력했던 메소드들이 잘 동작하는 것을 확인할 수 있다.

 

 

Dragon class의 코드블럭에 새로운 property 등을 추가로 입력하면

Enemy와는 별개로 Dragon 만의 특별한 속성 들을 갖게된다.

 

 

Dragon.swift 에서

Dragon class 만의 특별한 속성과 메소드를 부여했다. (날개길이, 대화)

 

 

 

main.swift 에서 여러가지로 테스트해보면

Dragon class는 Enemy class에서 할 수 있는 모든 것을 할 수 있고,

Dragon class에 입력한 것들을 추가로 더 할 수 있는 것을 확인할 수 있었다.

 

 


 

한 가지 거슬리는 점이 있는데,

dragon.move() 를 실행시켰을 때

"Walk forwards."가 출력되는 점이다.

Enemy class 에 들어있는 메소드인데,

드래곤은 걷는 것보단 날아서 이동하는 게 더 자연스럽다.

 

따라서, dragon.move()가 실행되면 날아서 이동하도록 만들어줄 것이다.

 

 

 

Dragon class의 코드블럭으로 가서,

move() 를 입력하면

 

 

자동적으로 위와 같이 override func 가 만들어진다.

 

override 에 의해 superclass에 있는 동일한 move method보다 우선시되게 된다.

 

 

 

 

override func move() 

아래에 날아간다고 출력되게 수정해주면,

 

 

 

 

 

위의 코드를 실행한 결과를 보면

Enemy class를 사용한 skeleton 은 move method 를 사용했을 때 걸어가고,

Dragon class를 사용한 dragon은 move method를 사용했을 때 날아가는 것을 확인할 수 있다.

 

 

 


 

 

이번에는 custom method만 실행하지 않고,

superclass의 method를 실행하고 subclass의 method도 함께 실행되도록 할 것이다.

 

용가리가 공격을 할 때, 데미지를 주고(Enemy class) 불도 쏘게(Dragon class) 만들 것이다.

 

 

custom method는 위에서 move()를 다루었던 것과 동일하게

override func 을 만들어주면 되고 (attack()만 입력하면 자동으로 입력됨)

 

코드블럭 안에 커스텀 코드와 함께

super.attack() 을 넣어주면 된다.

 

superclass에서의 attack method를 실행한다는 의미이다.

 

 

 

 

main.swift 에서 실행시켜보면 원하던 결과를 얻을 수 있다.