• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

변수 저장 질문

23.07.30 17:53 작성 조회수 145

0

IMG_0011.jpeg
변수에 값을 할당할때 두 단계를 나누지 않고 이미지처럼 userInput을 Int형으로 전환하고 바로 저장하지 않는 이유가 있을까요???

답변 1

답변을 작성해보세요.

1

네 안녕하세요! Jun Chae 님.

var userInput = readLine() 

에서 userInput 변수의 타입이 어떻게 되죠?
옵셔널 String 입니다.

즉, 위에 변수를.. 타입추론 방식이 아닌 타입을 붙여보시면 String? 입니다.

var userInput: String? = readLine() 


String? 타입을 (옵셔널 문자열 타입을)
정수의 생성자에 Int( .... ) 넣는 것이 안됩니다.

정수의 생성자에는 Int(문자열)만 가지고 변형이 되지, Int(옵셔널 문자열)로 변형이 안됩니다.

그래서, (1) 문자열로 먼저 변형하고 (옵셔널 바인딩), (2) 정수로 변형하고 있는 것이예요.

guard let input = userInput,  // 옵셔널 바인딩
      let number = Int(input) // 옵셔널 바인딩으로 문자열이 된 input을 정수타입으로 변형하고 옵셔널 바인딩
      else { break }


물론 두번째 과정에서는..
정수타입으로 변형 ( String 타입 ===> Int? 타입 ===> Int타입) 으로 옵셔널 바인딩까지 하고 있는 것입니다.

정수 타입으로 변형하는 과정..
즉, 아래의 과정은.. 원칙적으로 옵셔널 바인딩도 내포하고 있습니다.
(Int? 타입을 ===> Int으로 변형하는 과정)

guard let number = Int(input) else { break }


왜냐하면, 가드문이 아닌 곳에서

var number = Int(input)

이렇게 해보시면, number타입이 Int? 타입이 나올 것입니다. 왜냐면.. 문자열을 정수로 변형하는 과정에서 실패할 수도 있고, 실패하는 경우 nil이 나오기 때문입니다.


readLine( ) 함수는 문자열이 없는 경우(nil)도 대비하고 있기 때문에.. String? 타입이고, 옵셔널 바인딩을 한번하고, 정수로 변형하고 있다는 것을 이해하시면 됩니다.

물론 만약에 사용자한테서 입력값을 얻어오는 readLine 함수의 실행이 String?타입이 나오니..

var userInput = readLine()! 

뒤에 느낌표를 바로 붙여서 강제 언래핑한다면 말씀하신 대로 userInput변수의 타입이 String이 나오니.. 이때는 질문 주신 것처럼 바로 변환이 가능하긴 하죠. 이미 userInput변수의 타입이 String이니까요.
(다만, readLine( )! 이 강제 언래핑을 의미하니.. 유저가 아무것도 입력하지 않았다면.. nil이 나와서, 에러가 날 수 있겠죠. 에러의 가능성을 가져가는 것보다.. 올바르게 처리하기 위해.. 저는 옵셔널 바인딩으로 한번 과정을 거치는 것을 보여드린 것이고요!)


위의 내용을 천천히 잘 이해 해보시길 바라고,
만약에 위의 내용이 이해가 잘 안되신다면.. ㅠㅠ
옵셔널 타입과 옵셔널 바인딩에 대해서 학습이 필요하실 것으로 보입니다.

 

감사합니다 :)