IOS- 7

김정현·2023년 3월 15일
0

IOS 개발공부 일지

목록 보기
7/27

프로퍼티와 메서드

프로퍼티

프로퍼티는

  • 저장 프로퍼티: 인스턴스의 변수 또는 상수
  • 연산 프로퍼티: 값을 저장하는 것이 아닌 특정 연산을 실행한 결과 값
  • 타입 프로퍼티: 앞서 말한 두 프로퍼티는 타입을 정의하고 해당 타입의 인스턴스가 생성됐을때 사용할 수 있으나, 타입 프로퍼티는 인스턴스가 아닌 타입 자체에 속하는 프로퍼티다.

이렇게 세가지로 나눌 수 있다.

저장 프로퍼티

클래스 또는 구조체의 인스턴스와 연관된 값을 저장하는 가장 단순한 프로퍼티다. 기본값과 초깃값 설정이 가능.

struct Abc {
var x: Int = 0      // 저장 프로퍼티
var y: Int = 0      // = 0으로 초기값 설정함

인스턴스를 생성할때는 이니셜라이저(init)를 통해 초깃값을 반드시 보내야한다. 그 이유는 프로퍼티가 옵셔널이 아닌 값으로 선언되었기 때문이다.
(옵셔널로 정의됐을경우 제외)

  • 지연저장 프로퍼티: 호출이 있어야만 값을 초기화하며 lazy 키워드를 사용한다. 저장 프로퍼티로 다른 클래스에 인스턴스를 할당해야할때, 성능저하를 막기위해 사용된다. 주로 복잡한 클래스나 구조체를 구현할때 많이 사용된다.

연산프로퍼티

실제 값을 저장하지 않고 값을 연산하는 프로퍼티이다.
메서드로 연산을 구현할 때보다 훨씬 가독성이 좋은 코드를 구현할 수있다.

var koreanage: Int = 0

var westernage: Int{
get  {return koreanage -1}   // 접근자
}

set(inputvalue) {           // 설정자
koreanage = + 1          
}

과 같이 연산을 해서 할당해준다거나 하는 역할을 한다. 연산 프로퍼티를 읽기 전용으로 구현하려면 get 메서드만 사용하여야 한다.

  • 접근자: 인스턴스 내 외부의 값을 연산하여 적절한 값을 돌려주는 역할
  • 설정자: 은닉화된 내부의 프로퍼티 값을 간접적으로 설정함

프로퍼티 감시자

프로퍼티의 값이 변경됨에 따라 적절한 값을 취할 수 있다. 프로퍼티를 재정의해 상속받은 저장, 연산 프로퍼티에도 적용될 수 있다.

  • willSet 메서드: 프로퍼티가 변경될 값
  • didSet 메서드: 프로퍼티가 변경된 값

매개변수를 지정해주지 않는다면 자동적으로 willSet 메서드에는 newValue, didSet 메서드에는 oldValue가 지정된다.

class Account {
var credit: Int = 0 {
willSet {
print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")  // 프로퍼티안에 감시자를 설정함
 }                                                         //newValue가 자동적으로 지정됨
didSet{   
print("잔액이 \(credit)원에서 \(oldValue)원으로 변경되었습니다.")             

연산 프로퍼티 내부에는 사용할 수 없고 저장 프로퍼티에서 사용한 후, 연산 프로퍼티를 사용하여 값이 변경된다면 감시자의 로그가 정상 출력되는듯하다. 또, 연산자 내부에 (newValue)같은 감시자 매개변수가 사용가능하다.

타입 프로퍼티

인스턴스 프로퍼티는 인스턴스를 새로 생성할 때마다 초깃값에 해당하는 값이 프로퍼티의 값이 되고, 인스턴스마다 새로운 값을 지닌다. 그러나 타입 프로퍼티는 각각의 인스턴스가 아닌 타입 자체에 속하는 프로퍼티이다. 그렇기에 타입 자체에 영향을 미친다.
타입 프로퍼티는 두 가지로 나뉘는데,

  • 저장 타입 프로퍼티: 변수또는 상수로만 선언 가능. 반드시 초기값 설정해야하며 지연연산된다. (다중 스레드 환경으로 단 한번만 초기화)
  • 연산 타입 프로퍼티: 변수로만 선언 가능.

타입 프로퍼티는 인스턴스를 생성하지 않고 사용하며 타입이름만으로도 사용가능하다. static을 사용하여 정의한다.

키 경로

키 경로를 이용하여 간접적으로 특정 타입의 어떤 프로퍼티 값을 가리켜야할지 지정해두고 사용할 수 있다.

키경로는 \, 타입, 마침표로 구성된다

\타입이름.경로.경로.경로      //경로는 프로퍼티 이름
class person {
var name: String

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

struct Stuff {
var name: String
var owner: person
}

let keypath = \Stuff.owner        //Stuff의 owner변수를 참조함

메서드

특정 타입에 관련된 함수를 뜻한다. 클래스, 구조체, 열거형 등에 자유롭게 메서드를 정의할 수 있다.

Self 프로퍼티

모든 인스턴스는 암시적으로 생성된 self 프로퍼티를 갖는다. 그렇기에 더 정확하게 지칭하고 싶다면 self키워드를 사용해주면 된다.

class Levelclass{
var level: Int = 0

func jumpLevel(to level:Int) {     //level이 인스턴스 프로퍼티에 level과 이름이 같다 
print("jump to \(level)")
self.level = level    //좌측 level은 매개변수 level로 인식된다.

0개의 댓글