[TIL] 기본 연산자(Basic Operators) & 데이터 구조

2023. 3. 28. 01:28·Swift/문법
728x90

Swift에서는 통상적으로 산술연산자, 논리연사자 a..<b, a…b 같이 값의 범위를 지정할 수 있는 범위연산자를 지원

용어(Terminology)

연산자에서는 단항(unary),이항(binary) 그리고 삼항(ternary)연산자가 있다.

  • 단항 연산자는 -a, !b, c! 와 같이 하나의 대상에 앞뒤로 붙여 사용하는 연산자
  • 이항 연산자는 2 + 3 같이 두 대상 사이에 위치하는 연산자
  • 삼항 연산자는 a ? b : c 형태로 딱 하나

할당 연산자(Assignment Operator)

할당 연산자는 값을 초기화, 변경

let b = 10
var a = 5
a = b
// a 값은 10

let (x, y) = (1, 2)
// x 는 1, y 값은 2 가 됩니다.

사칙 연산자(Arithmetic Operators)

    • 더하기
  • 뺄셈
  • 곱셈 / 나눗셈 % 나머지
1 + 2       // 3
5 - 3       // 2
2 * 3       // 6
10.0 / 2.5  // 4.0
9 % 4    // 1

단항 음수 연산자(Unary Minus Operator)

숫자 값은 -로 표현되는 단항 음수 연산자에 의해 부호가 변한다.

let three = 3

let minus Three = - three //minusThree 는 -3

합성 할당 연산자 (Compound Assignment Operators)

a = a + 2와 같이 할당연산(=)과 덧셈연산(+)으로 구성된 연산을 합성해 +=형태로 축약해 사용 가능 합니다.

var a = 1
a += 2
// a는 3

비교 연산자(Comparison Operators)

Swift에서는 표준 C에서 제공하는 비교 연산자를 모두 지원

  • 같다 (a == b)
  • 같지않다 (a != b)
  • 크다 (a > b)
  • 작다 (a < b)
  • 크거나 같다 (a >= b)
  • 작거나 같다 (a <= b)

각 비교 연산은 true or false 값을 반환 , if-else와 같은 조건 구문에서 자주 사용

let name = "world"
if name == "world" {
    print("hello, world")
} else {
    print("I'm sorry \\(name), but I don't recognize you")
}
// Prints "hello, world", because name is indeed equal to "world".

같은 타입의 값을 갖는 두 개의 튜플을 비교할 수 있습니다.

튜플의 비교는 왼쪽에서 오른쪽 방향으로 이뤄지고 한번에 한개의 값만 비교합니다.

이 비교를 다른 두 값을 비교하게 될 때까지 수행합니다.

(1, "zebra") < (2, "apple")   // true, 1이 2보다 작고; zebra가 apple은 비교하지 않기 때문
(3, "apple") < (3, "bird")    // true 왼쪽 3이 오른쪽 3과 같고; apple은 bird보다 작기 때문
(4, "dog") == (4, "dog")      // true 왼쪽 4는 오른쪽 4와 같고 왼쪽 dog는 오른쪽 dog와 같기 때문

삼항 조건 연산자(Ternary Conditional Operator)

삼항 조건 연산자는 question ? answer1 : answer2의 구조를 갖습니다.

question = true → answer1 , question = false→ answer2

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight는 90 (40 + 50)

삼항 조건 연산자는 코드를 짧게 만들어 가독성을 높인다.

Nil 병합 연산자(Nil-Coalescing Operator)

nil 병합 연산자는 a ?? b 형태를 갖는 연산자 입니다. 옵셔널 a를 벗겨서(unwraps) 만약 a가 nil 인 경우 b를 반환합니다. 이 nil 병합 연산자는 다음 코드의 축약형입니다.

a != nil ? a : b // a가 nil이 아니면 a를 unwrap하고 nil이면 b를 반환

let defaultColorName = "red"
var userDefinedColorName: String?   // 이 값은 defaults 값 nil입니다.

var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorNam이 nil이므로 colorNameToUse 값은 defaultColorName인 "red"가 설정 됩니다.

userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName가 nil이 아니므로 colorNameToUse 는 "green"이 됩니다.

범위 연산자(Range Operators)

닫힌 범위 연산자(Closed Range Operator)

(a...b)의 형태로 범위의 시작과 끝이 있는 연산자 입니다. for-in loop에 자주 사용

