[Swift] 기본 개념 예제2

Zoe·2022년 2월 9일
0

Swift

목록 보기
16/21
post-thumbnail

기본 개념 예제2

✅ 함수

1️⃣ 기본 호출

import Foundation
func hello(name: String) -> String {
    return "Hello! " + name
}
let message = hello(name: "jay")

print("Hi~~")
print(124)
print(message)

2️⃣ 파라미터 값이 지정되어 있을 때 호출

func addTwoNumbers(num1: Int, num2: Int = 100) -> Int {
    let sum = num1 + num2
    return sum
}

addTwoNumbers(num1: 5, num2: 10)
addTwoNumbers(num1: 5)

3️⃣ 파라미터 값으로 여러 값을 넘김

func addNumbers(numbers: Int...) -> Int {
    var sum = 0
    for num in numbers {
        sum += num
    }
    return sum
}

addNumbers(numbers: 1, 2, 3, 4, 5)

4️⃣ 반환 타입이 튜플

func myInfo() -> (name: String, weight: Int) {
    return ("jay", 44)
}

let info = myInfo()
print(info.name)
print(info)

5️⃣ print : separator, terminator

print(123, "Hello", true, 123.456, separator: "---", terminator: "")

6️⃣ Lable

func calculate(_ num1: Int, _ num2: Int) -> Int {
    return num1 * num2
}

func calculate(devideFirstNumber num1: Int, bySecondNumber num2: Int) -> Int {
    return num1 * num2
}

calculate(10, 10)
calculate(devideFirstNumber: 10, bySecondNumber: 10)

7️⃣ 함수의 매개변수는 상수 let

  • 함수 안에서 실수로 변경하지 못하도록 하기 위함
func add(num1: Int, num2: inout Int) -> Int {
    num2 = 7
    return num1 + num2
}
var test1 = 1
var test2 = 2
add(num1: test1, num2: &test2)
//test1은 복사, test2는 참조
//call by value
//call by reference
print(test2)
  • 값이 복사됐는지 참조됐는지는 메모리 주소를 보면 알 수 있음
  • 메모리 주소 : 값이 저장될 때 메모리 어딘가 저장되는데 그 어딘가가 주소임

✅ 16진수를 사용하는 이유

  • 컴퓨터는 전기적인 신호가 거의 없거나 전기적인 신호가 일정 이상일 경우, 두 가지 상태만 구분 가능
  • 01 : bit
  • bit2가지라서 큰 의미가 없음
  • 1byte : 8bit
  • 0 ~ 255
  • 0x0 ~ 0xff
0 == 0x0
255 == 0xff

65535 == 0xffff //2bytes 최대값

🌟 byte와 16진수는 찰떡 궁합임
🌟 2진수 데이터를 16진수로 간결하게 표현 가능

  • 64bit => 8bytes 로 주소 표현
0b1111 == 0xf
0b11111111 == 0xff

✅ 클래스

1️⃣ 기본

  • 함수, 변수, 상수를 관리
class Circle {
    //클래스는 프로퍼티에 초기값을 설정하지 않으면 에러남
    var radius = 10.0//프로퍼티
    let pi = 3.1415926535//프로퍼티
    
    init() {//생성자에서 초기값 설정
        radius = 10.0
    }
    init(radius: Double) {//생성자에서 초기값 설정
        self.radius = radius//self 키워드는 프로퍼티를 가리킴, 파라미터와 구별지음
    }

    func area() -> Double {//메소드
        return radius * radius * pi
    }
}

//클래스를 동작시키려면 클래스의 인스턴스를 만들어야 함

let circle = Circle()//실제적으로 컴퓨터 메모리에 저장됨
//객체와 인스턴스 용어를 혼용하여 사용함

let c = Circle.init() // 생성자 함수
circle.area()

2️⃣ Int, String

var w0 = 44
var w1 = Int.init(44)
var w2 = Int(44)//생성자는 생략가능
  • Int 자료형은 구조체
var m0 = "Hello"
var m1 = String.init("Hello")
var m2 = String("Hello")
  • String 자료형도 구조체

3️⃣ 배열 생성 방법

var nums0 = [2, 4, 6, 8]
var nums1 = [Int].init(arrayLiteral: 2, 4, 6, 8)
var nums2 = Array<Int>.init()//빈 배열
  • 변수, 상수 생성방법 : 리터럴, 생성자

✅ 상속

  • 상속은 구조체클래스를 구분하는 중요한 특징
class NoteBook {
    var name = ""
    
    func turnOn() {
        print("Booting...")
    }
}

class MacBook: NoteBook {
    var hasTouchBar = true
    var macOSVersion = "10.13"
    
    override func turnOn() {
        super.turnOn()//super 키워드는 슈퍼클래스의 인스턴스를 가리킴
        print("\(name)'s current macOSVersion is \(macOSVersion)")
    }
    func turnOnTouchBar() {
        
    }
}

