Swift 심화(2)

EN·2022년 10월 4일
0

클래스란?

  • 빌딩이 건축되면 어떤 모양일지를 정의하는 청사진이나 건축가의 도면처럼 클래스는 객체가 생성될 때의 모습을 정의한다.
  • 메서드들이 하게 될 일이 무엇이며, 어떤 프로퍼티들이 존재할지 등을 정의한다.
  • 새로운 스위프트 클래스를 선언할 때 새롭게 만드는 클래스가 어떤 부모클래스에서 파생되었는지를 지정하고 클래스에 포함할 프로퍼티와 메서드를 정의한다.
  • 선언부의 프로퍼티 부분은 이 클래스내에 포함될 변수와 상수를 정의하며, Swift에서 변수나 상수를 선언할 때와 동일한 방법을 선언한다.
  • 인스턴스 메서드와 타입 메서드 부분은 이 클래스에서 호출되는 메서드들과 클래스 인스턴스들을 정의한다.
  • 본질적으로 이것들은 특정 작업을 수행하는 클래스 고유의 함수이다.
  • 메소드는 함수일 수 있지만, 함수는 메서드가 아니다.(함수가 더 큰 개념)

클래스에 인스턴스 프로퍼티 추가하기

  • 클래스의 정의에 인스턴스가 만들어지면 갖게될 프로퍼티 추가하기
  • 객체지향프로그래밍의 핵심 목적은 데이터 캡슐화라는 개념이다.
  • 클래스 내의 캡슐화된 데이터를 프로퍼티 또는 인스턴스 변수라고 한다!
  • 클래스 메서드라고 해서 클래스자신의 타입 메서드를 호출할 수 있다.
class BankAccount{
  class func getMaxBalance() ->Float{
    return 100000.00
  }
}
print(BankAccount.getMaxBalance())
  • 클래스 자체의 고유 메서드라고 생각하면 된다.
  • static두 개의 키워드를 동일한 목적으로 같이 쓸 수 있는데, 상속 재정의 가능 여부에 따라 구별해서 쓴다.

저장 프로퍼티와 연산 프로퍼티

  • 스위프트 클래스 프로퍼티는 저장 프로퍼티와 연산으로 나뉜다.
  • 저장 프로퍼티는 상수나 변수에 담기는 값이다.
  • 반면, 연산 프로퍼티는 프로퍼티에 값을 설정하거나 가져오는 시점에서, 어떤 계산이나 로직에 따라 처리된 값이다.
  • 연산 프로퍼티는 게터를 생성하고, 세터 메서드를 생성하며, 연산을 수행할 코드가 포함된다.
  • 예를 들어, BankAccountz클래으세 은행 수수료를 뺀 현재 잔액을 담는 프로퍼티가 추가로 필요하다고 해보자.
  • 저장 프로퍼티를 이용하는 대신에 값에 대한 요청이 있을 때마다 계산되는 연산프로퍼티를 이용하는 것이 더 좋겟다.
var accountBalance: Float = 0
var accountNumber: Int = 0

let fees: Float = 25.00
var balanceLessFees: Float{
  get{
    return accountBalance - fees
  }
}
  • set함수에서는 아래에 newValue는 명시가 안되어있지만, 관용적인 표현으로 쓸 수 있다. 기본 파라미터로 제공되는 것임!!
let fees: Float = 25.00
var balanceLessFees: Float{
  get{
    return accountBalance - fees
  }
  set{
    accountBalance = newValue - fees//newValue는 관용구이다! 그냥 쓸 수 있음.
  }
}

지연 저장 프로퍼티

  • 프로퍼티 초기화 하는 방법에는, 가장 기본적으로 직접 할당이 있고,
  • 두번째로는 초기화 작업에서 프로퍼티에 값을 할당한느 것이다.
  • 클로저를 이용하여 프로퍼티를 초기화할 수도 있다.
class MyClass{//이건 그냥 프로퍼티를 클로저로 초기화 하는 방법
  var myProperty: String = {
      뭐시기 뭐시기
  }()
}
  • 복잡한 클로저의 경우는 초기화 작업이 리소스와 시간을 많이 사용하게 될 수 있다.
  • 클로저를 이용하여 선언하면 해당 프로퍼티가 코드 내에서 실제로 사용되는지와 상관없이 클래스의 인스턴스가 생성될 때마다 초기화 작업이 수행될 것이다.
  • 예를 들어 DB로부터 데이터를 가져오거나 사용자로부터 사용자 입력을 얻게 될 때, 실행 프로세스의 후반부 단계까지 플퍼티에 값이 할당되었는지 모르게 되는 상황이 생길 수 있다.
  • 이러한 상황에서의 더 효율적인 방법은 프로퍼티를 최초로 접근할 때만 초기화 작업을 하는 것이다.
  • 다행히도 이 작업은 lazy로 프로퍼티를 선언하면 된다.
lazy var myProperty: String = {
      뭐시기 뭐시기
}()

self 사용하기

  • 아 이거 약간 this랑 비슷한 거구나
  • 현재의 클래스 인스턴스에 속한 메서드나 프로퍼티를 가리킬 때 프로퍼티와 메서드 앞에 self를 붙이는 습관이 있을 것이다.
  • swift프로그래밍 언어 역시 그렇게 사용하기 위한 swlf프로퍼티 타입을 제공한다.
  • 하지만 swift에서는 self를 사용 할 필요가 없다. 왜냐하면 swlf는 프로퍼티와 메서드에 대한 참조를 디폴트로 간주하기 때문이다.
  • 공식 문서에도 적혀있다.
  • 근데 하지만 가끔 쓸 떄가 있는데, 프로퍼티나 메서드를 클로저 표현식 내에서 참조할 경우이다.
  • 그리고 메서드의 파라미터가, 클래스 프로퍼티의 이름과 같은 경우, 이때는 self를 붙여야 한다.

프로토콜 이해하기

  • 클래스가 구조적으로 올바르게 되기 위하여 Swift클래스가 반드시 따라야 할 특정 규칙은 기본적으로 없다.
  • 하지만 다른 클래스와 함께 작업을 해야 할 때는 특정 조건에 맞춰야 한다.
  • 스위프트는 ‘프로토콜 지향언어’라고도 불린다.(객체지향도 하지만, 프로토콜 지향도 할거야!!! 라는 컨셉으로 만들었음. protocol oriented lang)
  • iOS SDK의 다양한 프레임워크와 함께 동작하는 클래스를 만들 때는 더욱 그러하다.
  • 클래스가 충족해야 하는 최소한의 요구사항을 정의하는 규칙들의 집합을 프로토콜이라고 한다.
  • 프로토콜은 protocol키워드를 이용하며 선언되며, 클래스가 반드시 포함해야 하는 메서드와 프로퍼티를 정의한다.
  • 어떤 클래스가 프로토콜을 채택했으나, 모든 프로토콜의 요구사항을 충족하지 않는다면, 그 클래스가 해당 프로토콜을 따르지 않는다는 에러가 발생하게 된다.
  • 약간 자바의 인터페이스나 추상 클래스 느낌. 협업에서는 자주 쓰임.
  • 모든 클래스에서도 프로토콜처럼 get조건이 없어도 그동안 항상 존재하고 있엇다고 생각하면 된다.
profile
iOS/JUJITSU

0개의 댓글