2월 1일 TIL (구조체와 클라스 #2)

이승원·2024년 2월 1일
0

TIL

목록 보기
15/75
post-thumbnail

이전 포스팅 [1월 31일 TIL (구조체와 클라스#1) ]

프로퍼티

  • 클래스와 구조체를 구성하는 요소 중 하나인 프로퍼티는 값을 제공하는 역할을 한다. 값을 저장하는것과 제공하는것의 차이는 말 그대로 저장을 하지 않고 제공하는 프로퍼티도 있기 때문이다.
  • 따라서 프로퍼티는 값을 저장하는 여부의 따라서 두 가지 종류로 나눌수 있다. (이번 포스팅에서는 저장 저장, 지연 저장 프로퍼티만, 다음 포스팅에서 계속)

저장 프로퍼티

저장 프로퍼티의 특징

  • 입력된 값을 저장하거나 저장된 값을 제공하는 역할
  • 상수 및 변수를 사용해서 정의 가능
  • 클래스와 구조체에서는 사용이 가능하지만, 열거형에서는 사용할 수 없음

구조체와 클라스에서 저장프로퍼티 차이

  • 저장 프로퍼티는 클래스나 구조체에서 선언된 변수나 상수를 뜻하는 말이다. 구조체는 이전 포스팅에서도 말한것처럼 멤버와이즈 초기화 구문을 통해 프로퍼티를 선언할때 초기값을 할당하지 않아도 되는 반면에, 클래스는 초기값을 할당하지 않는 다면 컴파일 오류가 난다. 따라서 아래 세가지 방법을 통해 클래스 프로퍼티를 초기화할 수 있다.
class user {
	var name : String		// 오류 , 프로퍼티에 값을 할당되지 않아서
}

// 1. 초기화 구문 이용
class user {
	var name : String	
    
	init(){
    	self.name = ""
    }
}

// 2. 프로퍼티를 옵셔널 타입으로 선언
class user {
	var name : String?	
    (또는)
    var name : String!
}

// 3. 프로퍼티에 초기값을 할당
class user {
	var name : String = ""	
}
  • 그럼 여기서 드는 의문, 구조체는 초기화 구문을 사용할 수 없을까? 아니다 구조체도 마찬가지로 초기화 구문을 사용할 수 있다. 단 구조체에서는 기본적으로 제공하는 멤버와이즈 초기화 구문을 사용할 수있다. 구조체를 선언할때 프로퍼티에 초기값을 설정하지 않았다면, 우리는 멤버와이즈 초기화 구문을 통해 간편하게 각 프로퍼티의 값을 전달할 수 있다. 근데 만약에 초기화 구문을 통해 조금 더 추가적인 초기값의 대한 변경을 하고 싶다면, 똑같이 할 수 있다, 하지만 내가 이해한 바로는 두개를 동시에 쓸수는 없다. 초기화 구문을 만들었다면, 멤버와이즈 초기화 구문을 사용할 수 없게 된다.

저장 프로퍼티의 종류

  • 멤버 변수 (Var) : 변수형 저장 프로퍼티
  • 멤버 상수 (let) : 상수형 저장 프로퍼티

인스턴스 (상수, 변수)에 따른 변화

  • 클래스에서는 정의된 그대로 우리가 원래 사용하는 대로 사용하는거지만, 구조체에서는 조금 다르게 작동하는 경우가 있다.
  • 구조체 인스턴스가 변수에 할당된다면, 멤버 변수를 변경할 수 있지만, 구조체 인스턴스가 상수에 할당된다면, 멤버 변수 또한 변경이 불가능하다.

지연 저장 프로퍼티

  • 일반적인 저장 프로퍼티는 앞서 말했듯이 인스턴스가 처음 생성될때 함께 초기화되지만, 지연 저장 프로퍼티는 이름에서부터 알 수 있듯이 lazy 키워드가 붙은 프로퍼티는 선언만 될뿐 초기화가 되지는 않는다. 지연 저장 프로퍼티는 호출이 되는 순간 초기화가 된다.
	clas OnCreate{
    	init() {
        	print("OnCreate!")
        }
    }
   	Class LazyTest{
    	var base = 0
        lazy var late = Oncreate()
        
        init(){
        	print("Lazy Test")
        }
    }
    
    let lz = LazyTest()
    // lz 는 LazyTest 클래스의 인스터스로 생성이 되었고, 초기화 구문에 따라서, 
    // "Lazy Test" 출력
    
    lz.late()
    // "Oncreate!" 출력

지연 저장프로퍼티의 용도와 장점은 그럼 무엇이 있을까?

  • 초기화 시기의 지연, 당장 필요없는 자원을 초기화할 필요가 없다는게 장점이다, 특히나 복잡한 초기화 로직을 갖고 있는 프로퍼티 일수록 더욱 더 효과적이다.
  • 성능 개선, 위에 내용이랑 비슷하지만, 프로퍼티 값을 사용하기 전까지 굳이 초기화를 하지 않기 때문에, 비교적 성능을 개선할 수 있다.

클로저를 이용한 저장 프로퍼티 초기화

  • 저장 프로퍼티를 클로저를 사용해서 필요한 로직을 실행한 후 반환되는 값을 이용하여 저장할 수 있다.
  • 다만 해당 클로저는 인스턴스 생성시 최초 한 번만 실행 된다. 다시 말해, 해당 저장 프로퍼티를 참조 하더라도, 클로저 구문이 재실행되지 않는다는 말이다.
profile
개발자 (진)

0개의 댓글