iOS Swift란?

유예리·2022년 3월 15일
0

UMC

목록 보기
1/7

⭐️ KEYWORD ⭐️

1️⃣ 절차 지향 언어 And 객체 지향 언어 -swift는 어떤 언어일까?

❗️ "절차지향은 데이터 중심, 객체지향은 기능 중심"

절차지향 프로그래밍

  • 절차지향 프로그래밍는 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법.
  • 대표적 언어는 C언어
  • 컴퓨터 처리구조와 유사해 실행속도가 빠름
    하드웨어가 빠르게 발전하면서 컴퓨터 환경이 좋아지면서 모듈화, 캡슐화의 개념으로 접근하는 객체지향 프로그래밍이 등장.
  • 실행순서가 정해져 있어 코드 순서가 바뀌면 동일한 결과를 보장하기 어렵고, 디버깅과 유지보수가 어려움.

객체지향 프로그래밍

  • 객체지향은 실제 세계를 모델링하여 소프트웨어를 개발하는 방법.
  • 데이터와 절차를 하나의 덩어리로 묶어서 생각
  • 3대 특성 : 캡슐화, 상속, 다형성
    • 캡슐화 : 관련 데이터와 알고리즘(코드)가 하나의 묶음으로 정리된 것, 오류가 없어 사용이 편리함.
    • 상속 : 이미 작성된 클래스를 이어 받아서 새로운 클래스를 생성하는 기법, 기존 코드를 재활용해서 사용하는 것을 말함.(객체지향 방법의 장점)
    • 다형성 : 하나의 이름(방법)으로 많은 상황에 대처하는 기법, 개념적으로 동일한 작업을 하는 함수들에 똑같은 이름을 부여할 수 있어서 코드가 간단함.
  • 객체지향 언어는 신뢰성이 있는 소프트웨어를 작성할 수 있음
  • 코트를 재사용하기 쉽고 업그레이트와 디버깅이 쉽움.
  • 하지만 처리속도가 느리고 설계에 많은 시간이 필요함.

=> 🟧Swift 언어는 객체지향형, 함수형, 프로토콜 지향 프로그래밍을 모두 다룰 수 있는 언어이다.

단, iOS 프레임워크가 객체지향형 프로그래밍으로 구현되어 있어서, 객체지향 프로그래밍을 하도록 권장한다.

2️⃣ swift의 optional

❗️optional은 선택적인 것!

값이 있을 수도 없을 수도있는 경우를 위해서 필요함!

swift는 기본적으로 변수를 선언할 때 non-optional
즉, 어떠한 '값'을 변수에 주어야 함! nil값은X

예를들면 String값에는 무조건 문자열 타입이 들어가 있어야 함!

var name : String = "예리"
name = nil //에러!

-> 그런 이유에서 위 코드는 오류가 발생한다.
stringnil 문자열 타입의 값이 없으면 안되기 때문

그럼 값이 있을 수도 있고 없을 수도 있는 변수를 정의할 때는?

타입에 ?을 붙여준다!

이렇게 정의한 변수를 optional이라고 하고, 기본값은 nil값이 된다.

var name : String?
name = nil //오류가 생기지 않는다!

name = "예리"
print(name) //Optional(예리)

?을 붙여 optional값이 되면 코드가 실행되기 전에는 값이 있는지 없는지 알 수 없다.
따라서 아래와 같은 오류에 조심하자!
String string? -> 둘은 달라

let name : String? = "예리"
let nickName : String = name //에러!

⚠️optional 벗기기⚠️

❗️ "Optional Binding"과 "!"을 사용하자!

1. 강제추출(Forced Unwrapping) ! 사용하기

  • Optional 값을 강제로 추출하려면 옵셔널 뒤에 !를 붙인다.
var num: Int? = 1
if num != nil {
print("num is \(num!)") // num is 1
 }

-> 확실하게 값을 추출할 수 있는 방법이지만 옵셔널 값이 없다면 오류가 발생한다.
-> 더 안전하게 optional 벗기기 위해서는 Optional Binding을 사용하는 것이 좋다!

2. Optional Binding 사용하기

  • Optional Binding은 Optional 타입으로 선언된 변수에 값이 있는지 없는지 확인하고, 해당 값을 임시 변수나 상수에 할당해서 사용한다.
  • if문과 함께 사용된다.
if let name = optionalName {
    print(name) // optionalName의 값이 존재하면 해당 값이 출력된다.
}
//
// optionalName의 값이 존재하지 않는다면, 
//if문을 그냥 지나쳐서 이곳의 코드가 실행된다.

3️⃣ UI Kit

❗️ UI Kit은 프레임 워크다!

UIKit은 iOS와 애플 티비에 들어가는 앱을 빌드할 때 필요한 핵심 오브젝트(core object)를 지원한다.

