[udemy] Class vs Struct

서희찬·2022년 6월 27일
0

swift

목록 보기
14/17
post-thumbnail

클래스와 구조체의 차이점을 확인하기 이전에
클래스를 배우러 가보자..

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

Struct vs Classes

구조체랑 클래스는 비슷한데..
뭐가다를까?
첫째로 구조체는 상속이 불가하다.

그리고 구조체같은경우 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의 차이점은
값이랑 참조에 의한 호출이냐와 변동가능성과 상속성의 차이라고 보면된다.

profile
부족한 실력을 엉덩이 힘으로 채워나가는 개발자 서희찬입니다 :)

0개의 댓글