32YB SOPT/swift 문법 스터디

[SOPT] 야우쓰_1주차 (swift 타입 / 기본 연산자 / 조건문 / 반복문 )

신_이나 2023. 4. 26. 22:18

 

 

야우쓰란? "야 우리도 스위프트 할 수 있어"

in SOPT iOS

 

 

 

 

공부하기 싫어서 만들어 봄

 

 

 

 

1주차의 키워드는 타입 / 기본연산자 / 조건문 / 반복문 이다.

 

 

 

-  타입

1. bool

bool 은 true 와 false 만을 값으로 가진다. 

var godotHasArrived = false

let numbers = 1...5
let containsTen = numbers.contains(10)
print(containsTen)
// Prints "false"

let (a, b) = (100, 101)
let aFirst = a < b
print(aFirst)

// Prints "true"

위는 애플디벨로퍼 공식 문서다. 그렇다면 나는 궁금한 점이 생겼다. 왜 containsTen 이나 aFirst 를 bool 이라고 정의하지 않았는데 값이 'true' , 'false' 로 출력되는 것일까? 실제로 돌렸을 때 'import Foundation' 만 삽입하고 위 코드를 그대로 돌려보았을 때 답이 위처럼 나왔다!   이유는 'comtains' 와 'a<b' 가 bool 값으로 return 하기 때문이다. 자동으로 설정되었다는 것이 신기하다!

 

2. int

자료형 범위 크기
Int8 -128 ~ 127 8bit
Int16 -32,768 ~ 32,767 16bit
Int32 -2,147,483,648 ~ 2,147,483,647 32bit
Int64 -9,223,372,036,854,775,808 
~ 9,223,372,036,854,775,807
64bit
UInt8 0 ~ 255 8bit
UInt16 0 ~ 65,535 16bit
UInt32 0 ~ 4,264,967,295 32bit
UInt64 0 ~ 18,446,744,073,709,551,615 64bit

int 는 위와 같이 나눌 수 있고 애플 공식 문서에서는 아래와 같이 써있었다.

 

On 32-bit platforms, Int is the same size as Int32, and on 64-bit platforms, Int is the same size as Int64.

- 플랫폼에 따라 달라진다는 점! 일반적으로는 실행되는 환경의 CPU에 맞추어 값의 범위가 변한다. 따라서 bit 가 다른 int 끼리 사용할 때는 error 가 발생한다.

 

3. float & double

float 과 double 은 부동 소수점을 사용하는 실수다. 부동소수 타입이란, 소수점이 있다는 것을 의미한다. float은 32bit, double 은 64bit 기 때문에 적절하게 사용하면 된다. 범위가 확실하지 않은 경우엔 double 을 사용하면 좋을 것이다. C++ 에서 long long 을 쓰는 것처럼!(swift 에는 longlong 없음)  또한 소수를 변수에 저장할 때 swift 는 double 을 기본으로 제공한다.

 

++ int + float/double

그렇다면 int 와 double 의 계산이 가능할까? 작성할 수 없다!

 

4. character

character 은 문자 하나, 하나를 의미한다.

 

5. string

애플 문서 해설에 써있듯, 문자들의 모임이다.

 

5-1. 초기화

//초기화 설정
var ex_string = ""

//문자열이 비었는지 확인
if ex_string.isEmpty {
	print("empty!")
}

//Print empty!

 

5-2. 문장을 추가하고 싶을 때

var ex_string = "jiwon is "
ex_string += "so gorgeous"

print(ex_string)

//Prints "jiwon is so gorgeous"

++ 다른 string 과도 '+' 기호를 통해 연결 가능

++ char 과 string 을 연결하고 싶을 땐 'append' 메소드 활용

var ex_string = "jiwon"
var heart: Character = "♥"

ex_string.append(heart)
print(ex_string)

//Prints "jiwon♥"

 

5-3. 반복문을 통해 문자 값에 접근 가능