Xcode는 UI기반으로 앱을 빌드하는데, UI요소가 오브젝트로써 기능하며 Library 버튼에서 오브젝트를 생성할 수 있다.

❗️UIKit이 사용된 어플리케이션은 "애플리케이션 아이콘"과 "Launch screen storyboard"(스플래쉬 스크린 in Adroid)을 필수적으로 가져야한다.

  • 애플리케이션 아이콘
    -> 앱스토어에서 어플을 다운로드 받을 때 보이는 그림, 보여질 그림을 말함.
    -> Assets.xcassets -> AppIcon 을 통해 기기별로 보이는 아이콘의 크기를 설정할 수 있음.

  • Launch screen storyboard
    -> 애플리케이션이 시작될 때 보여지는 화면을 말함
    -> 프로젝트를 만들면 자동으로 생성

⚠️무슨 컴포넌트를 제일 많이 사용하게 될까?⚠️

1. UIButton

  • 터치 기반으로 실제 물리적인 버튼이 없는 모든 스마트폰에서 앱을 원활하게 사용하기 위해서는 버튼 UI가 가장 필요하고, 가장 많이 사용할 것 같다.
  • 특히 아이폰이 홈버튼 등 버튼은 줄이고 화면은 키우고 있는 만큼 버튼을 어떻게 배치하고 사용하는지가 iOS개발에서 중요한 요소라고 생각한다.

2. UIImageView

  • 앱에서 특히, 서비스 앱에서는 이미지가 없는 화면이 없을 정도로 이미지가 큰 비중을 차지한다.
  • 이미지를 구현할 수 있는 UIImageView를 가장 많이 사용하게 될 거 같다.

-> UIImageView가 사용된 예시

3. UINavigation Bar

  • 안드로이드 기반 핸드폰은 아랫쪽에 뒤로가기 버튼이 있다면, 아이폰은 위 왼쪽에 뒤로가기 버튼이 있는게 기본이다. (처음 아이폰을 사용했을 때는 이 부분이 인지 부조화가 온다.)
  • 아이폰은 홈버튼이 있을 때 부터 페이지 뒤로가기 버튼이 없었다. 이전페이지를 가려면 항상 UINavigation Bar의 화살표를 이용해야한다.
  • 여러 개의 페이지를 다루는 앱에서는 UINavigation Bar의 계획적이고 직관적인 사용이 중요하겠다.

-> UINavigation Bar가 사용된 예시

4. UIPageControl

  • 개발을 하는 사람이라면 몇개의 페이지가 있는지 정확히 알 수 있겠지만, 이용하는 사람은 그렇지 않다.
  • 아래의 예시처럼 배경화면이 몇개가 있는지, 또 이미지 페이지에 이미지가 몇개가 있는지 쉽게 인지하도록 UIPageControl로 명시해주는 것이 중요하다고 생각한다.

-> UINavigation Bar가 사용된 예시

5. UILabel

  • 모든 앱에서 글씨는 빠질 수 없는 요소이다. 그 글씨는 삽입할 수 있는 UILabel은 자유자재로 사용해야하는 기본적인 요소라고 생각한다.

4️⃣ swift의 변수 선언 방식

❗️ letvar을 사용하자!

/*번수와 상수 선언 강의내용*/
//1.1 상수
let name: String = "uni"
let swift = "swift" //타입 추론으로 타입 정의X

//1.2 변수
var year : Int = 2022
var y = 2022 //타입 추론으로 타입 정의X

year = 2023
//print(year) //var은 변수라 값 변경가능

-> swift문법에서 변수와 상수는 다음과 같은 문법으로 선언한다.

⚠️letvar의 차이점은 뭘까?⚠️

❗️"중복선언"의 차이가 있다!

var은 중복선언이 가능하다.

// 첫번째 변수 선언+초기화 
var A = 1; 
console.log(A); // 1 
// 두번째 변수 선언+초기화 
var A = 2; 
console.log(A); // 2 
// 세번째 변수 선언(초기화X) 
var A; 
console.log(A); // 2

let은 중복선언이 불가능하다.

let a = 10; 
let a = 20; 
// SyntaxError: Identifier 'a' has already been declared

-> 이미 선언한 변수를 다시 선언하면 오류가 난다.

var의 변수 선언 방식에는 단점이 있다. 유연한 변수 선언으로 간단한 케이스에서는 편리하겠지만, 코드량이 많아지거나 협업을 해야하는 상황에서는 값이 바뀌거나 파악하기 힘들 수 있기 때문이다.

5️⃣ swift의 func

/*2. 함수만들기 강의내용*/
func sum(a: Int, b: Int) -> Int{
    return a+b
}

//print(sum(a: 1, b: 2))

func multiply(a: Int, b: Int) -> Int {
    a * b  //리턴 생략 가능
}

//print(multiply(a: 1, b: 2))

