[Swift] 프로퍼티와 메소드

김태형·2023년 3월 19일
0

Swift

목록 보기
11/22
post-thumbnail

이번 글은 프로퍼티와 메소드에 대해 작성하고자 한다.


프로퍼티

  • 클래스, 구조체, 열거형 등에 관련된 값 (값에 대한 개념)
  • 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티
  • 지역변수, 전역변수에도 사용 가능

저장 프로퍼티

  • 값을 저장하는 프로퍼티
  • 지연 저장 프로퍼티 (lazy var)
    • 해당하는 인스턴스가 메모리에 바로 올라가는 것이 아니라, 사용할 때 메모리에 올라감 !
    • 다른 인스턴스를 할당해야 할 때 굳이 메모리에 올려놓을 필요가 없어 사용
    • 성능 상향 및 공간 낭비 줄일 수 있음

연산 프로퍼티

  • 인스턴스 내, 외부의 값을 연산하여 적절한 값을 돌려줌
  • get만 구현 : 읽기 전용
  • newValue
    • set에서 정의된 이름
    • set 파라미터를 가지고 올 때 사용

타입 프로퍼티

  • 인스턴스 생성 없이 객체 내의 프로퍼티에 접근을 가능하게 하고, 값도 변경할 수 있음
  • static 키워드로 정의

프로퍼티 감시자(옵저버)

  • 프로퍼티의 값이 변경될 때 적절한 작업을 취할 수 있도록 해줌
  • 프로퍼티의 값이 새로 할당될 때마다 호출됨
  • 변경되는 값이 현재의 값과 같더라도 호출됨
  • willSet, didSet
    • willSet
      • 프로퍼티의 값이 변경되기 직전에 호출
      • 프로퍼티가 변경될 값이 전달됨
    • didSet
      • 프로퍼티의 값이 변경된 직후에 호출
      • 프로퍼티가 변경되기 전의 값이 전달됨
  • 연산 프로퍼티와 프로퍼티 감시자는 동시에 사용 불가능
    (감시자는 저장되는 값이 변경될 때 호출되기 때문)
  • 지역변수, 전역변수에 모두 사용 가능

var westernAge: int {
	get {
			return koreanAge - 1
	}
	set(inputValue) {
			koreanAge = inputValue + 1
	}
}


//연산 프로퍼티
struct Money {
	var currencyRate: Double = 1100
	var dollar: Double = 0
	var won: Double {
		get {
				return dollar * currencyRate
		}
		set {
				dollar = newValue / currencyRate   //set 파라미터 설정을 newValue로 설정
		}
	}
}

var assets = Money(dollar: 2300, currencyRate: 2)
print(assets.won)    //4600 



var moneyInMyPocket = Money()
moneyInMyPocket.dollar = 10
print(moneyInMyPocket.won)   //11000




//타입 프로퍼티
var account = Account()
account.credit = 1000

struct SomeStructure {
	static var storedTypeProperty = "Some value."    //타입 프로퍼티
	static var computedTypeProperty: Int {
		return 1
	}
}

SomeStructure.storedTypeProperty = "hello"    //인스턴스의 생성없이 접근하여 값을 변경



//프로퍼티 감시자

struct Money {
	var currencyRate: Double = 1100 {
		willSet(newRate) {
			print("환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다")
		}
		didSet(oldRate) {
			print("환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다.")
	}
}

키 경로

  • 프로퍼티의 위치를 참조할 수 있음
  • 백슬래시()와 마침표(.) 경로로 구성됨
class Person {
	var name: String
	init(name: String) {
		self.name = name
	}
}

print(type(of: \Person.name))    //ReferenceWritableKeyPath<Person, String>    

메소드

  • 특정 타입에 관련된 함수
  • 인스턴스 메소드, 타입 메소드 (class method, static method)

인스턴스 메소드

  • 특정 타입의 인스턴스에 속한 함수
  • 인스턴스 내부의 프로퍼티 값을 변경하거나 특정 연산 결과를 반환하는 등 인스턴스와 관련된 기능을 실행
  • 함수와 문법이 거의 같음 (기본적인 함수라고 생각하면 될듯!!)
    • 함수와 차이점 : 특정 타입 내부에 구현할 수 있음 —> 인스턴스가 존재할 때만 사용 가능
  • 인스턴스를 생성해야 해당 메소드 사용 가능!
  • self 프로퍼티는 인스턴스 자기 자신을 가리킨다

mutating

  • struct는 생성자를 만들어줘도 되는데, 안만들어도 알아서 만들어줌
  • 대신에 struct는 값 타입이기 때문에 class처럼 값을 그냥 바꾼다고해서 멤버변수의 이름이 바뀌지 않음 ! --> mutating을 통해 바꿔줌
  • struct의 멤버변수 값(인스턴스 내부의 값)을 변경하고 싶으면 mutating을 해주면 된다 !

타입 메소드

  • 타입 자체에 호출이 가능한 메소드 (객체지향 프로그래밍에서의 클래스 메소드와 유사)
  • static, class 키워드로 정의
  • static은 오버라이드 불가능 ! (class는 오버라이드 가능)
  • self 프로퍼티가 타입 그 자체를 가리킨다

class Friend18 {
    var name: String
    
    func changeName(newName: String) {
        self.name = newName
    }
    init(_ name: String) {
        self.name = name
    }
    
}

var myFriend18 = Friend18("김태형")
myFriend18.changeName(newName: "개발하는 테드")
myFriend18.name     //참조 타입이기 때문에 바로 접근하여 값을 바꿀 수 있음


struct BestFriend18 {
    var name: String
    
    mutating func changeName(newName: String) {     //struct는 mutating을 써주지 않으면 해당 멤버변수의 이름이 바뀌지 않음 !
        self.name = newName
    }
}

var myBestFriend18 = BestFriend18(name: "태형")
myBestFriend18.changeName(newName: "Ted")



struct SystemVolume {
	//타입 프로퍼티를 사용하면 언제나 유일한 값이 된다.
	static var volume: Int = 5

	//타입 메소드 사용
	static func mute() {
		self.volume = 0   //SystemVolume.volume = 0과 같은 표현
	}
}


[출처] 스위프트 프로그래밍 (야곰), 야곰의 스위프트 기초문법 강좌, 개발하는 정대리 스위프트 강좌

0개의 댓글