study 문법1주차) 프로퍼티, 메서드

11408 단어 studyswiftstudy
  1. 프로퍼티의 개념이해.
  2. 메서드의 개념이해.

프로퍼티

프로퍼티는 클래스,구조체 또는 열거형 등에 관련된 을 뜻합니다.
프로퍼티는 크게 세가지로 나눌 수 있습니다.

  1. 저장 프로퍼티(Stored Properties)
  2. 연산 프로퍼티(Computed Properties)
  3. 타입 프로퍼티(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 키워드를 작성합니다.
타입 프로퍼티와 비슷한 내용이라고 이해하셔도 될거같아요!

좋은 웹페이지 즐겨찾기