-> 함수는 func 키워드를 사용해서 정의하고, ->를 사용해서 함수의 타입을 반환한다.

print(multiply(a: 1, b: 2))

-> swift에서는 독특하게 함수를 호출할 때 파라미터 이름을 함께 써 주어한다.

6️⃣ swift의 class, srtucter

//강의내용
/* 3. 이름짓는 규칙*/
// 3.1 Lower Canel Case - 인스턴스 / 매소드 / 함수
// - 시작은 소무자 나머지 단어의 시작은 대문자
let viewContriller = UIViewController() //인스턴스를 생성

// 3.2 Upper Canel Case - 구조 / 클래스 / 프로토콜
// - 시작과 나머지 단어도 모두 대문자
struct Person{
    let a:Int
    let b:Int
} //구조체(스트럭쳐의 축약 struct사용) 'P'erson 시작을 대문자로 시작

class Operator {
    let a:Int //내부에 있는 a, b에 할당
    let b:Int
        init(a: Int, b:Int) {  //초기화 함수는 클래스, 인스턴스가 생성될 때 제일 최소에 호출되는 함수
        self.a = a
        self.b = b  //파라미터로 두 개의 값을 받음, 외부에서 호출
    }
} //클래스는 오류 (초기화 함수를 자동으로 생성해주지 않는다/구조체는 생성해줌)

protocol Flyable {
    func fly()
}

1. 클래스와 구조체

  • 구조체와 클래스는 OPP(객체지향)를 위한 필수 요소로 프로그램의 코드를 추상화하기 위해 사용한다.

  • swift에서는 다른 프로그래밍 언어와 달리 구조체와 클래스를 위한 별도의 인터페이스와 파일을 만들 필요가 없다.

  • Swift에서 클래스와 구조체는 많은 공통점이 있다. 클래스와 구조체 둘다 다음과 같은 기능이 가능하다.

    • 값을 저장하기 위한 프로퍼티 정의
    • 기능을 제공하기 위한 메소드 정의
    • subscript 문법을 이용해 특정 값을 접근할 수 있는 subscript 정의
    • 초기 상태를 설정할 수 있는 initializer 정의
    • 기본 구현에서 기능 확장
    • 특정한 종류의 표준 기능을 제공하기 위한 프로토콜 순응(conform)
  • 클래스만 가능한 기능은 다음과 같다.

    • 상속 (Inheritance) : 클래스의 여러 속성을 다른 클래스에 물려 줌
    • 타입 캐스팅 (Type casting) : 런타임에 클래스 인스턴스의 타입을 확인
    • 소멸자 (Deinitializers) : 할당된 자원을 해제(free up) 시킴
    • 참조 카운트 (Reference counting) : 클래스 인스턴스에 하나 이상의 참조가 가능
  • 구조체를 사용하는 것이 유리한 경우는 다음과 같다. (애플은 다음 조건 중 하나 이상에 해당한다면 구조체를 사용하는 것을 권장한다.)

    • 연관된 간단한 값의 집합을 캡슐과 하는 것만이 목적일 때
    • 캡슐화한 값을 참조하는 것보다 복사하는 것이 함당할 때
    • 구조체에 저장된 프로퍼티 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때
    • 다른 타입으로 부터 상속받거나 자신을 상속할 필요가 없을때

2. 선언 문법

  • 클래스와 구조체 둘다 비슷한 문법을 갖고 있다. 클래스는 class키워드를 구조체는 struct키워드를 적어 선언할 수 있다.
class SomeClass {
    // 클래스 내용은 여기에
}
struct SomeStructure {
    // 구조체 내용은 여기에
}

7️⃣ swift의 init

❗️초기화 (Initialization)

  • 초기화는 클래스, 구조체, 열거형 인스턴스를 사용하기 위해 준비 작업을 하는 단계이다.

  • 이 단계에서 각 저장 프로퍼티의 초기 값을 설정한다. 초기화 과정은 initializer를 정의 하는 것으로 구현할 수 있다.

initializer

  • 이니셜라이저는 특정 타입의 인스턴스를 생성한다. 이니셜라이저의 가장 간단한 형태는 파라미터가 없고 init 키워드를 사용하는 것이다.
init() {
    // perform some initialization here
}

8️⃣ swift의 Break Point

❗️일시정지 포인트!

  • 브레이크 포인트는 실행중인 앱을 일시정지하는 포인트다.
  • Xcode 소스코드의 라인 넘버를 클릭하면 파란 화살표가 나타나면서 브레이크 포인트가 생성된다.

-> 브레이크 포인트는 대체로 디버깅을 하는데 사용합니다. 원하는 결과가 나오지 않았을 때 일시정지하여 버그의 위치를 파악하고 수정할 수 있다.

출처 : 링크텍스트, 컴공선배

profile
건축학도의 PM 도전기

0개의 댓글