var ex_string = "jiwon"

for character in ex_string {
    print(character)
}

//Prints "j
//i
//w
//o
//n"

 

5-4. 문자열 중간에 상수, 변수 등 삽입

var age = 24
var ex_string = "jiwon is \(age) years old"

//Prints "jiwon is 24 years old"

 

5-5. 문자열의 문자 세기

countElements 를 사용하면 되는데 오류가 난다!!

++문자열.count 하면 가능

var jiwon = "jiwon"
print(jiwon.count)

//Print "5"

 

 

 

-  기본연산자

1. 할당 연산자(Assignment Operator)

let b = 10
var a = "A"
let (x, y) = (1, 2)

할당 연산자는 값을 초기화 시키거나 변경한다.

 

2. 사칙 연산자(Arithmetic Operators)

사칙연산자로 '+', '-', '/', '*', '%' 를 지원한다. 또한, 모든 숫자 형에서 사용 가능하다.

++ 합성 할당 연산자도 제공하는데 '+=', '-=', '/=', '*/' 등이다.

 

C나 ObjectiveC와 달리 Swift는 사칙 연산의 값이 오버플로우 되는 것을 허용하지 않습니다. 만약 이것을 허용하고 싶으면 Swift의 오버플로우 연산자를 이용해 지원할 수 있습니다. C나 ObjectiveC와 달리 Swift는 사칙 연산의 값이 오버플로우 되는 것을 허용하지 않습니다. 만약 이것을 허용하고 싶으면 Swift의 오버플로우 연산자를 이용해 지원할 수 있습니다. - The Swift Language Guide

- 가질 수 없는 값을 삽입하려고 할 때 오버플로우가 발생한다. 따라서 &+, &-, &* (각각 더하기, 빼기. 곱하기 오버플로우)을 이용하여 설정해줘야 한다.

var overflow = UInt8.max //보유할 수 있는 최댓값
overflow = overflow &+ 1 //1만큼 더 오버플로우

 

3. 비교 연산자(Comparison Operators)

Swift에서는 표준 C에서 제공하는 비교 연산자를 모두 지원합니다. - The Swift Language Guide

GOOD - ! '==', '!=', '>', '<', '>=', '<=' 를 사용할 수 있다.

 

++ '===' 과 '!==' 도 사용할 수 있다. '===' 는 참조하고 있는 인스턴스가 같은지 확인하는 것이고, '!==' 는 참조하고 있는 인스턴스가 다른지 확인하는 것이다.

++ 비교연산자는 무조건 bool 타입으로 반환한다 !!

 

 

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

<조건문 ? 답1 : 답2> 의 형태를 취한다. 조건문이 참일 경우 답1, 아닐 경우 답2를 취한다.

 

 

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

<a != nil ? a! : b> 의 형태를 취한다. a가 nill 이 아닐 경우 a를 계속해서 설정하고 nill 일 경우 b를 반환한다.

let defaultColorName = "red"
var userDefinedColorName: String? 

var colorNameToUse = userDefinedColorName ?? defaultColorName
//colorNameToUse 가 nill 일 경우 defaultColorName인 red 로 설정

 

 

6. 범위 연산자(Range Operators)

(a...b)의 형태를 사용한다.

범위를 열린 범위로 설정할 수 있는데 이때는 (a..<b)의 형태로 사용하는데 a부터 b-1까지의 값을 갖는다.

[a..] , [..a] 와 같이 단방향으로, 시작 혹은 끝만 지정할 수도 있다. 이건 보통 배열과 같이 쓴다!

 

for index in 1...5{
    print(index)
}
//Prints 1 2 3 4 5

for index in 1..<5 {
    print(index)
}
//Prints 1 2 3 4

for index in [...2] {
    print(index)
}
//Prints PartialRangeThrough<Int>(upperBound: 2)

for index in a...d{
    print(index)
}
//error

 

