본문 바로가기

iOS-Study

iOS Study : 11주차 - 기초 문법 공부

MVC(Model, View, Controller) 패턴

Model

  • 어플리케이션이 무엇을 말하는지를 말한다.
  • 계산기 앱에서는 계산을 하는 부분

Controller

  • 모델이 스크린에 어떻게 표현될 것인지를 말한다.
  • 기본적으로 모든 컨트롤러에 들어가는 UI 로직

View

  • 컨트롤러의 하위 종속자
  • 컨트롤러가 화면에 무언가를 보여주기 위해 사용

MVC 사이의 관계

  • Controller
    • 컨트롤러는 모델의 모든 것을 알고 있고 보내고 싶은 요청을 언제든지 보낼 수 있다.
    • 컨트롤러는 사용자에게 모델에 있는 것을 표현하거나 사용자로부터 정보 받아 모델을 업데이트 하는 것이기 때문에
      전체적인 통제가 필요하다.
    • View의 경우도 마찬가지이다.
    • 대부분의 뷰와 모델의 연결은 outlet을 통해서 이루어진다.
  •  Model
    • 모델과 뷰는 서로 소통하지 않는다.
      • 모델은 UI와는 독립적이기 때문에 UI에 의존하는 뷰와는 소통할 이유가 없기 때문
    • 뷰와 모델간의 소통은 컨트롤러를 통해 이루어진다.
    • 모델을 컨트롤러에게 직접적으로 말할 수 없다.
      • 컨트롤러는 UI로직을 다루고, 모델은 UI와는 별개이기 때문
  • View
    • 뷰와 컨트롤러간의 소통은 제한적이다.
    • 뷰는 컨트롤러에 대해 하위종속적이기 때문에 UI에서 일어나는 모든 일들을 컨트롤러에게 말해야 한다.
    • 뷰와 컨트롤러 사이의 의사소통은 눈에 보이지 않고 구조화 되어야 한다.
      • 일반적으로 control + 드래그를 통한 타겟 액션이 있다.
    • 뷰는 자신이 보여주고 있는 데이터를 소유할 수 없다.

 

Class와 struct의 차이

  • struct(구조체)는 enum처럼 값으로 전달된다.
    • 값으로 전달한다는 의미는 전달할 때 복사한다는 의미이다.
    • Array, Int, Double, String 모두 struct이다.
    • 예를 들어 Array를 다른 메소드로 전달한 다음  그 Array에 무언가를 추가하더라도 호출하는 쪽의 Array에는 아무 변화가 없다.
  • 클래스는 참조형식으로 전달된다.
    • 참조형식의 경우 heap영역에 저장되었다가 전달하게 되면 값 그 자체가 아닌 메모리의 주소를 전달하게 된다.

 

Tuple(튜플)

  • 스위프트의 타입 중 하나로 서로 다른 타입들을 그룹으로 묶어서 하나의 타입으로 만들어 타입이 들어갈 자리라면 튜플을
    어디서든지 사용 가능하다.
  • 튜플을 사용할 때 외부 매개변수를 사용하여 호출할 수도 있다.

예시

let x: (String, Int, Double) = ("Hello", 10, 0.5)
let (word, number, value) = x
print(word)		//Hello
print(number)	//10
print(value)	//0.5

//외부 매개변수 사용
let x: (w: String, i: Int, v: Double) = ("Hello", 10, 0.5)
print(x.w)
print(x.i)
print(x.v)

 

Range

  • 범위는 무엇이든지 연속될 수 있는 것의 양 끝점을 가르킨다.
  • ... 이나 ..< 기호를 사용하여 표현한다.
  • 배열에도 사용 가능하고 일반 숫자에도 사용 가능하다.

예시

let array = ["a", "b", "c", "d"]
let subArray1 = array[2...3]  //c, d
let subArray2 = array[2..<3]  //c
for i in 1...10 { }

 

Data Structures(데이터 구조)

Class, Struct, Enum의 특징

공통점

  • 키워드 + 이름 + { } 구조로 비슷한 방법으로 선언이 된다.
  • 모두 프로퍼티와 함수를 가질 수 있다.

차이점

  • 클래스와 구조체와 달리 enum은 저장 프로퍼티를 가질 수 없다.
  • enum을 제외한 클래스와 구조체는 초기화 함수가 필요하다.
  • 클래스만 상속이 가능하다.

