Swift Deep Dive: Classes and inheritance
Class 라는 것은 '청사진'을 정의하는 것으로볼 수 있다.
우리가 어떤 Property와 Method를 사용할지에 대한 계획을 세울 수 있게 해주고
추후 이를 실제 개체 내에서 initialize할 수 있게 해준다.
클래스와 관련된 용어 중에는
subClasses(서브클래스)
superClass(슈퍼클래스)
override
super.method()
등이 있다.
1) 클래스
내가 이해한 클래스는 결국 같은 특성, 기능을 지니는 개체들을 대표할 수 있는 구조를 만들어 놓는 것이다.
그리하여 정말 기초가 되는 기능들 (예를들면, 게임에서는 몬스터들이 공유하는 기본 스펙이나 음악 재생 어플에서는 아티스트 정보, 음악 발행 연도 등이 될 수 있을 것 같다.)
직접 응용해보자면 이와 같다.
Enemy라는 클래스를 생성하였고, 해당 클래스 내부에는 health, attackPoint라는 프로퍼티들이 내재되어있다.
또한 move(), attack()이라는 함수(메서드)도 내재되어 있음을 알 수 있다.
이와 같이 Enemy 클래스를 정의한 뒤에 이를 적용하기 위해선
이렇게 내가 정의하고 싶은 변수에 Enemy라는 클래스를 담아주면 된다.
또한 .(point)를 이용하여 변수에 직접적으로 해당 프로퍼티, 메서드를 적용시켜주는 것도 가능하다.
위와 같이 기존에 정의해놓았던 프로퍼티, 메서드를 사용가능하다.
2) 클래스를 상속받은 클래스
새로운 클래스를 만들고 싶은데 그 안에 기존에 존재하는 클래스의 속성을 그대로 상속받을 수 있을까?
답은 가능하다.
위와 같이 클래스를 정의할때 :(콜론)을 사용하여 어떤 클래스의 속성을 상속받고 싶은지 정의한다.
그렇게되면 Dragon 클래스는 기존 Enemy 클래스에서 사용된 속성들도 전부 사용이 가능하다.
이렇게 Enemy클래스를 상속받은 Dragon클래스를 initialize한 dragon이라는 변수가 정의되었다.
위와 같이 dragon은 attackPiont라는 기존 Enemy클래스에 정의되어있던 프로퍼티도 바로 적용이 가능하다.
실행 결과 이와 같이 변경된 dragon의 attackPoint, wingSpan 및 dragon 만의 메서드인 talk()가 잘 실행되는 것을 볼 수 있다.
3) Override
override는 쉽게 말하면 덮어쓰기 기능이다.
기존에 Enemy 클래스내 move()라는 메서드를 Dragon 클래스에 맞게 일부분을 변경해주고 싶다면 아래와 같이 Dragon 클래스에서만 적용되게 override를 선언하고 move()의 내용을 바꿔주면 되는 것이다.
그렇게 override를 선언하여 실행하면 아래와 같은 결과가 나온다.
이렇게 override 기능을 이용하여 각자 클래스에 맞게 함수도 조정할 수 있으며 이는 슈퍼클래스에 영향을 미치지 않는 서브클래스의 변경이라고 볼 수 있다.
4. super.method()
super.method()의 경우 슈퍼클래스에 정의 되어있는 메서드를 바로 이용할 수 있는 기능이다.
아래와 같이 Enemy 클래스 내의 attack()을 super을 통해 호출하는 동시에 Dragon의 특성에 맞는 프로퍼티를 메서드내에 추가하여 호출할 수 있다.
정리하자면,
- 클래스 : 어떤 내용들, 함수들을 기록해 놓은 하나의 틀. (프로퍼티와 메서드를 저장해놓고 어떠한 변수에도 쉽게 적용할 수 있도록 만든 구조체)
- 슈퍼클래스 : 부모 클래스라고도 불림, 서브클래스가 슈퍼클래스의 프로퍼티와 메서드를 상속받을 수 있음
- 서브클래스 : 자식 클래스라고도 불림, 슈퍼클래스의 프로퍼티와 메서드를 상속받아 사용할 수 있고 그 이외 자신만의 프로퍼티와 메서드를 재정의할 수 있음. 서브클래스 내에서 override도 많이 이용.
- 오버라이드(override) : 슈퍼클래스에서 정의되어 있던 메서드를 상속받은 뒤 이를 자신만의 특성에 맞게 변경할 수 있도록 덮어씀. 이때 변경된 부분은 슈퍼클래스에 영향을 미치지 않음.
- super.method() 과 같은 형식으로 슈퍼클래스의 메서드를 손쉽게 호출 가능하다!