Swift 심화(3)

EN·2022년 10월 4일
0

하위 클래스 초기화하기

  • 초기화 과정에서 발생할 수. 있는 잠재적인 문제를 피하기 위해서 상위 클래스의 init메서드는 항상 하위 클래스의 초기화 작업이 완료된 후에 호출되도록 해야 한다.
  init(number:Int, balance: Float, rate: Float){
    ...
    super.init(number: number, balance: balance)
  }

클래스 익스텐션

  • 스위프트 클래스에 새로운 기능을 추가하는 또 다른 방법.
  • 익스텐션은 하위 클래스를 생성하거나 참조하지 않고, 기존 클래스에 메서드, 초기화, 그리고 연산 프로퍼티와 섭스크립트 등의 기능을 추가하여 사용할 수 있다.
  • 스위프트 언어와 iOS SDK 프레임워크에 내장된 클래스에 기능을 추가할 때 익스텐션을 이용하면 매우 효과적일 수 있따.
extension Double{
  var squared: Double{
    return self * self
  }
  var cubed: Double{
    return sefl * self * self
  }
}

결국, 익스텐션은 하위 클래스를 생성하지 않고도 기존의 클래스에 기능을 추가할 수 있는 유용한 방법을 제공한다.

구조체 개요

  • 클래스처럼 구조체도 객체지향 프로그래밍의 기초를 형성하며 데이터와 기능을 재사용할 수 있는 객체로 캡슐화하는 방법을 제공한다.
  • 구조체 선언은 클래스와 비슷하지만, class키워드를 사용하는 대신에 struct키우드를 사용한다는 점이 다르다.
  • 예를 들어 다음은 String 변수와 초기화, 메서드로 구성된 간단한 구조체를 선언하는 코드다.
  • 클래스와 마찬가지로 구조체도 확장될 수 있으며, 프로토콜을 채택하거나 초기화를 가질 수 있다.
  • 클래스와 구조체의 공통점이 많기 때문에 서로가 어떻게 다른지를 이해하는 것이 중요하다
  • 가장 큰 차이점에 대해 알아보기 전에 값 타입과 참조 타입에 대한 개념을 이해하는게 먼저다.

값 타입 vs 참조 타입

  • 겉으로 보기엔 구조체의 클래스는 비슷하지만, 구조체의 인스턴스와 클래스의 인스턴스가 복사되거나 메서드 또는 함수에 인자가 전달될 때 발생하는 동작의 큰 차이가 있다.
  • 왜냐면 구조체 인스턴스의 타입은 값 타입이고, 클래스의 인스턴스 타입은 참조 타입이기 때문이다.
  • 구조체의 인스턴스가 복사되거나 메서드에 전달될 때 인스턴스의 실제 복사본이 생성되면서 원본 객체가 가지고 있던 모든 데이터를 그대로 복사해서 갖게 된다.
  • 즉 복사본은 원본 구조체 인스턴스와는 별개인 자신만의 데이터를 가진다는 의미이다.
  • 실제로 실행 중인 앱 내의 구조체 인스턴스에 대한 복사본이 여러 개 존재할 수 있으며, 각각의 복사본은 자신만의 데이터를 가질 수 있다는 말이다.
    따라서 어떤 하나의 인스턴스르 변경해도 다른 복사본들에 영향을 미치지 않는다.
  • 이와는 반대로, 클래스 인스턴스가 복사되거나 인자로 전달되면 해당 클래스 인스턴스가 있는 메모리의 위치에 대한 참조체가 만들어지거나 전달된다.
  • 참조체를 변경하면 원본 인스턴스에도 동일한 작업이 수행된다.
  • 다시 말해, 단 하나의 클래스 인스턴스가 있고, 그 인스턴스를 가리키는 여러 개의 참조체가 존재하는 것이다.
  • 참조체들 중 하나를 이용하여 인스턴스 데이터를 변경하면 모든 참조체의 데이터가 변경된다.
  • 구조체는 클래스에 있던 상속이나 하위클래스를 지원하지 않는다.
  • 클래스와는 다르게 구조체는 소멸자 메서드를 포함할 수 없다.
  • 구조체는 프로토콜 개념을 더 많이 이용한다! 클래스는 상속이고!

구조체와 클래스는 언제 사용하는가

  • 일반적으로 구조체가 클래스보다 효율적이고, 멀티 스레드 코드를 사용하는데 안정적이기 때문에 가능하다면 구조체를 권장한다.
  • 하지만, 상속이 필요하거나 데이터가 캡슐화된 하나의 인스턴스가 필요할 때는 클래스를 사용해야 한다.
  • 또한 인스턴스가 소멸될 때 리소스를 확보하기 위한 작업이 필요할 때도 클래스를 사용해야 한다.
profile
iOS/JUJITSU

0개의 댓글