• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    해결됨

계산 프로퍼티 질문입니다.

19.08.06 00:47 작성 조회수 487

0

안녕하세요. 강의 잘 듣고있습니다.

질문드리겠습니다.

계산 프로퍼티는 틀이 기본적으로

var computedP : Int {

}  이렇잖아요?

근데 { }  이부분이 어디서 유래되어서 나온 틀인지 궁급합니다.

함수처럼 안에 코드를 작성하기때문에 {}를 사용하나요? 

인터넷에서 검색해보았지만,

스위프트에서 계산프로퍼티 기본 틀을

var computedP : Int {

}   이런식이다 라고 딱 명확하게 명시해주는 글을 보지 못해서 헷갈립니다. 

 

또 다른 질문이 있는데

왜 

 var first = 10

  var second = 20

  

 // var total1 = first + second    불가능  func으로 해야함

클래스 안에서  주석처리한 부분처럼 작성이 안된다는건 이해했는데

어떤 이유에서 안되는지 궁금합니다.

왜 계산프로퍼티나 함수안에서만 가능한건가요? 

 

답변 1

답변을 작성해보세요.

1

안녕하세요

 

property관련 

var computedP : Int {

}  

여기서 property에 대한 정의를 위해 {}괄호안에 코드를 넣는건 그냥 swift 문법 규칙이라서 딱히 이유가 있다고 말하긴 어려울 것 같습니다.

그 괄호 안에 set, get, observer등 여러가지 설정등을 할 수 있다고 보시면 됩니다.

 

var first = "lee"

var last = "jieun"

var fullName : String {

   return first + last

}  

get만 있는 property라면 이런 느낌이겠죠

 

var total1 = first + second    불가능에 대해

 

이걸 class나 struct에서 그냥 쓰면 아래와 같은 에러가 나올겁니다.

Cannot use instance member 'first' within property initializer; property initializers run before 'self' is available

property initializer에서는 인스턴스 멤버를 쓸 수 없다면서 사용하려면 self가 사용 가능하게 해야 한다고 나오네요.

이 에러를 보고 바로 이해 하실수도 있지만 풀어보자면.

 

 

SomeClass가 있다고 할 때

class SomeClass {

    var first = 10

    var second = 20

   func someMethod() {

      print("hi") 

  } 

}

 

let someClass = SomeClass()

이렇게  initialize 해야 메모리에 올라가서 instance된 someClass가 사용가능하게 됩니다.

 

someClass.first

안에 있는 instance member들은 뭐 이런식으로 접근해서 사용하겠죠.

 

이건 거의 모든 프로그래밍이 class라는걸 이런식으로 메모리에 올려서 사용할 수 있게 만들기 때문에 매우 중요한 개념입니다.

 

즉 instance화 되기 전에 class안에 들어있는 first와 second는 메모리에 올라가 있지 않은 존재하지 않는 것들입니다.

 

그러므로 아래와 같은 코드를 그냥 class안에서 선언해 버리면 존재하지도 않는 first, second를 사용하는건 안된다고 에러가 나오는 것이죠.

var total1 = first + second

 

 

그리고 마지막으로

function안에 있는건 행동이 전혀 다릅니다.

예를들어 아래와같은 function이 있으면

   func someMethod() {

      var a = 10

      var b = 20

      var c = a + b 

      print(c) 

  } 

 

someMethod()이렇게 보통 호출하죠 이렇게 호출하면

function안에 있는건 async같은걸 이용해 실행순서를 바꾸지 않는한 무조건 순차처리를 보장합니다.

변수 a 생성

변수 b 생성

변수 c 생성

print 실행

즉 일반적으로 작성한 코드라면 이렇게 순서대로 실행되는게 절대로 바뀌지 않습니다.

그러니 변수 c가 실행하기 전에 a, b 가 무조건 initialize 되니 var c = a + b 이게 무조건 가능한 상태가 됩니다.

 

 

참고로 지금 설명중 static을 사용하면 예외사항이 생깁니다. 

지금은 static부분은 몰라도 되고 지금 내용을 충분히 이해한 후 static을 사용할 일 있을 때 개념 찾아보시면 쉽게 이해하실 수 있을 겁니다.

 

 도움 되셨길 바랍니다.