for index in 1...5 {
    print("\\(index) times 5 is \\(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25

반 닫힌 범위 연산자(Half-Open Range Operator)

(a..<b)의 형태로 a부터 b보다 작을 때까지의 범위를 갖습니다. 즉, a부터 b-1까지 값을 갖습니다.

반 닫힌 범위 연산자는 배열을 다루는데 유용

단방향 범위(One-Side Ranges)

[a..] [..a]의 형태로 범위의 시작 혹은 끝만 지정해 사용하는 범위 연산자

지정한 시작 값 혹은 끝 값은 범위에 포함

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
    print("Person \\(i + 1) is called \\(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack

for name in names[2...] {
    print(name)
}
// Brian
// Jack

for name in names[...2] {
    print(name)
}
// Anna
// Alex
// Brian

for name in names[..<2] {
    print(name)
}
// Anna
// Alex

let range = ...5
range.contains(7)   // false
range.contains(4)   // true
range.contains(-1)  // true

논리 연산자(Logical Operators

Swift에서는 세가지 표준 논리 연산자를 지원합니다.

  • 논리 부정 NOT (!a)
  • 논리 곱 AND (a && b)
  • 논리 합 OR (a || b)

논리 부정 연산자(Logical NOT Operator)

let allowedEntry = false
if !allowedEntry {
    print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"

논리 곱 연산자(Logical AND Operator)

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"

논리 합(OR) 연산자(Logical OR Operator)

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "Welcome!"

논리 연산자의 조합(Combining Logical Operators)

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "Welcome!"

Swift의 논리 연산자 && 와 || 는 왼쪽의 표현을 우선해서 논리 계산을 합니다

명시적 괄호(Explicit Parentheses)

논리 연산자의 적용 우선 순위를 연산자에 맡지기 않고 명시적으로 괄호를 사용해 계산 순서를 지정할 수 있습니다.

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "Welcome!"

데이터 구조

데이터 구조 장점 단점

힙 매우 신속하게 삽입 및 삭제가 가능,  
최대or최소에 대한 접근 속도 빠름 다른 요소에 대한 접근 느림  
트라이 데이터 접근 속도 빠름,  
서로 다른 키값 충돌 X    
삽입,삭제 신속    
문자열 딕셔너리 정렬,프리픽스 검색 유용 특정 상황에서 해시 테이블보다 속도가 느림.  
이진 트리 (균형 잡힌 트리구조일때)삽입, 삭제,검색 속도가 매우 빠르다. 삭제 알고리즘 작성이 복잡, 트리구조가 삽입 순서에 영향, 성능이 저하
레드블랙 트리 삽입,삭제,검색 속도 매우 빠름,  
트리는 항상 균형 상태 유지 한계 상황에서 데이터 구조를 운영하므로 구현이 까다로움  
R 트리 공간적 데이터를 나타낼때 good,  
2차원 이상 구조를 지원 성능 검증 X  
그래프 실제 세계의 상황을 반영한 모델 구현 일부 알고리즘은 느리고 복잡

알고리즘 개요

알고리즘 구현을 위한 자원이 매우 희박한 상태

알고리즘을 작성하려면 시간과 공간이 필요, 이 두가지가 가장 중요한 자원

문제의 규모를 측정할 때 함수의 점근 행동(asymptotic behavior)에 관심을 갖는다.

점근행동

  • 두 개 알고리즘 기법을 비교하는 기초자료
  • 문제 해결을 위한 함수의 크기가 커지는 속도보다 자원의 소모의 속도가 느리게 증가하는가를 확인

좋은 알고리즘이라면 규모가 큰 문제일수록 신속하게 해결

데이터 구조에서는 필수적으로 파악할 내용

  • 새로운 데이터 아이템을 삽입하는 방법
  • 데이터 아이템을 삭제하는 방법
  • 특정 데이터 아이템을 찾는 방법
  • 모든 데이터 아이템을 순회 하는 방법
  • 데이터 아이템을 정렬하는 방법

스위프트에서의 데이터 타입

원천 데이터 타입이라고 하면 단일 값을 지니는 스칼라 타입을 일컫는 경우가 많다.

대표적인 스칼라 타입 데이터 하지만 Swift는 아님

  • int
  • float
  • double
  • char
  • bool

스위프트에서 제공 하는 원천 데이터 타입

밸류 타입과 레퍼런스 타입

밸류 타입(value types)

  • 오직 하나의 소유 객체만을 지님,
  • 타입의 데이터가 변수or상수에 할당됐을 때 or 함수에 전달됐을 때, 지니고 있는 값 복사
  • 구조체와 열거형, 스위프트의 모든 데이터 타입은 기본적으로 구조체

레퍼런스 타입(reference types)

  • 값을 복사하지 않고 공유
  • 변수에 할당하거나, 함수에 전달할 때 동일한 인스턴스를 참조값으로 활용
  • 여러 개의 소유 객체가 참조라는 방식으로 공유

기명 타입과 복합 타입

기명 타입(named types)

  • 사용자가 정의할 수 있는 데이터 타입
  • 해당 타입이 정의될 당시 특정한 이름을 부여할 수 있는 타입
  • 클래스, 구조체, 열거형, 프로토 타입
  • 배열, 딕셔너리, 세트, 옵셔널 값을 나타낼 수 있는 기명타입 별도로 마련
  • 익스텐션 선언을 통해 동작범위 확장

복합 타입(compound types)

  • 별도 이름이 붙여지지 않는 타입
  • function 타입과 type 타입등 두개의 복합 타입이 정의
  • 기명 타입은 물론 다른 복합 타입을 포함 가능
  • 튜플 타입은 두개의 요소를 포함, 첫번째 Int(기명타입), (Float,Float)라는 복합 타입(Int(Float,Float))

타입 에일리어스

  • 기존의 타입을 또 다른 이름으로 부를 수 있는 방법
  • typealias TCPPacket = UInt16
  • 타입 에일리어스를 정의한 뒤에는 언제든지 어디서든지 해당 이름으로 원본 타입 사용

스위프트 표준 라이브러리의 컬렉션 타입

  • 세트
  • 딕셔너리
  • 배열

정식은 아니지만 튜플도 있음, 튜플에서 정렬된 값은 어떤 타입 가능

728x90

'Swift > 문법' 카테고리의 다른 글

[TIL] Swift 문법(문자열과 문자)  (0) 2023.04.17
[TIL] 점근적 분석 & 사업계획서  (0) 2023.03.29
[TIL] Switch문, 삼항연산자, 데이터구조  (0) 2023.03.26
[TIL] Swift 문법(contains, allSatisfy)  (0) 2023.03.19
[TIL] iOS App 개발자는 무엇일까  (0) 2023.03.14
'Swift/문법' 카테고리의 다른 글
  • [TIL] Swift 문법(문자열과 문자)
  • [TIL] 점근적 분석 & 사업계획서
  • [TIL] Switch문, 삼항연산자, 데이터구조
  • [TIL] Swift 문법(contains, allSatisfy)
bulmang
bulmang
모바일 개발자 도전
  • bulmang
    bulmang
    bulmang
  • 전체
    오늘
    어제
    • 분류 전체보기 (205)
      • 알고리즘 (65)
        • List (3)
        • Two Pointer (6)
        • Binary Search (4)
        • Prefix Sum (3)
        • Sort (4)
        • Brute Force (5)
        • Array (2)
        • String (4)
        • 프로그래머스 (12)
        • 백준 (9)
        • Queue (2)
        • Stack (2)
        • Recursion (9)
      • Computer Science (16)
        • Computer Architecture (6)
        • Operating System (5)
        • Network (2)
        • 기타 (2)
        • System Programming (1)
      • Swift (70)
        • 개발 (24)
        • 정리 (25)
        • 문법 (20)
      • Flutter (24)
      • 기타 (12)
        • 후기 (12)
      • Git (6)
      • Ios 오픈소스 (5)
      • UI 디자인 (5)
      • AppleScript (2)
  • 링크

    • Notion
    • Github
  • 태그

    til
    문법
    SwiftUI
    코딩테스트
    알고리즘
    자료구조
    프로그래머스
    컴퓨터구조
    협업
    FLUTTER
    Apple Developer Academy
    백준
    개발
    Java
    today i learned
    Xcode
    피플
    Swift
    IOS
    riverpod
  • 최근 댓글

  • 최근 글

  • 인기 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.2
bulmang
[TIL] 기본 연산자(Basic Operators) & 데이터 구조
상단으로

티스토리툴바