본문 바로가기
IT/swift

100 days of SwiftUI - Day12

by 가능성1g 2024. 11. 14.
반응형

오늘은 class 관련 공부다.

java , c++ 의 클래스와 크게 다를점이 없다. struct 와 class의 차이를 아는게 많은 도움이 되겠다.

struct 는 값복사, class 는 값참조다. 복사하려면 복사 구문을 만들어줘야 한다.

값참조 이기  때문에 같은 참조하는 클래스들이 모두 사라져야 메모리 해제가 된다. 

그래서 init , deinit 함수가 있다. deinit 은 c++의 파괴자로 생각하면 된다. ( 파괴자라는 말은 좀 여전히 맘에 안든다... )

struct 와 다르게 var를 다루는 func 에 mutating 을 안붙여도 된다.  여기서 struct는 상수같구나!  해주면 된다. 

 

가장 큰 struct vs class 의 차이점은 상속이다.  class B : A  하면 B는 A를 상속한다는 의미다. 상속하면, 필요한 경우 부모의 초기화 함수를 호출 해야 하기도 한다. 

 

--첵포인트 문제--

"""
make a class hierarchy for animals, starting with Animal at the top, then Dog and Cat as subclasses, then Corgi and Poodle as subclasses of Dog, and Persian and Lion as subclasses of Cat.
But there’s more:
The Animal class should have a legs integer property that tracks how many legs the animal has.
The Dog class should have a speak() method that prints a generic dog barking string, but each of the subclasses should print something slightly different.
The Cat class should have a matching speak() method, again with each subclass printing something different.
The Cat class should have an isTame Boolean property, provided using an initializer.
"""

class Animal {
    var legs: Int
    
    init(legs: Int){
        self.legs = legs
    }
}

class Dog : Animal {
    func speak() {
        print("Bowwow")
    }
}

class Cat : Animal {
    let isTame: Bool
    
    init(isTame: Bool) {
        self.isTame = isTame
        super.init(legs: 4)
    }
    
    func speak() {
        print("Meow")
    }
}

class Corgi : Dog {
    override func speak() {
        print("Bowow Corgi")
    }
}

class Poodle : Dog {
    override func speak() {
        print("Bowow Poodle")
    }
}

class Persian : Cat {
    
}

class Lion : Cat {
    
}

//간단한 샘플!
var shimk = Corgi(legs: 4)
shimk.speak()

 

oop는 전문이니 클래스는 그냥 쉬어가는 페이지!

반응형