옵셔널을 swift가 도입한 이유는??

3 답변 글타래를 보이고 있습니다
  • 글쓴이
    • odyflame
      참가자
      • 글작성 : 17
      • 답글작성 : 21

      안녕하세요.

      옵셔널을 swift가 도입한 이유는 무엇일까요?

      swift의 옵셔널의 정의와, 옵셔널을 쓸 때 확실히 편한 점은 분명 어디든 볼 수 있습니다.

      그런데 옵셔널을 정확히 왜 도입했는지는 코드의 가시성? 말고는 잘 모르겠더라구요

      swift말고 c, java등 옵셔널을 안 쓰는 언어도 분명 존재한데 이러한 언어들이 옵셔널이 없다고 해서 그러한 처리를 못해주는 것은 아니잖아요. 트라이캐치등 예외처리를 해줄 방법들이 존재하는데 swift의 옵셔널이 특히 특별한 이유는 무엇일까요??

    • jcrescent61
      참가자
      • 글작성 : 0
      • 답글작성 : 2

      안녕하세요 odyflame 님 반갑습니다 😊
      야곰 스타터캠프 3기 이수중인 엘렌이라고 합니다 !

      개인적으로 Swift를 처음 공부하게 되면서 가장 처음 옵셔널을 접하게 되는 경우는 readLine() 을 사용해 유저에게 입력을 받는 경우였는데요,
      이후 별도의 강제 추출 또는 옵셔널 바인딩 후 값을 추출하게 됩니다. 파이썬으로 처음 코딩을 시작한 저에겐 정말 이해하기도 어렵고 불편한 기능 중 하나였습니다…

       앞서 말씀하셨던 것 처럼 C언어나 심지어 Objective-C 에서도 옵셔널을 찾아볼 수 없는데요.
      알고계시겠지만 스위프트에서는 변수 또는 상수에 값이 없는 경우에(nil) 해당 변수, 상수에 접근한 경우 잘못된 메모리 접근으로 런타임 오류가 발생합니다.
      실제 어플리케이션 사용 중 런타임 오류가 발생한다면 프로그램 종료 등의 크리티컬한 문제가 발생하겠죠…🥲
      그래서 애초에 프로그래머가 저지를 수 있는 실수를 방지하기 위해 여러가지 기능이 존재하는데요, 그 중 하나가 옵셔널입니다.
      try catch는 로직상 오류나 동작 오류 이후에 후 처리하는 것이지만 옵셔널은 잘못된 메모리 접근에 대하여 원천적인 방어가 가능합니다.
       Swift가 안정성을 지향하는 언어이기 때문에 엄격한 것 같습니다ㅎ
      작성시에는 까다롭고 불편하더라도 나중에 버그를 수정할때에는 굉장한 시간 절약이 된답니다!

      옵셔널 존재 이유에 대해서 간략하게 설명 드렸는데 충분한 답변이 되었는지는 모르겠네요…
      옵셔널 바인딩을 이용해 안전하게 값을 추출하는 방법이 궁금하시다면 또 댓글 남겨주세요!

      • 이 답변은 jcrescent61에 의해 2 years, 10 months 전에 수정됐습니다.
      • 이 답변은 jcrescent61에 의해 2 years, 10 months 전에 수정됐습니다.
      • 이 답변은 jcrescent61에 의해 2 years, 10 months 전에 수정됐습니다.
      • odyflame
        참가자
        • 글작성 : 17
        • 답글작성 : 21

        큰 도움이 되었습니다! 야곰 스타터캠프 저도 해보고싶네요 어떠신가요?? 

        • jcrescent61
          참가자
          • 글작성 : 0
          • 답글작성 : 2

          저나 다른 캠퍼 분들도 굉장히 만족하는 캠프생활을 하고있습니다!!!
          캠프에 대해서 궁금하신 사항이 있으시다면 jcrescent61@gmail.com 로 메일 보내주세요!!! 잘 읽어보고 상세히 답변드릴게요!!!

    • seongmin yim
      참가자
      • 글작성 : 0
      • 답글작성 : 1

      추가적으로 들은 생각인데요. 옵셔널을 사용하면 비동기적인 상황에서의 이점이 있다고 생각합니다. 프로퍼티의 값이 인스턴스가 생성되는 시점에 초기화되지 않을 수 있는데, 이런 특성이 있는 프로퍼티를 옵셔널로 지정하면 인스턴스가 생성된 이후에 적절한 타이밍에 프로퍼티를 초기화할 수 있는 장점이 있디고 생각합니다. 예를 들어, 이미지뷰의 이미지를 서버에서 비동기적으로 받아온 후에 초기화 시킨다고 할때, 이미지뷰 객체가 생성되더라도 실제 이미지 프로퍼티는 옵셔널이므로 서버에서 통신이 완료된 후에 초기화를 시킬 수 있어요. 만약에 옵셔널이 아니라면 이미지뷰를 초기화할때 일단 비어있는 이미지를 생성해서 넣어줘야할거에요.

      만약 다른 언어처럼 모든 변수가 null로 초기화 될수 있다면, 이미지를 null로 한다음에 통신이 완료되면 이미지를 초기화시킬 수 있겠지만… 모든 변수가 null이 될 수 있는 가능성을 열어놓으면 너무 위험할거라고 생각됩니다. 그렇다고 모든 변수를 null 가능성을 체크하는것도 번거로울것 같아요. swift처럼 nil이 될 수 있는 가능성이 있는 변수만 optional로 지정해 놓으면 (이미지 뷰의 이미지처럼) optional이 아닌 변수에 대해서는 nil이 될 수 있는 가능성을 배제할 수 있을 것 같아요.

      • odyflame
        참가자
        • 글작성 : 17
        • 답글작성 : 21

        확실히 그렇겠네요. Swift가 안정성을 추구하는 언어인데 모두가 nil이 될수있다면 좀 곤란할거 같아요

        좋은 답변 감사합니다

    • Pilvi
      참가자
      • 글작성 : 0
      • 답글작성 : 1

      저는 다른 언어를 알지 못해서, 처음 배울 때 Swift의 특징으로 ‘Optional’을 꼽는 것이 왜 그럴까 궁금했었어요. 

       

      많이 생각하다보니 깨달은 것은,

      (제가 다른 언어는 잘 모르지만) 사실! 옵셔널을 겉으로 표시하지 않는 모든 언어에서 쓰는 값들이 오히려 모두 옵셔널!이었다는거에요. 

      즉, 모든 인스턴스들이 nil일 가능성을 내포하고 있는 것이죠. (번거롭게도 try catch 등의 예외처리가 필요하죠.)

       

      그래서 저는 Swift에서 ‘옵셔널’의 존재 이유는, ‘논옵셔널’인 인스턴스를 만들 수 있도록 했다는 것에서 큰 의미가 있었던 것이구나 하고 깨달았어요. 

      논옵셔널로 생성한 인스턴스에 nil이 절대 할당되지 않는다는 것을 확신할 수 있죠! (굉장히 안전하죠)

       

      기존의 try catch 등의 예외처리를 (제가 볼 땐 보다 간편한)옵셔널 언래핑 방식으로 대체하고, 

      그러한 처리를 하지 않아도 되는 논옵셔널의 편리함에서 Swift의 대단함을..? 느꼈습니다.ㅎㅎ 

       

      제 소소한 생각이었는데, 도움이 되었으면 좋겠습니다:)

       

      • 이 답변은 Pilvi에 의해 2 years, 10 months 전에 수정됐습니다.
      • 이 답변은 Pilvi에 의해 2 years, 10 months 전에 수정됐습니다.
      • 이 답변은 Pilvi에 의해 2 years, 10 months 전에 수정됐습니다.
      • 이 답변은 Pilvi에 의해 2 years, 10 months 전에 수정됐습니다.
      • 이 답변은 Pilvi에 의해 2 years, 10 months 전에 수정됐습니다.
3 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom