관리 메뉴

이리메라 갖다가

Swift 기초문법(1) - 상수/변수, 데이터타입, 컬렉션타입, 함수 본문

Swift

Swift 기초문법(1) - 상수/변수, 데이터타입, 컬렉션타입, 함수

너이르나 2023. 7. 30. 01:02
728x90
반응형

상수와 변수

상수(Constant)

변할 수 없는 값을 의미하며 let으로 선언한다. 초기 선언 시 타입만 지정한 후 나중에 값을 지정할 수 있다.

let 상수:String = "값"
print(상수)
// 값

 

변수(Variable)

변할 수 있는 값을 의미하며, 언제든 값을 바꿀 수 있다. 상수와 동일하게 타입만 지정한 후 나중에 값을 지정할 수 있다.

var 변수:Int = 0
print(변수) 
// 0

기본 데이터 타입

부울(Booleans)

참(true)과 거짓(false)으로 나타내며, 논리적인 결과를 도출할 때 사용된다.

var someBool: Bool = true
print(someBool)
// true

 

정수형(Integers)

정수형 타입이며 Int로 타입을 지정할 수 있다.

*양의 정수형의 경우 UInt로 지정할 수 있으며 음수 값을 지정할 수 없다.

var someInt: Int = -10
print(someInt)
// -10

//양의 정수형(UInt)
var someUInt: Int = 10
print(someUInt)
// 10

 

부동소수형(Floating-point numbers)

Float 타입(32bit 부동소수점 표기)과 Double 타입(64bit 부동소수점 표기)이 있다.

//Float
var someFloat: Float = 3.14
print(someFloat) // 3.14

//Double
var someDouble: Double = 3.14
print(someDouble) // 3.14

 

한글자 문자형(Characters)

character 타입에 문자형(String)을 대입하면 에러가 발생한다.

var someCharacter: Character = "🥲"
print(someCharacter)
// 🥲

someCharacter = "하하하" >> 에러발생

 

문자열(String)

문자의 연속을 말한다.

var someString: String = "하하하🥲"
print(someString)
// 하하하🥲

** 모든 데이터 타입은 선언된 타입으로만 사용가능하며, A타입으로 선언된 상수를 B타입으로 대입할 수 없다.


Any, AnyObject, nil

Any

Swift의 모든 타입을 지칭하는 키워드이다.

var someAny: Any = 100
someAny = "모든 타입 수용 가능"
print(someAny)
// 모든 타입 수용 가능

someAny = 123.3
print(someAny)
//123.3

 

AnyObject

모든 클래스 타입을 지칭하는 프로토콜이다. (일단은 그렇구나~ 알고만 있으면 된다.)

class SomeClass {}
var someAnyObject: AnyObject = SomeClass()

 

nil

없음을 의미하는 키워드이다.

아래 변수는 위에서 Any와 AnyObject 타입으로 선언되었기 때문에 변수라도 nil 값으로 변경할 수 없다.

someAny = nil
// 에러 발생: Any 타입으로 선언되었기 때문에 없는 값을 받을수 없다.

someAnyObject = nil
// 에러 발생: AnyClass 타입으로 선언되었기 때문에 없는 값을 받을수 없다.

컬렉션 타입

배열(Array)

순서가 있는 리스트 컬렉션을 말한다. Array는 아래와 같은 메서드 등이 있어 사용하기 용이하다.

//인스턴스 생성
var integers: Array<Int> = Array<Int>()

/* array 메서드 */

// 추가
integers.append(1) // [1]
integers.append(100) // [1, 100]

// 포함여부 확인
integers.contains(1) // true

// 삭제
integers.remove(at: 0) //(at: 인덱스) 1
integers.removeLast() //마지막 인덱스 삭제 100
integers.removeAll() //모든 인덱스 삭제 []

// 갯수 확인
integers.count // 0

//Array 생성
var doubles: Array<Double> = [Double]()
var strings: [String] = [String]()
var characters: [Character] = []

let immutableArray = [1, 2, 3]
// 상수로 선언되었기 때문에 추가나 삭제같은 메서드를 사용할 수 없다.

 

딕셔너리(Dictionary)

key와 value의 쌍으로 이루어진 컬렉션 타입이다. 변경, 삭제 등 사용 가능한 메서드들이 존재한다.

** 마지막 에러의 경우 옵셔널에 대해 공부하게 되면 이해할 수 있다.

var anyDictionary: Dictionary<String, Any> = [String:Any]()
// key가 String 타입이고 value가 Any 타입인 빈 딕셔너리 인스턴스 생성

anyDictionary["someKey"] = "value"
anyDictionary["anotherKey"] = 100
anyDictionary
// ["someKey":"value", "anotherKey":100]

// 변경
anyDictionary["someKey"] = "dictionary"
anyDictionary
// ["someKey":"dictionary", "anotherKey":100]

// 삭제
anyDictionary.removeValue(forKey: "someKey")
// ["anotherKey":100]
anyDictionary["anotherKey"] = nil
// []

let emptyDictionary: [String:String] = [:]
let initalizedDictionary: [String:String] = ["name":"Minjee", "gender":"female"]

let someValue: String = initalizedDictionary["name"]
// 에러 발생 : name 값이 있을 수도 있고 없을 수도 있는 불확실성 때문

 

집합(Set)

순서가 없고 멤버가 유일한 컬렉션 타입으로 수학의 집합 개념과 동일하다.

var integerSet: Set<Int> = Set<Int>()
//축약 문법이 없음

/* Set 메서드 */
// 삽입(추가) - Set는 순서가 없기 때문에 앞으로 추가될 지, 뒤로 추가될지 모름
integerSet.insert(1)
// {1}
integerSet.insert(2)
// {1,2}
integerSet.insert(2)
// {1,2}
integerSet
// {1,2} 집합의 개념이기 때문에 중복값을 인정하지 않음

// 포함 여부
integerSet.contains(1)

// 삭제
integerSet.remove(1)
integerSet.removeFirst()

// 갯수 확인
integerSet.count


// setA, setB 인스턴스 생성
let setA: Set<Int> = [1,2,3,4,5]
let setB: Set<Int> = [3,4,5,6,7]

// 합집합
let union: Set<Int> = setA.union(setB)
// {1,2,3,4,5,6,7}

// 정렬(기본은 오름차순) 
let sortedUnion: [Int] = union.sorted()
// [1,2,3,4,5,6,7]

// 교집합
let intersection: Set<Int> = setA.intersection(setB) 
//{3,4,5}

// 차집합(setA-setB)
let subtracting: Set<Int> = setA.subtracting(setB) 
// {1,2}

함수

함수(Functions)

함수선언의 기본 형태는 다음과 같다.

func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 ...) -> 반환타입 {
    함수 구현부
    return 반환값
}

매개변수의 합을 구하는 함수는 아래와 같이 작성할 수 있다.

func sum(a: Int, b: Int) -> Int {
    return a + b
}

 

  • 반환 값이 없는 함수
func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 ...) -> Void {
     함수 구현부
     return
 }
func printMyName(name: String) -> Void {
    print(name)
}

 

  • 매개변수가 없는 함수
func 함수이름() -> 반환타입{
    함수 구현부
    return
}
func maximumIntegerValue() -> Int {
    return Int.max
}

 

  • 매개변수와 반환타입이 둘 다 없는 함수
func 함수이름() -> Void {
    함수 구현부
    return
}
func hello() -> Void { print("hello") }
func bye() { print("bye") }

 

  • 함수의 호출
sum(a: 3, b: 5)
// 8

printMyName(name: "Hoyeon")
//Hoyeon

maximumIntegerValue()

hello()
//hello

bye()
//bye

 

매개변수 기본값

기본값을 갖는 매개변수는 뒤쪽에 위치하는게 좋다.

func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 = 매개변수 기본값 ...) -> 반환타입 {
    함수 구현부
    return 반환값
}
func greeting(friend: String, me: String = "dooboo") {
    print("Hello \(friend)! I'm \(me)")
}

 

  • 매개변수 기본값을 가지는 변수는 생략 가능
greeting(friend: "Sujin")
//Hello Sujin! I'm dooboo

 

  • 매개변수 기본값 수정 가능
greeting(friend: "dooboo", me: "Sujin")
//Hello dooboo! I'm Sujin

 

전달인자 레이블

함수를 호출할 때 매개변수 역할을 명확하게 하거나 함수 사용자 입장에서 표현할 때 사용한다.

func 함수이름(전달인자 레이블 매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입 ...) {
    함수 구현부
    return
}

 

  • 함수 내부에서 전달인자를 사용할 때는 매개변수 이름을 사용
func greeting(to friend: String, from me: String) {
    print("Hello \(friend)! I'm \(me)")
}

 

  • 함수 호출시 전달인자 레이블을 사용
greeting(to: "Jay", from: "May")
//Hello Jay! I'm May

 

가변 매개변수

매개변수 개수가 2개 이상이거나 없을 때 또는 모를 때 사용이 가능하며, 함수당 하나만 가질 수 있다.

func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입...) -> 반환타입 {
    함수 구현부
    return
}
func sayHelloToFriends(me: String, friends: String...) -> String {
    return "Hello \(friends)! I'm \(me)"
}

print(sayHelloToFriends(me: "May", friends: "Sujin", "Jay"))
//Hello ["Sujin", "Jay"]! I'm May

 //매개변수 없을 때
print(sayHelloToFriends(me: "May"))
//Hello []! I'm May

 

** 함수는 다양하게 섞어서 응용할 수 있다.

 

  • 데이터 타입으로서의 함수
    • 스위프트 : 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어
    • 스위프트 함수: 일급객체, 변수/상수 저장 가능, 매개변수를 통해 전달 가능

 

함수의 타입표현
  • 반환타입 생략 불가
(매개변수1타입, 매개변수2타입 ...) -> 반환타입
var someFunction: (String, String) -> Void = greeting(to:from:)
someFunction("Sujin", "May")
//Hello Sujin! I'm May

someFunction = greeting(friend:me:)
someFunction("Sujin", "May")
//Hello Sujin! I'm May

 

  • 타입이 다른 함수 할당 불가
someFunction = sayHelloToFriends(me: friends:)
// 에러 발생 : 매개변수가 여러개인 함수를 할당할 수 없다.

 

  • 함수 응용
func runAnother(function: (String, String) -> Void) {
    function("Jungyeon", "Juyeon")
}

runAnother(function: greeting(friend:me:))
//Hello Jungyeon! I'm Juyeon

runAnother(function: someFunction)
//Hello Jungyeon! I'm Juyeon

 

728x90
반응형