프로퍼티
메소드
타입 프로퍼티
저장 프로퍼티
@_@)???
import Foundation
import UIKit
//인스턴스 생성여부와 상관없이 타입프로퍼티의 값은 하나다.
struct User{
    static var originalName = "RealName" //타입 저장 프로퍼티
    var nickName = "NickName" //인스턴스 저장 프로퍼티
}
var user1 = User()
user1.nickName = "user1"
print(user1, User.originalName) //user1, RealName
var user2 = User()
User.originalName = "OriginalName"
print(user2, User.originalName) //NickName, OriginalName
var user3 = User()
print(user3, User.originalName) //NickName, OriginalName
var user4 = User()
//연산 프로퍼티(인스턴스 연산 프로퍼티 / 타입 연산 프로퍼티)
struct BMI{
    var nickname: String
    var weight: Double
    var height: Double
    
    //저장 프로퍼티는 메모리 0, 연산 프로퍼티는 저장 프로퍼티를 활용해서 주로 원하는 값을 반환하는 용도로 사용
    //계산하는 값에 따라 결과가 달라져서 변수 var 선언하지만 읽기 전용(read-only) 프로퍼티
    var BMIResult: String{
        get {
            let bmiValue = (weight * weight) / height
            let bmiStatus = bmiValue < 18.5 ? "저체중" : "정상"
            return "\(nickname)님의 BMI 지수는 \(bmiValue)로 \(bmiStatus)입니다."
        }
        set {
            nickname = newValue
        }
    }
}
var bmi = BMI(nickname: "NickName", weight: 50, height: 180)
let bmiValue = (bmi.weight * bmi.weight) / bmi.height
let bmiStatus = bmiValue < 18.5 ? "저체중" : "정상"
var result = "\(bmi.nickname)님의 BMI 지수는 \(bmiValue)로 \(bmiStatus)입니다."
print(result)
print(bmi.BMIResult)
bmi.BMIResult = "set nickname"
print(bmi.BMIResult)
class FoodRestaurant{
    let name = "Chicken"
    var totalOrderCount = 0
    
    var newOrder: Int{
        get {
            return totalOrderCount * 5000
        }
        set {
            totalOrderCount += newValue // newValue 기본 파라미터, 변경가능
        }
    }
}
let food = FoodRestaurant()
print(food.newOrder)
food.totalOrderCount += 20
print(food.newOrder)
food.newOrder = 10
print(food.newOrder)
food.newOrder = 100
print(food.newOrder)
food.newOrder = 5
print(food.newOrder)
//열거형은 타입 자체, 인스턴스 생성 불가, 그래서 초기화 구문 없음
//인스턴스 생성을 통해서 접근할 수 있는 인스턴스 저장 프로퍼티 사용 불가
//인스턴스 연산 프로퍼티는 사용 가능
//메모리 관점 + 열거형이 컴파일 타임에 확정되야아 한다
//타입 저장 프로퍼티 = 열거형에서 사용가능
enum ViewType{
    case start
    case change
    
    //var nickname: String = "instance stored property"
    
    var nickname: String{
        get{
            return "nickname"
        }
    }
    
    static var title = "시작하기"
    
}
//let type = ViewType()
ViewType.title
//인스턴스 저장 프로퍼티는 메모리에 올라가야함, 값이 달라질 수 있음, 열거형(초기화 구문만들수 없기 때문에)에서 사용불가
//타입 프로퍼티는 인스턴스랑 상관없이 접근 가능. 따라서 열거형에서 타입 저장 프로퍼티, 타입 연산 프로퍼티는 모두 사용 가능.
//타입 저장 프로퍼티, 타입 연산 프로퍼티, 인스턴스 저장 프로퍼티, 인스턴스 연산 프로퍼티