let macBook = MacBook()
macBook.name = "MacBook Pro"
macBook.turnOn()

✅ 클래스와 구조체

1️⃣ 공통점

  • 속성(프로퍼티) 정의
  • 메소드 정의
  • 생성자를 통한 초기 설정
  • extension, protocol 사용 가능

2️⃣ 클래스만의 추가적인 특징

  • 상속
  • 타입캐스팅
  • 소멸자를 통한 리소스 정리
  • 클래스는 참조 타입
//소멸자를 통한 리소스 정리
class Circle2 {
    var radius = 0
    
    init() {
        print("Initializer called")
    }
    deinit {
        print("Deinitializer called")
    }
}
if true {
    var circle2 = Circle2()
}
  • 만약 위의 Circle2struct로 바꾸게 되면 에러남

3️⃣ 값 타입 & 참조 타입

class Circle3 {
    var radius = 0
}

var c1 = Circle3()
var c2 = c1
c2.radius = 10

print(c2.radius)
print(c1.radius)

4️⃣ 일반적인 구조체 선택 기준

🌟 몇가지 간단한 데이터 값을 캡슐화

struct Rectangle {
    var width = 0
    var height = 0
}
struct Coordinate3D {
    var x = 0
    var y = 0
    var z = 0
}

🌟 할당 및 전달 시 복사가 합리적일 때
🌟 모든 속성이 값 타입이라 - 복사가 맞을 때
🌟 상속이 필요 없을 때
🌟 대부분의 경우는 클래스

✅ 열거형

  • 비슷한 값들을 묶어서 정의
  • switch case 와 같이 사용하는 경우 많음
enum AppleOS: Int {
    case iOS = 0
    case macOS
    case tvOS
    case watchOS
}

var osType: AppleOS = .watchOS //아니면 AppleOS.iOS
print(osType.rawValue)

func printAppleDevice(osType: AppleOS) {
    switch osType {//열거형의 경우 디폴트 생략가능
    case .iOS:
        print("iPhone")
    case .macOS:
        print("iMac")
    case .tvOS:
        print("Apple TV")
    case .watchOS:
        print("Apple watch")
    }
}

printAppleDevice(osType: .watchOS)

✅ 프레임 워크

사용자 ↔️ 응용프로그램(앱) ↔️ 운영체제 ↔️ 하드웨어

🌟 iOS앱
아래는 4개의 프레임 워크 계층 시스템 :운영체제가 가진것
🌟 Cocoa Touch : UIKit, MapKit, Message UI
Media - Core Graphics, AVKit, Metal
🌟 Core Service : Core Data, Foundation, Core Foundation
🌟 Core OS, Kernel : Accelerate, OpenCL, SystemConfiguration

🌟아이폰 하드웨어

✅ 접근 제어(Access Control)

접근 제어모듈 내부모듈 외부
open접근가능접근가능
public접근가능접근가능
internal접근가능접근불가
fileprivate같은파일 내 접근가능접근불가
private접근불가접근불가
  • 모듈 : 하나의 코드 배포 단위
접근 제어모듈 내부모듈 외부
open상속 및 재정의 가능상속 및 재정의 가능
public상속 및 재정의 가능상속 및 재정의 불가
internal상속 및 재정의 가능상속 및 재정의 불가
fileprivate상속 및 재정의 불가상속 및 재정의 불가
private상속 및 재정의 불가상속 및 재정의 불가

✅ 로깅, print, NSLog

  • printLog는 앱 배포 후는 확인할 수 없다는 단점이 있음
  • NSLog함수의 치명적인 단점 : 속도가 매우 느림
  • 애플에서는 통합 로그에 대한 걸 발표함
  • 로그함수를 중간중간에 넣으면 속도가 급격히 저하됨
  • 옵저버 이펙트
  • 이걸 해결하기 위한 것이 통합 로깅 시스템

✅ 앱 배포 버전

  • iOS 배포 버전을 10 이상으로 해야한다??
  • Deployment Info
  • 배포 버전을 최대한 낮게해서 최대한 많은 사용자가 이용할 수 있도록 함
  • 근데 너무 낮게 잡으면 다양한 api 사용에 제약이 걸림
  • 코드의 가독성 및 유지 보수, 개발 기간까지 영향을 미침
  • iOS 버전별 기기 점유율을 참고자료로 이용하기
  • iOS market share

✅ API

  • Application Programming Interface
  • 말 그대로 어플리케이션 프로그래밍할 때 쓰는 인터페이스
  • 인터페이스 : 사람과 컴퓨터/앱 간에 의사소통을 하기 위한 매개체
  • API를 통해 프레임워크 클래스에 접근해서 해당기능을 이용해 앱을 만드는 것
  • os_log도 하나의 api인 것임
  • 통합 로깅 기능은 iOS 10 이상부터 사용가능
profile
iOS 개발자😺

0개의 댓글

관련 채용 정보