study 문법1주차) 프로퍼티, 메서드
- 프로퍼티의 개념이해.
- 메서드의 개념이해.
프로퍼티
프로퍼티는 클래스,구조체 또는 열거형 등에 관련된 값을 뜻합니다.
프로퍼티는 크게 세가지로 나눌 수 있습니다.
- 저장 프로퍼티(Stored Properties)
- 연산 프로퍼티(Computed Properties)
- 타입 프로퍼티(Type Properties)
- 프로퍼티 감시자(Property Observers)
그럼 각 프로퍼티에 대해 한번 알아볼까요??
저장 프로퍼티 ( and 지연 저장 프로퍼티)
-> 클래스 또는 구조체의 인스턴스와 연관된 값을 저장하는 프로퍼티입니다.
var키워드를 사용하면 변수 저장 프로퍼티, let키워드를 사용하면 상수 저장 프로퍼티
코드를 통해 살펴보아요.
class Property {
var x: Int = 0 // 저장 프로퍼티
let y: String = "hello" // 저장 프로퍼티
/*
초기값을 지정해주었기 때문에 이니셜라이저를 사용하지 않아도된다.
이니셜라이저는 다음에 알아보겠습니다!
*/
}
// 클래스의 인스턴스 생성 방식입니다.
var someProperty: Property = Property()
someProperty.x = 99
someProperty.y = "hi" // 상수 저장 프로퍼티이므로 값 변경불가. 오류
struct Property {
var name: String
var year: Int
}
// 구조체에는 기본적으로 저장 프로퍼티를 매개변수로 갖는 이니셜라이저가 있다.
let jamkingIos: Property = Property(name: "jamking", year: 28)
tip. 구조체의 가변성은 프로퍼티의 가변성과 연관이 있다. var, let
지연 저장 프로퍼티?
지연 저장 프로퍼티는 lazy키워드를 사용합니다.
인스턴스를 생성할 때 프로퍼티에 값이 필요 없다면 프로퍼티를 옵셔널로 선언해줄 수 있습니다.
지연 저장 프로퍼티는 호출이 있어야 값을 초기화기에 이때 lazy키워드를 사용합니다.
지연 저장 프로퍼티는 var 키워드와 사용하여 변수로 정의합니다.
인스턴스도 var로 정의해줘야 합니다!
-> 주로 복잡한 클래스나 구조체를 구현할 때 많이 사용됩니다.
쉽게말해 모든 저장프로퍼티를 사용할 필요가 없을때 공간낭비를 위해 사용한답니다!!
- 다중 스레드 환경에서 동시다발적 접근을 할 때는 한 번만 초기화된다는 보장이 없다.
- 생성되지 않은 지연 저장 프로퍼티에 많은 스레드가 비슷한 시점에 접근한다면, 여러번 초기화 될 수도 있다.
코드로 알아볼게요!
struct SomeStruct {
var x: Int = 0
var y: Int = 0
}
class Position {
lazy var point: SomeStruct = SomeStruct()
let name: String
init(name: String) {
self.name = name
}
let jamkingPosition: Position = Position(name: "jamking")
// point 프로퍼티로 처음 접근할 때 그제서야 SomeStructrk가 생성
print(jamkingPosition.point) // x: 0, y: 0
}
연산 프로퍼티
-> 실제 값을 저장하는 프로퍼티가 아니라, 특정 상태에 따른 값을 연산하는 프로퍼티입니다.
접근자(getter)와 설정자(setter)의 역할을 할 수 있습니다. 키워드( get, set)
속성으로 전달된 값을 다른 속성으로 저장할때 사용합니다.
프로퍼티 감시자
말 그대로 속성을 감시하는 것입니다.
- 값이 새로 할당될 때마다 호출
- 이때 변경되는 값이 현재와 같더라도 호출
var name: Int = 0 {
willSet(변경되기 직전에 호출) {
// statements
}
didSet(변경된 직후에 호출) {
// statements
}
}
야곰님 책을 참고한 자료입니다. 코드를 보면 바로 이해가 되실거예요.
전역변수와 지역변수
- 전역변수와 전역상수는 지연저장 프로퍼티처럼 처음 접근할 때 최초로 연산이 이루어집니다.
- 따라서 lazy키워드를 사용할 필요가 없습니다.
타입 프로퍼티
각각의 인스턴스가 아닌 타입 자체에 속하는 프로퍼티를 타입 프로퍼티라고 합니다.
타입 프로퍼티는 타입 자체에 영향을 미칩니다.
타입 프로퍼티는 변수 또는 상수로 두 가지로 선언이 가능하며, 연산 타입 프로퍼티는 변수로만
선언할 수 있습니다. 저장 타입 프로퍼티는 반드시 초깃값을 설정해야 하며 지연 연산됩니다.
코드를 통해서 알아볼게요.
class Number {
static let num = 2020
}
let n = Number()
n.num // Number()에서 아직 초기화 되지않음. 오류
Number.num // 이렇게 접근하는 시점에 실행
self & super
self
self.propertyName
self.method()
self[index]
self.init(parameters)
self는 자동으로 호출이 됩니다. 그렇지만 빼놓지 않고 사용해야하는 경우가 있는데요.
- 속성과 파라미터의 이름이 같은경우 구분하기위해서 self를 사용해야한다.
- 클로져 내부에서 인스턴스속성에 접근하려면 self를 사용해야한다.
Tip. 인스턴스 메서드에서는 self가 인스턴스를 가르키지만 타입 메서드의 self는 타입을 가리킨다.
self와 super는 큰 차이는 없지만 super는 상속과 관련되어 있기때문에 class에서만 사용가능합니다.
super.propertyName
super.method()
super.[index]
super.init(parameters)
메서드
메서드는 특정 타입에 관련된 함수입니다. 스위프트에서는 클래스,구조체,열거형에서 자유롭게
메서드를 정의할 수 있습니다.
쉽게 말하면 클래스(구조체, 열거) 안에 있는 함수(func)입니다.
인스턴스 메서드
인스턴스 메소드드는 특정 클래스, 구조체 또는 열거형의 인스턴스에 속하는 함수입니다.
코드를 통해 간단히 알아보고 넘어갈게요!
class Hello {
var num = 1 // 프로퍼티
func level() {
num += 1
}
func reset() {
num = 0
}
}
// 호출방법
let number = Hello()
number.lever() // num = 2
number.reset() // num = 0
프로퍼티와 호출방식이 비슷해요 :)
타입 메서드
타입 자체에서 호출할 수 있는 메소드를 의미합니다.
클래스를 위한 타입메소드는 func 키워드 앞에 class 키워드를 작성합니다.
구조체와 열거형을 위한 타입메소드는 func 키워드 앞에 static 키워드를 작성합니다.
타입 프로퍼티와 비슷한 내용이라고 이해하셔도 될거같아요!
Author And Source
이 문제에 관하여(study 문법1주차) 프로퍼티, 메서드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jamking/study-문법1주차-프로퍼티와-메서드저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)