이전에는 Swift 언어와 mac의 사용법에 대해 알아봤어요.
이제는 Swift 언어를 제대로 활용할 수 있는 기초 문법에 대해서 알아볼거에요.
다른 프로그래밍 언어와는 어떤 내용이 다른지 구분할 수 있어요.
당연하게도 Swift에도 연산자가 존재해요.
뭐든지 더하고 뺄 수 있어야 많은 것들을 할 수 있겠죠?
선언 방식과 대입을 하는 방법을 간단히 알아볼게요.
출처 : docs.swift.org
이렇게 우리가 흔히 아는 방식으로 대입 연산자를 활용할 수 있어요.
모르는 기호가 있긴 하지만, 그것보다는 형태가 비슷하다는 것을 중점으로 보면 좋아요.
증감 연산자의 경우 다른 프로그래밍 언어의 방식과 크게 다르지 않아요.
단, 한가지 주의할 것이 있어요.
++ 연산자와 -- 연산자는 최신 Swift에서 다루지 않아요.
만약 사용하려고 한다면 다음과 같은 에러가 발생할 거에요.
이는 Swift에서 지원하지 않는 연산자로 기존에는 존재했지만, Swift 3에서 해당 연산자를 삭제시켰어요.
이와 같은 연산을 적용시키기 위해서는 다음과 같이 수정해야 해요.
비교 연산자도 한가지 추가된 것을 제외하면 크게 다르지 않아요.
먼저 흔히 아는 비교 연산자부터 확인해볼게요.
크게 다를건 없죠?
다른 하나의 연산자는 ===
연산자로 ==
연산자와는 다른 역할을 해요.
이 ===
연산자는 참조 타입(클래스)의 두 인스턴스가 동일한 객체를 참조하는 지 비교해요.
말이 어렵죠? 코드를 통해 간단히 이해해 볼게요.
내용을 보면 Person
이라는 클래스를 사용해서 person1
, person2
, person3
를 만들었어요.
person1
을 생성하고 person2
는 person1
의 내용을 받았죠.
이 경우 참조했다고 할 수 있고, ===
연산자는 True를 반환해요.
반면 person3
는 다른 내용이 들어있기 때문에 person1
, person2
와 비교 시 False를 반환해요.
이 연산자는 보통 두 개의 클래스 인스턴스가 같은 객체를 참조하고 있는지를 확인할 때 사용해요.
주로 객체의 상태나 속성을 변경하는 코드에서 유용하게 사용할 수 있어요. 사실 잘 안써요
출처 : developer.apple.com
논리 연산자는 다른 언어와 크게 차이는 없어요. 예제를 통해 간단히 알아볼게요.
논리 연산자의 경우 언어보다는 비트의 연산 방식이기 때문에 언어의 특성을 따라가지는 않아요. 큐비트 컴퓨터라면 다를수도 있겠죠?
이 부분을 하면서 ^
연산자는 caret |
연산자는 pipe라고 읽는 다는 사실을 처음 알았어요!
그리고 ^
연산자를 사용해 두 수를 바꿀 수 있다는 것도요!
변수 없이 논리 연산자를 통해 두 수를 교환할 수 있다는 것은 신기하네요.
Swift에는 특이하다고 할 수 있는 ..
연산자가 있어요.
위 사진에서 볼 수 있듯이 ClosedRange
라고 표시된 ...
연산자는 닫힌 범위 연산자
으로, x...y
인 경우 x부터 y까지 포함된 숫자를 표현해요.
그냥 Range
라고 표기된 ..<
연산자의 경우 반 열린 범위 연산자
로 x..<y
인 경우 y를 포함하지 않는 x부터 y까지의 숫자에요.
위 연산자들은 보통 문자열에서 많이 사용해요.
str[2...]
부분을 통해 2부터 끝까지를 나타낼 수 있고,
str[..<2]
부분을 통해 처음부터 2까지를 나타낼 수 있어요.
아까 위에서 비교 연산자 중 ===
연산자 때, 인스턴스라에 대한 내용이 나왔어요. 이번에는 그 구분을 조금 더 명확하게 나눠볼게요.
클래스와 객체, 인스턴스를 구분하는 것은 프로그래머에겐 중요한 개념이에요.
객체지향 프로그래밍 언어를 여러번 다뤘다면 어떤 느낌인지 쉽게 이해할 수 있어요.
위 그림과 코드를 활용하게 쉽게 알아볼게요.
class Car{}
let myCar = Car()
이런 구문이 있는 경우 하나씩 정리해볼게요.
클래스 : Car
객체 : myCar
myCar는 Car 클래스의 인스턴스
한마디로 정리하면 이렇게 표현할 수 있어요.
When an object is created by a constructor of the class, the resulting object is called aninstance of the class.
설계도인 클래스로부터 만들어진 실체를 객체라 하고 실제로 사용 중인 객체를 인스턴스라 한다.
출처 : en.wikipedia.org
이런 클래스에 대해 더 이해하기 쉽도록 각 언어별 클래스 선언 방법을 알아볼게요.
C++
// 클래스 정의
class Person {
private:
std::string name;
int age;
public:
Person(std::string n, int a) : name(n), age(a) {}
void introduce() {
std::cout << "My name is " << name << " and I'm " << age << " years old." << std::endl;
}
};
int main() {
// 객체 생성 및 인스턴스화
Person p("Alice", 30); // p는 Person 클래스의 인스턴스(객체)
p.introduce();
return 0;
}
JAVA
// 클래스 정의
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void introduce() {
System.out.println("My name is " + name + " and I'm " + age + " years old.");
}
public static void main(String[] args) {
// 객체 생성 및 인스턴스화
Person p = new Person("Bob", 25); // p는 Person 클래스의 인스턴스(객체)
p.introduce();
}
}
-Python
# 클래스 정의
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f"My name is {self.name} and I'm {self.age} years old.")
# 객체 생성 및 인스턴스화
p = Person("Charlie", 35) # p는 Person 클래스의 인스턴스(객체)
p.introduce()
-C#
using System;
// 클래스 정의
public class Person
{
private string name;
private int age;
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
public void Introduce()
{
Console.WriteLine($"My name is {name} and I'm {age} years old.");
}
static void Main(string[] args)
{
// 객체 생성 및 인스턴스화
Person p = new Person("David", 40); // p는 Person 클래스의 인스턴스(객체)
p.introduce();
}
}
반복문에서는 for문이 빠질 수 없죠!
그러나 Swift에서는 for문이 조금 다른 방식으로 선언해요.
이전에 사용했던 for문은 우리가 아는 for문과 흡사했어요.
하지만 최신버전에서 사용하려고 하면 해당 방식은 Swift 3에서 삭제되었다고 알려줘요.
그렇기 때문에 다음과 같이 작성하면 돼요.
다른 언어와 달리 Swift에서는 중괄호 생략이 불가능 해요.
이렇게 중괄호를 넣어야 한다는 오류가 발생하죠.
또한 반복문의 반복인자를 쓰지 않는다면 _
기호를 통해 대체가 가능해요.
만약 배열의 각 항목을 접근하는 방식을 하고 싶다면 다음과 같이 작성할 수 있어요.
let names = ["A", "B", "C", "D"]
for name in names {
print(name)
}
딕셔너리의 요소들을 접근하는 경우는 다음과 같이 할 수 있어요.
for 반복문과 비슷한 형식으로 while문도 이루어져 있어요.
var myCount = 0
while myCount < 1000 {
myCount+=1
}
print(myCount) // 1000
이 반복문은 다른 언어의 do-while
반복문과 동일하게 동작해요.
이름만 다르게 존재하는 것이죠.
또한 다른 언어와 마찬가지로 continue
문을 사용할 수 있어요.
continue
문을 만나면 이후 내용을 무시하고 반복문 상단으로 이동해요.
if문은 크게 차이점은 없어요. 조건식에서 소괄호를 생략할 수 있어요.
단, 중괄호는 필수적으로 넣어야 해요.
프로그래밍을 하다보면 하나의 if문에 여러 조건이 존재하는 경우가 있어요. 코딩지옥 멈춰!
이런 경우에는 우리가 아는 and
(또는 &&) 연산자를 활용할 수 있어요.
그러나 Swift에서는 또다른 방식이 존재해요.
바로 조건나열(condition-list) 인데요.
먼저 어떤 식으로 사용되는지 보면
이렇게 활용할 수 있어요.
그러면 어떤 차이 때문에 && 연산과 조건 나열을 나누는지 확인해볼게요.
이렇게 조건나열을 통해서는 옵셔널을 벗길 수 있지만, && 연산자를 통해서는 옵셔널을 벗길 수 없다는 오류가 표시돼요.
다중 if문도 크게 다를건 없어요. 똑같이 조건식에서 소괄호를 생략할 수 있어요.
switch문은 case문 1개 작성할때 여러개의 조건이 들어갈수있어요. 또한 범위까지 지정해줄 수 있고 각 case 마지막에 break가 자동으로 들어 있어요.
또한, switch문에서 각 case는 where절을 사용할 수 있어요. where절은 부가적인 조건을 추가하기 위하여 사용해요.
추가로 case별로 빠져나가지 않고 아래로 계속 내려가게 하려면 fallthrough문을 사용하면 돼요.
번외로 Swift에서 제일 많이 사용하는 제어문은 다음과 같아요.
switch문 보다 for-in문이 더 자주 사용될줄 알았는데, 반대인건 의외네요.
드디어 베일에 쌓여 있던 마지막 친구, 옵셔널(Optional)이 나타났어요.
일단 옵셔널을 선언하는 두 가지 방법에 대해서 알아볼게요.
?
를 사용하는 방법과 !
를 사용하는 방법이 있어요.
부르기 편하게 ? 옵셔널
과 ! 옵셔널
로 나눈 후 각각 알아볼게요.
먼저, ? 옵셔널
을 먼저 알아볼게요.
? 옵셔널
은 다음과 같이 선언하고 출력할 수 있어요.
? 옵셔널
을 사용한 변수는 그냥 출력 시 경고문구와 함께 출력은 Optional( 값 )
의 형태로 출력돼요. 해당 내용을 없애기 위해서는 변수 뒤에 !
를 붙이면 없어져요.
만약 변수에 값을 넣지 않고 출력하게 되면 다음과 같은 에러가 발생해요.
오류 문구가 있긴 하지만 출력부분을 보면 nil
이라고 출력된 것을 확인할 수 있어요.
여기에서 nil
은 정수 값을 갖거나 아무값도 갖지 않을 수 있음을 나타내요.
그렇기 때문에 값이 있을 때만 정상적으로 출력할 수 있어요.
일단, nil
이 존재하는 이유에 대해서 간단히 설명할게요.
Swift 언어를 통해 앱을 만들면 사용자가 사용하게 돼요.
개발자는 프로그램을 만들면서 어떤 부분에 어떤 값을 넣어야 동작하는지 알지만, 일반 사용자는 알 방법이 없어요.
따라서 사용자가 앱을 사용하며 발생하는 다양한 상황을 처리하기 위함이에요.
사용자가 값을 명확히 입력하지 않은 경우를 명확히 나타낼 필요가 있기 때문이에요.
이렇게 값이 없을 수도 있는 nil
은 값이 존재할 때만 사용해야 하기 때문에 따로 처리구문을 작성해줘야 해요.
따로 처리할 수 있는 방법을 살펴볼게요.
마지막으로 Swift에서 옵셔널 변수를 푸는 방법을 많이쓰는 순서대로 알아볼게요.
//옵셔널 바인딩(Optional Binding)
if let value = optionalValue {
// value는 옵셔널이 해제된 상태로 사용 가능
}
//강제 해제(Forced Unwrapping)
let value = optionalValue!
//Nil 병합 연산자(Nil-Coalescing Operator)
let value = optionalValue ?? defaultValue
//옵셔널 체이닝(Optional Chaining)
let value = person?.address?.street
//mplicitly Unwrapped Optionals
var name: String! = "John"
이렇게 Swift의 기초 문법의 자세한 내용과 반복문, 제어문, 옵셔널 등의 내용에 대해 알아봤어요.