클래스와 구조체의 차이점을 확인하기 이전에
클래스를 배우러 가보자..
blueprint
-> init()
classs MyClass {}
name이랑 파일이름이랑 같아야한다.
enemy.swift 를 만들어주고
class Enemy {
var health = 100
var attackStrength = 10
func move(){
print("Walk")
}
func attack(){
print("Land a hit, does \(attackStrength) damage. ")
}
}
이와 같이 작성하면
// init
let skeleton = Enemy()
print(skeleton.health)
skeleton.move()
skeleton.attack()
// blue print
let skeleton2 = Enemy()
let skeleton3 = Enemy()
이와같이 붕어빵 틀처럼 스켈레톤을 복제할 수 있다.
SuperClass :
-> inheritance
SubClass
슈퍼클래스 밑에 서브클래스는 상속된다.
그리고 부모의 클래스를 재정의하고 싶으면 override하면된다!
Drangon을 Enemy의 subClass로 만든것이다.
class Dragon: Enemy {
var wingSpan = 2
func talk(speech : String){
print("Says : \(speech)")
}
//dragon은 난ㄴ다
// 그니깐 오버라이드 ㄱ ㄱ
// 부모 메서드 재정의
override func move(){
print("FLY~ FORWARD")
}
override func attack() {
super.attack() //부모의 메서드를 가져와줌
print("Spits fire, does 10 damage")
}
}
NSObject -> UIResponder -> UIView -> UIControl -> UIButton
구조체랑 클래스는 비슷한데..
뭐가다를까?
첫째로 구조체는 상속이 불가하다.
그리고 구조체같은경우 initializer가 필요하지만 클래스같은 경우는 init으로 작성해줘야한다.
https://icksw.tistory.com/256
구조체와 클래스 차이점에 대해 자세한 설명은 위에 있다.
class Enemy {
var health = 100
var attackStrength = 10
init(health : Int, attackStrength : Int){
self.health = health
self.attackStrength = attackStrength
}
func takeDamge(amount : Int){
health = health - amount
}
func move(){
print("Walk")
}
func attack(){
print("Land a hit, does \(attackStrength) damage. ")
}
}
init을 진행해주고,
// init
let skeleton1 = Enemy(health: 100, attackStrength: 10)
let skeleton2 = skeleton1
skeleton1.takeDamge(amount: 10)
print(skeleton2.health)
skeleton을 위와 같이 선언해서 출력하면
1에게 데미지를 줬는데 2도 먹힐까?
당연히 아닐것 같지만
신기하게도
90이라는 데미지가 뜬다
그 이유는 바로 클래스는 참조에 의한 호출이기 때문이다.
그렇기에 다른 객체로 만들어주고 싶으면
// init
let skeleton1 = Enemy(health: 100, attackStrength: 10)
let skeleton2 = Enemy(health: 100, attackStrength: 10)
skeleton1.takeDamge(amount: 10)
print(skeleton2.health)
이와 같이 작성해야한다.
참조에 의한 호출이기에 첫번째와 같은 실수를 하지 않도록 조심하자
근데 이 대신에 struct로 만들어보자.
struct Enemy {
// var health = 100
// var attackStrength = 10
var health : Int
var attackStrength : Int
init(health : Int, attackStrength : Int){
self.health = health
self.attackStrength = attackStrength
}
mutating func takeDamge(amount : Int){
health = health - amount
}
func move(){
print("Walk")
}
func attack(){
print("Land a hit, does \(attackStrength) damage. ")
}
}
struct 는 imutatable 하기 때문에 takeDamage앞에 mutating을 선언해주어야 한다.
var skeleton1 = Enemy(health: 100, attackStrength: 10)
var skeleton2 = skeleton1
skeleton1.takeDamge(amount: 10)
print(skeleton2.health)
그 후 Main코드를 위와같이 수정해주면,
이와 같이 뜬다
클래스와 다른 방식으로 뜨는게 보인다.
이는, 구조체는 참조에 의한 호출이 아니라는것을 확인할 수 있다.
그냥 값을 복사한다고 보면된다.
이것이 struct와 classs의 큰차이점이라고 보면된다.
struct는 사진을 복사해서 준다면,, class는 사진의 원본의 주소를 알려준다~ 라고 보면된다~
요약하자면, struct 와 class의 차이점은
값이랑 참조에 의한 호출이냐와 변동가능성과 상속성의 차이라고 보면된다.