🍎 IOS/SwiftUI

SwiftUI 강의추천 및 리뷰 - Stanford University's course CS193p

콩리또 2022. 5. 17. 23:56

안녕하세요 콩리또입니다.

이미 아시는 분들이 더 많으시겠지만..?

오늘은 SwiftUI를 이용해 IOS 앱을 만들어볼 수 있는 온라인 강의를 소개해드릴게요!

무려 Stanford 대학!!!에서 20, 21년도에 온라인으로 진행한 강의를 볼수 있습니다!

(참고로 SwiftUI가 업데이트가 많이 되서 21년도 강의 영상을 추천드려요!)

 

강의는 재미있는 게임 만들기를 통해 완전 기초부터 SwiftUI를 알려주고 있습니다.

강의는 영어로 진행되지만 저 같은 개린이도 이해하기 쉽게 기초부터 하나하나 알려주셔서

SwiftUI 초보자분이 듣기에 정말 좋은 강의 같아요!

저와 함께 도전해보아요!!👊👊

 

https://cs193p.sites.stanford.edu/

 

CS193p - Developing Apps for iOS

The following two lectures (Enroute) were given in Spring 2020, but not in Spring 2021.  The material covered (Picker, using Codable to pull data from a REST API, and CoreData) is still relevant (as of Spring 2021 anyway), so those lectures are include

cs193p.sites.stanford.edu

 


 

여기서부터는 강의 1편을 듣고 저의 느낀점과 배운점을 작성해보려고합니다.

여러분께도 도움이 되는 지식이였으면 좋겠네요ㅎㅎ

자~ 그럼 시작합니둥~🙃

 

① SwiftUI는 함수형 프로그래밍?!

Paul Hegarty 겨수님이 게속 Swift는 함수형 프로그래밍 언어라고 강조를 하시던데

저는 개발 까막눈이라 함수형 프로그래밍이 뭔지 궁금하더라고요🤔

그래서 간단하게 찾아봤습니다

 

일단 프로그램을 만들때 원하는 목표에 따라서 적절한 방법과 기법을 활용해 프로그램을 만들어나게되는데

그 목표에 따라 프로그래밍 패러다임을 선택하게됩니다.

바로 그 프로그래밍 패러다임에 우리가 궁금해하는 함수형 프로그래밍 등이 속해있습니다! 

( 다른 종류로는 절차지향 프로그래밍, 객체지향 프로그래밍 등이 있다고 하네요..  지금은 뭔지 모르겟지만 나중에 다룰 기회가 있겠죠?)

 

함수형 프로그래밍을 아래와 같이 간단하게 정리해보았습니다!

더보기

함수형 프로그래밍

  • 수학의 원리와 관련이 있음 > 주어진 데이터를 처리해서 결과값을 도출
  • 파이프 라인과 비교가능
    • INPUT을 넣으면 어떤 처리과정을 거쳐서 OUTPUT이 나옴
    • 파이프의 외부에서 내부에 접근할 수 없고, 내부에서도 외부에 접근할 수 가 없음
  • 함수형 프로그래밍을 이용해 프로그램을 만든다는것은 이런 함수를 적용하고 묶어서 프로그램을 구성해나가는것을 말함

함수형 프로그래밍의 특징

  • 순수함수
    • 동일한 인자를 넣었을때 항상 동일한 결과값을 반환함
    •  언제 선언이 되었는지, 외부에 전혀 영향을 받지않도록 작성해야함 

 

  • 비상태, 불변성
    • 전달된 데이터를 변경하는게 아닌 새로운 버전의 새 오브젝트를 만들어서 결과 값으로 전달해야함
    • 외부의 상태나 함수에 인자로 전달된 데이터의 상태를 변경하지않음 → side effect를 만들지 않음
    • (side effect : 함수를 호출하면 외부의 상태가 변경되거나 예상치 못한 에러가 발생하는 등의 현상)
    • 불변성을 유지하기 떄문에 여러 동시다박적 멀티쓰레딩 환경에서도 안정적으로 동작

 

  • 선언형 함수 (Expressions Only)
    • if, for, switch과 같은명령문을 사용하지않고 함수형 코드를 사용해야함

 

  • 1급 객체와 고차함수 (Fist-class, Higher-order functions)
    • 함수형 프로그래밍에서는 함수가 1급 객체가 되며, 고차함수의 특성을 가진다.
1급 객체 - 변수나 데이터 구조안에 담을 수 있다.
- 파라미터로 전달 할 수 있다.
- 반환값(return value)으로 사용할 수 있다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
- 동적으로 프로퍼티 할당이 가능하다.
고차 함수 - 함수를 인자로써 전달 할 수 있어야함
- 함수의 반환 값으로  다른 함수를 사용   있음

 

 

음.. 한마디로 함수형프로그래밍은 함수를 이용해서 기능을 구현하는 방식인것같군요?!

항상 정해진 함수에 동일한 값을 넣으면 같은 결과가 나오기때문에 사이드 이펙트가 발생하지 않는것이 특징같습니당

글 작성하면서 더 찾아보니 아래 영상에서 저 같은 코린이도 이해하기 쉽게 잘 설명해 주셔서 첨부합니다.

한번씩 봐주시면 더 명확하게 이해하실 수 있을 것 같아용

 

 

 


 

② var body: some View가 머야..?🤔

우리가 Xcode에서 IOS App 파일을 만들면 항상 기본으로 ContentsView에 아래 코드가 나옵니다.

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .padding()
    }
}

 

근데!! 여기서 항상 struct 밑의 var body: some View에 대해 생각해보신적 있으신가요?

울희의 Paul Hegarty 겨수님이 상세하게 설명해주셨는데 듣고 제가 띠용?! 이럴수가?! 하며 배운 내용들을 아래에 정리해볼게요!

 

더보기

var body: some View

  •  body는 some view 타입이라는 의미 (body는 변수명일 뿐!!)
  • some View는 뭘까..?
    • 의미 : View 타입과 비슷한 뭔가가 올 것 (something that behaves like a View)
    • 사용이유 : body 안에 요소가 많아져 복잡해질 것이기 때문에 우리는 컴파일러가 타입을 알아내주기 원함  -> 그래서 Some View라고 작성하는것
  • body 본문
    • 실제 메모리에 저장되지 않음 (메모리에 저장되는 변수가 아님)
    • body 안에 작성하는 함수를 실행해 계산되는 변수일 뿐임 -> 안에있는 함수를 실행하고 반환하는 모든 것을 반환
    • 모디파이어 (수정자)를 줄 때마다 새로운 뷰를 생성함
  • body에 아무것도 안쓰면 오류나는 이유
    •  반환하는 항목이 없어서 -> body 무조건 일종의 View 반환해야함

 

허허 이럴수가~~! body가 그냥 변수명이였다니... 충격적이지 않나요?

Swift에서 some keywordOpaque Types(불투명한 타입) 해당한다고 하는데요

Opaque Type 특정한 타입을 반환하지 않고 프로토콜이나 프로토콜을 준수하는 타입 반환한다고 하네요!

그래서 body에는 View가 아닌 요소 (func 등..)은 들어갈 수 없나봅니당

더 자세한 내용을 아래 문서도 읽어주세요!

 

https://bbiguduk.gitbook.io/swift/language-guide-1/opaque-types

 

불투명한 타입 (Opaque Types) - Swift

아래의 코드와 같이 두개의 모양을 수직으로 결합하는 JoinedShape 구조체를 정의하는 이 접근방식은 뒤집힌 삼각형을 다른 삼각형과 결합하는 JoinedShape , Triangle> 과 같은 타입을 생성합니다.

bbiguduk.gitbook.io

 


 

③ 그외 알게된 사실

레이블에 관한 소소한 사실.. 

  • 레이블 :  함수 뒤에 () 안에 쓰는 것
  • 고유한 함수와 인수를 정의하고 인수가 무엇인지 명확하지 않을 때마다 레이블을 사용해서 정의해야함
  • 예시 : foregroundColor(.black)라고 쓰는 이유는 색상값이 올것이 명확하기 떄문임
  • (물론 foregroundColor(Color.black) 라고 써도 됨)

stack에 관한 소소한 사실...

  • 교수님이 stack은 레고가방이라고 하심 = View(레고)를 묶어주는 역할
  • 스택에 모디파이어를 넣으면 스택 안에 있는 함수들에게 적용된다. = 스택에 넣은 모디파이어 값이 디폴트 값이 됨
  • 고로, 스택 안 요소들에 기본값을 넣고 싶을때는 해당 스택에 모디파이어를 적용하면된당.

 


 

자, 이렇게 1강에서 인상깊었던 점들을 정리해보았습니다.

이거 쓰다가 2번 날라가서 고혈압으로 즉사할 뻔했지만...🤬🤯

어쩌겟어요 노트북을 부술 수도 없고...🥺 아무튼 이렇게 글을 마무리해서 좋네요

보시고 잘못된 내용이 있으시면 댓글부탁드려요!

모두 즐코딩하시고 좋은하루보내세요~