본문 바로가기
🍎iOS프로그래밍/오늘의 공부

Swift의 프로퍼티 [Stored property, computed property] / iOS프로그래밍

by 둥둥동동# 2021. 10. 1.
728x90

Class의 프로퍼티(property)

 

클래스 구성

프로퍼티, 초기화방법

스토어드 프로퍼티(Stored property)

컴퓨티드 프로퍼티(Computed property)

 

클래스구성, 프로퍼티

 

class human{
    var age:Int = 100
    var name:String = "noName"
    
    func out(){
        print("나이:\(age)세 , 이름:\(name)")
    }
}
var Kim:human = human()
Kim.out()//나이:100, 이름:noName
cs

클래스는 크게 프로퍼티[age, name]와 메서드[out()]로 구성되어 있습니다

이번 포스팅은 프로퍼티에 대해 포스팅 하도록 하겠습니다

 

프로퍼티는 두가지 종류가 있습니다. 

  • Stored 프로퍼티
  • Computed 프로퍼티

 

프로퍼티 초기화

 

클래스를 객체화 시키려면 꼭 퍼로퍼티의 초기화 작업이 필요합니다

인스턴스를 생성할 때 프로퍼티를 초기화하지 않는다면 아래의 오류가 나타나게 됩니다

age프로퍼티의 초기화를 하지 않았을 때

초기화 방법은 아래와 같습니다

  • 변수선언과 동시에 데이터 할당
  • 옵셔널타입 선언(nil값 할당)
  • 클래스의 init() 생성자 활용

 

1)변수 선언과 동시에 데이터 할당

class human{
    var age:Int = 100
    var name:String = "noName"
    
    func out(){
        print("나이:\(age)세 , 이름:\(name)")
    }
}
var Kim:human = human()
Kim.out()//나이:100, 이름:noName
cs

 

 

2)옵셔널 타입으로 선언

class human{
    var age:Int//초기화하지 않아서 nil할당
    var name:String! //초기화하지 않아서 nil할당
    
    func out(){
        print("나이:\(age)세 , 이름:\(name)")
    }
}
var Kim:human = human()
Kim.out()//나이:100, 이름:noName
cs

 

 

3)init() 생성자 

class human{
    var age:Int 
    var name:String 
    
    func out(){
        print("나이:\(age)세 , 이름:\(name)")
    }
    
    init(age:Int, name:String){
        self.age = age
        self.name = name
    }
}
var Kim:human = human(age:1, name:"Kim")
Kim.out()//나이:1, 이름:noName
cs

 

init()생성자에 대한 자세한 포스팅은 아래링크에 있습니다

https://admd13.tistory.com/48?category=1230087

 

 

Stored property

 

Stored property는 우리가 일반적으로 알고 있는 프로퍼티 입니다

데이터를 대입할 때 까지 값을 유지하고 호출된 시점에 관계없이 일정한 값을 갖습니다

출력시 일정한 값을 갖습니다

 

 

computed property

 

단어 그대로 연산작업을 수행하는 프로퍼티 입니다

getter를 통해 자신의 값을 수정하고 setter로 다른변수의 값을 수정할 수 있습니다

 

프로퍼티를 호출?사용?할 때 마다 getter에서 연산된 값을 갖습니다 

class Man{
    var age: Int = 16
    var kg_w: Double = 20.5
    var lb_w: Double{
        get{ //setter가 없으면 생략가능
           return kg_w * 2.2 
        }
    }
    var job:String = "jobless"
    
    func display(){
        print("나이:\(age), 몸무게:\(kg_w)kg,몸무게\(lb_w)파운드 , 직업:\(job)")
    }
}
var Kim: Man = Man()
Kim.display()
//나이:16, 몸무게20.5kg, 몸무게(파운드):45.1 파운드, 직업:jobless
print(Kim.kg_w)//17.5
print(Kim.lb_w)//38.5 getter호출
Kim.kg_w = 19.5
print(Kim.lb_w)//40.7 getter 호출
cs

kg_w값에 따라  get 블럭에서 lb_w의 값이 정해집니다

위의 코드는 setter가 없기 때문에 get블럭을 아래와 같이 생략할 수 있습니다

var lb_w: Double{ return kg_w * 2.2 }
cs

 

 

setter는 아래와 같이 사용할 수 있습니다

class Man{
    var age: Int = 16
    var kg_w: Double = 1.6
    var lb_w: Double{
        get{ //setter가 없으면 생략가능
           return kg_w * 2.2 
        }
        set(newValue){//인자는 변수와 같은 타입, newValue는 생략가능
            kg_w = newValue + kg_w
        }
    }
    var job:String = "jobless"
    
    func display(){
        print("나이:\(age), 몸무게:\(kg_w)kg,몸무게\(lb_w)파운드 , 직업:\(job)")
    }
}
var Kim: Man = Man()
Kim.display()
//나이:2, 몸무게20.5kg, 몸무게(파운드):45.1 파운드, 직업:actor
print(Kim.age)//2
print(Kim.kg_w)//17.5
print(Kim.lb_w)//38.5 getter호출
Kim.lb_w = 1.0  //setter호출
print(Kim.kg_w)//18.5
print(Kim.lb_w)//40.7 getter 호출
cs

lb_w에 값을 대입하면 lb_w의 set블럭이 실행됩니다 이 때 매개변수 newValue는 lb_w의 자료형과 동일합니다 

setter에서 변경된 값은 실제 프로퍼티에도 반영되어 다른 프로퍼티의 값을 수정할 때 주로 사용됩니다

Kim.lb_w 에 1.0을 대입하면 newValue란 이름으로 setter인자로 넘어갑니다

매개변수 newVlaue가 기본이름이므로 '(newValue)' 는 생략이 가능합니다 

 

 

 

 

참고자료

iOS프로그래밍기초(21-2학기)한성현교수님 강의 내용

 

 

728x90
반응형

댓글