Class와 struct의 차이

  • struct(구조체)는 enum처럼 값으로 전달된다.
    • 값으로 전달한다는 의미는 전달할 때 복사한다는 의미이다.
    • Array, Int, Double, String 모두 struct이다.
    • 예를 들어 Array를 다른 메소드로 전달한 다음  그 Array에 무언가를 추가하더라도 호출하는 쪽의 Array에는 아무 변화가 없다.
  • 클래스는 참조형식으로 전달된다.
    • 참조형식의 경우 heap영역에 저장되었다가 전달하게 되면 값 그 자체가 아닌 메모리의 주소를 전달하게 된다.

 

Array(배열)

  • 배열의 정식 표현은 var a = Array<String>() 이지만 약식 표현인 var a = [String]()을 많이 쓴다.
  • 배열의 객체를 생성할 때 스위프트 자체의 타입 추론 때문에 자료형을 안써줘도 된다.

예시

let animals = ["Giraff", "Cow", "Dog", "Cat"]

//배열 나열하는 법
for animal in animals {
  print("\(animal)")
}

Array Methods

filter

  • 배열에서 조건에 맞는 값을 찾아서 true인 값만 반환시킨다.
let bigNumbers = [2,40,50,11].filter({$0 > 20}) //20보다 큰 숫자
print(bigNumbers) //40,50

 

map

  • Array안에 있는 각 요소들을 다른 것으로 바꾼다.
//Int로 되어있는 배열을 String으로 바꾼다.
let stringified: [String] = [1,2,3].mpa{String($0)}

 

reduce

  • Array의 결과를 하나로 줄인다.
//배열 안의 수를 다 더한다.
let sum = [1,2,3].reduce(0) { $0 + $1 }
print(sum)

 

Dictionary

  • Array와 비슷하지게 key-value로 이루어져 있고 [ ]를 더 많이 사용한다
var exDictionary = [String:Int]()   //String이 key, Int가 Value
exDictionary = ["Stanford":1, "Cal":10]
let ranking = exDictionary["Ohio State"]
print(ranking)  //nil
let rank = exDictionary["Stanford"]
print(rank!) //1

//Dictionary 나열하는 법
for (key,value) in exDictionary {
  print("\(key) = \(value)")
}

 

Other Classes

NSObject

  • 모든 Objective-C 클래스들의 기본 클래스

NSNumber

  • Objective-C에서의 구조체는 스위프트의 구조체와 같지 않고 C의 구조체와 유사하다.
    Array와 Dictionary는 클래스이고, Double과 Int는 C의 double, int와 같다.
  • Array안에 숫자를 넣으러면 Array는 객체로 되어 있고, double과 int는 C 원시타입이기 때문에 넣지 못한다.
    이 때 사용하는 것이 NSNumber이다. NSNumber는 원시타입을 객체 안에 포장하기 위한 방법인 것이다.

NSDate

  • 날짜는 온 지구상에서 다른 방법으로 표현되기 때문에 UI에 날짜를 넣으려면 주의해야 한다.
  • Date 클래스는 이 방법들을 다 알고 있고, NSCalender, NSDateFormatter, NSDateComponents같은 
    날짜를 넣을 때 도움이 되는 형제 클래스들이 있다.

NSData

  • 현재 날짜와 시간을 알려준다.

 

AnyObject

  • 타입중 하나로 모르는 클래스의 객체에 대한 포인터 주소를 뜻한다.
  • 클래스에 대한 객체에만 사용하고 구조체에는 사용하지 않는다.
  • 어떤 객체가 많은 타입이 될 수 있어서 무슨 타입인지 모를 때 AnyObject로 타입을 지정해 준다.
  • AnyObject를 사용하면 우리가 아는 타입으로 변환을 해주어야 하는데 변환하려고 할 때 그 타입이 아닐수도 있기 때문에
    as 키워드를 사용하여 시도를 한다. 그렇기 때문에 반환 타입은 옵셔널이다.

Property List

  • AnyObject를 사용하는 또 다른 곳이다.
  • 기본적으로 Array, Dictionary, String, Double, Int, NSData, NSDate의 조합으로 되어 있다.
    이 클래스들로 데이터 구조를 만들면 Porperty List가 생긴 것이고 표현하기 위한 단어이다.