7. 논리 연산자(Logical Operators)

논리 부정 !

논리 곱 &&

논리 합 ||

 

 

 

- 조건문

1. if ... else

C언어와 똑같다.

 

2. guard ... else

<guard "조건" else> 의 형태로 이루어지며, 조건이 틀린 경우는 신경쓰지 않고 조건이 맞았을 때만 지나갈 수 있다는 의미다. 따라서 조건이 false 일 때 return 하여 실행한다.

++함수나 메서드, 반복문에서 사용하지 않으면 제어문 전환 명령어를 사용할 수 없기 때문에 guard 또한 사용할 수 없다.

++제어문 전환 명령어로 return, break, throw 등을 사용할 수 있다.

for i in 0...3 {
    guard i == 1 else { continue }
    print(i)
}
//Print "1"

 

2. switch

C언어와 똑같다.

++fallthrough 를 사용하면 하나의 case 문을 거친 뒤 끝나는 것이 아니라 그 다음 case 문을 실행한다. 이는 case의 조건을 충족하지 않더라도 다음 case문을 이어 실행하도록 한다. 그렇기에 마지막 case 문에서는 사용해선 안된다!

enum jiwonType {
    
    case a
    case b
    case c
    
    var char: Character {
        switch self {
        case .a :
            return "a"
        case .b:
            return "b"
        case .c:
            return "c"
            
        }
    }
}
var jiwon: jiwonType = .a
print(jiwon.char)
//Print "a"
// --------------------------------------------------------------------------------
enum jiwonType {
    
    case a
    case b
    case c
    
    var char: Character {
        switch self {
        case .a :
            fallthrough
            return "a"
        case .b:
            return "b"
        case .c:
            return "c"
            
        }
    }
}

var jiwon: jiwonType = .a
print(jiwon.char)
//Print "b"

 

 

 

- 반복문

1. for 문

swift 에서 for문은 <for "변수" in "반복횟수"> 형태로 이루어진다.

for i in 1...3 {
    print(i)
}
//Print 1 2 3

 

2. while 문

C언어와 똑같다.

 

 

 

-  추론해보자!

1. pi, grade의 타입을 float, String으로 출력하고 싶으면 어떻게 하면 될까요?

//Question
let pi = 3.141592 
let grade = "A" 
print(pi) // --- 1
print(grade) // --- 2

//Answer
let pi = 3.141592
let grade = "A"
print(Float(pi)) // --- 1
print(String(grade)) // --- 2

 

2. 아래 코드를 삼항연산자를 통해서 표현해보세요!

//Question
var myMind: String?
var ifULoveMe: Bool?

//여기서부터
if ifULoveMe {
        myMind = "나도 너 좋아했어!!! 나랑 사귀자!!!"
} else {
        myMind = "나도 너 안 좋아했어! 흥칫뿡야야!!!"
}
//여기까지를 삼항연산자로 표현해주보세여~

//Answer
var myMind: String?
var ifULoveMe: Bool?

ifULoveMe = true
ifULoveMe==true ? (myMind = "나도 너 좋아했어!!! 나랑 사귀자!!!") : (myMind = "나도 너 안 좋아했어! 흥칫뿡야야!!!")
print(myMind)
//Prints Optional("나도 너 좋아했어!!! 나랑 사귀자!!!")

 

3. 0,2,4,6,8을 출력하는 구문을 for-stride, for-where, while, repeat-while을 사용해서 만들어보세용!

//for-stride
for i in stride(from: 2, to: 10, by: 2) {
    print(i)
}

//for-where
var intrange = [2...8]
for i in 2...8 where (i%2==0) {
    print(i)
}
 
//while
var num = 1
while(num<9) {
    if num%2==0 {
        print(num)
    }
    num += 1
}
 
//repeat-while
var num = 1
repeat {
    if num%2 == 0 {
        print(num)
    }
    num += 1
}while num < 9