[Swift] 기초문법 03

최정은·2023년 8월 15일
0

Swift

목록 보기
3/27

구조체와 클래스

struct vs. class 차이점과 공통점

✅ 공통점

  • 프로퍼티(속성)를 정의해서 값을 저장할수 있음
  • 메소드(행동)를 정의해서 기능을 제공할수 있음
  • 생성자를 정의해서 초기상태를 세팅할수 있음
  • 확장을 이용해서, 기본 구현외 추가 기능을 더할수 있음
  • 프로토콜을 구현해서 특정 기능을 제공할수 있음

✅ 차이점

  • 클래스는 상속을 시킬수 있음
  • 클래스는 레퍼런스 카운팅을 통해 클래스 인스턴스에 대한 하나 이상의 참조를 허용
  • 클래스는 deinitializer 호출시, 이미 할당된 리소스에서 해제 할수 있음

구조체

생성

struct Movie {
		// stored property
    var name: String
    var director: String

		// computed property  
        // 저장된 값이 아닌 계산된 값을 반환함
    var description: String {
        return "\(name) is \(director)'s best movie ever"
    }
}

var movie = Movie(name: "인셉션", director: "놀란")
print(movie.description)

property observers

  • property 값이 변경되는 것을 감지할수도 있음
struct Task {
    var name: String
    var progress: Int {
        didSet {
            print("Current Progress : \(progress) %")
        }
    }
}


var task = Task(name: "Very Important Task", progress: 0)
task.progress = 30 // Current Progress : 30 %

mutating method

  • struct 인스턴스 생성시 let 을 이용해서 상수로 생성하면, property 변경 할수 없음
  • struct 인스턴스 생성시 var 을 이용해서 변수로 생성하면, property 변경 할수도 있고 없을수도 있음
    • 변경 가능한 경우
      • store property 가 var 로 선언된 경우
    • 변경 가능하지 않은 경우
      • store property 가 let 로 선언된 경우
  • struct 에서 methodstored property 값을 변경하는 경우, mutating 키워드를 메소드 앞에 붙여주어야함
struct Student {
    let name: String
    var major: String
    var knowledge: Double
    
    func didFinalTest() -> Int {
        let howMuchIdontKnow = (1 - knowledge) * 100
        let score = 100 - Int(howMuchIdontKnow)
        return score
    }
    
    mutating func didStudy() {
        if knowledge >= 1 {
            knowledge = 1
        } else {
            knowledge += 0.1
        }
    }
}


var student = Student(name: "Jason", major: "CS", knowledge: 0.5)

let score1 = student.didFinalTest()
student.didStudy()

클래스

생성

class Dog {
    var name: String
    var breed: String

    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }
}


let milk = Dog(name: "milk", breed: "Collie")

milk.name // milk
milk.breed // Collie

final class

  • final 키워드를 이용해서 클래스 선언하면, 더 이상 상속 가능하지 않음

copying object

  • structclass 의 차이중 하나가 instance 복사할때임
    • struct 와 같은 value type 은 복사하면, 새로운 객체를 만듬
      • → 따라서, 새로 복사된 객체의 프로퍼티 변형했다고 원래 객체가 영향 받지 않음
    • class 와 같은 reference type 은 복사하면, 새로운 객체를 만들지 않음 (같은 객체를 포인팅하고 있음)
      • → 따라서, 새로 복사된 객체의 프로퍼티 변형하면, 원래 객체의 프로퍼티 영향 받아서 변형 되어 있음

mutability

  • classstruct 와 다르게 reference type 이여서 상수로 선언하더라도, 프로퍼티가 var 로 선언해 놓았으면 변경 가능함
    • 이 때문에, class 는 method 앞에 mutating 키워드를 쓸 필요 없음
    • 프로퍼티를 변경가능하지 않게 하려면, let 으로 선언해 놓으면 됨

0개의 댓글