iOS 프로그래밍 3주차
연산자
프로그래밍 언어에서 가장 많이 사용하는 연산자
- 대입 연산자 (=)
이 연산자는 변수에 값을 할당하는 데 사용되며, 거의 모든 프로그램에서 필수적으로 사용됩니다. - 산술 연산자 (+, -, , /)
기본적인 수학 연산을 수행하는 데 사용되며, 프로그래밍에서 매우 빈번하게 사용됩니다. - 비교 연산자 (==, !=, <, >, <=, >=)
조건문이나 반복문에서 조건을 검사할 때 자주 사용됩니다. - 논리 연산자 (&&, ||, !)
복잡한 조건을 만들거나 여러 조건을 결합할 때 사용됩니다. - 증감 연산자 (++, --)
반복문에서 카운터를 증가시키거나 감소시킬 때 자주 사용됩니다. - 비트 연산자 (&, |, ^, ~, <<, >>)
저수준 프로그래밍이나 최적화가 필요한 경우에 사용됩니다. - 조건 연산자 (?:)
간단한 조건문을 한 줄로 표현할 때 사용됩니다. - 멤버 접근 연산자 (., ->)
객체 지향 프로그래밍에서 객체의 멤버에 접근할 때 사용됩니다. - sizeof 연산자
C/C++ 등의 언어에서 데이터 타입이나 변수의 크기를 알아낼 때 사용됩니다. - 쉼표 연산자 (,)
여러 표현식을 하나로 결합할 때 사용되며, 특히 for 루프에서 자주 볼 수 있습니다.
증가 연산자와 감소 연산자
단항 연산자
x = x + 1 // x변수의 값을 1 증가시킴
x = x - 1 // x변수의 값을 1 감소시킴
위의 표현식은 x의 값을 1 증감
이러한 방법 대신 ++ 연산자와 --연산자를 사용할 수도 있었음
Swift 3에서 없어짐
// Swift
x += 1
x -= 1
비교 연산자
== (값 비교)
: 두 값이 동일한지를 비교
=== (참조 비교)
: 두 클래스 인스턴스가 동일한 객체를 참조하는지를 비교
: 값이 아닌 메모리 주소 비교
===을 지원하는 프로그래밍 언어
- JavaScript
JavaScript에서 === 연산자는 엄격한 동등성 비교를 수행합니다. 이는 값과 타입이 모두 같은지 확인합니다. - TypeScript
TypeScript는 JavaScript의 상위 집합이므로 === 연산자를 동일하게 지원합니다. - PHP
PHP에서도 === 연산자를 사용하여 값과 타입의 일치를 확인할 수 있습니다. - Ruby
Ruby에서는 === 연산자가 다른 의미로 사용됩니다. 주로 case 문에서 패턴 매칭을 위해 사용됩니다. - Dart
Dart 언어에서도 === 연산자를 사용하여 객체의 동일성을 검사할 수 있습니다. - Kotlin
Kotlin에서는 === 연산자를 사용하여 참조 동등성을 확인합니다. - Swift
클래스 인스턴스의 참조 동일성을 확인하는 데 사용됩니다. 두 객체가 메모리상의 동일한 인스턴스를 가리키는지 확인합니다.
범위 연산자
클래스 vs 객체 vs 인스턴스
객체 지향 언어 - 자바스크립트
JavaScript의 객체 지향적 특성
- 프로토타입 기반 언어
JavaScript는 클래스 기반이 아닌 프로토타입 기반의 객체 지향 언어입니다. 객체들은 프로토타입 체인을 통해 다른 객체의 속성과 메서드를 상속받습니다. - 객체 생성의 유연성
객체를 생성하는 여러 방법(객체 리터럴, 생성자 함수, Object.create() 등)을 제공하여 유연한 객체 생성이 가능합니다. - 동적 특성
런타임에 객체의 속성을 추가, 수정, 삭제할 수 있는 동적 특성을 가집니다. - 함수의 다양한 역할
JavaScript에서 함수는 일급 객체로, 객체의 메서드로 사용될 뿐만 아니라 생성자 함수로도 사용될 수 있습니다. - 클래스 문법 지원
ES6부터 클래스 문법이 도입되어, 다른 객체 지향 언어와 유사한 방식으로 객체를 정의할 수 있게 되었습니다.
JavaScript의 객체 지향 프로그래밍 특징
- 캡슐화: 클로저를 통해 private 변수와 메서드를 구현할 수 있습니다.
- 상속: 프로토타입 체인을 통해 상속을 구현합니다.
- 다형성: 같은 메서드 이름으로 다른 기능을 구현할 수 있습니다.
자바스크립트 class 예시
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello() {
console.log(`안녕하세요, 제 이름은 ${this.name}이고 ${this.age}살입니다.`);
}
getAge() {
return this.age;
}
static createAdult(name) {
return new Person(name, 20);
}
}
// 클래스 사용 예
const person1 = new Person("김철수", 25);
person1.sayHello(); // 출력: 안녕하세요, 제 이름은 김철수이고 25살입니다.
console.log(person1.getAge()); // 출력: 25
const adult = Person.createAdult("이영희");
adult.sayHello(); // 출력: 안녕하세요, 제 이름은 이영희이고 20살입니다.
클래스로부터 객체를 만드는 예시
C++
class Person {
public:
string name;
int age;
Person(string n, int a) : name(n), age(a) {}
void introduce() {
cout << "My name is " << name << " and I'm " << age << " years old." << endl;
}
};
int main() {
Person person1("Alice", 30);
person1.introduce();
return 0;
}
Java
public class Person {
String name;
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 person1 = new Person("Bob", 25);
person1.introduce();
}
}
C#
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public void Introduce()
{
Console.WriteLine($"My name is {Name} and I'm {Age} years old.");
}
}
class Program
{
static void Main(string[] args)
{
Person person1 = new Person("Charlie", 35);
person1.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.")
person1 = Person("David", 40)
person1.introduce()
JavaScript
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
introduce() {
console.log(`My name is ${this.name} and I'm ${this.age} years old.`);
}
}
const person1 = new Person("Eve", 28);
person1.introduce();
제어문
(Control Flow)
증가 for 문
for i in 0..<10 { // 0부터 9까지
print(i)
}
for i in 0...9 {
print("\(i+1): psa")
}
배열의 항목 접근
let names = ["A", "B", "C", "D"]
for name in names {
print(name)
} // A B C D
let names = ["A", "B", "C", "D"]
for name in names[1...] {
print(name)
} // B C D
let names = ["A", "B", "C", "D"]
for name in names[...1] {
print(name)
} // A B
if문
var x = 10
if x < 5 {
print("5보다 큽니다")
}
if문 조건에서 콤마:조건나열(condition-list)
switch-case문
switch-case문에서의 범위 지정 매칭
fallthrough
swift에서 많이 사용하는 제어문
1. if - else
let temperature = 25
if temperature < 10 {
print("추워요")
} else if temperature < 20 {
print("선선해요")
} else {
print("따뜻해요")
}
// 출력: 따뜻해요
2. switch
let fruit = "apple"
switch fruit {
case "apple":
print("사과입니다")
case "banana":
print("바나나입니다")
default:
print("알 수 없는 과일입니다")
}
// 출력: 사과입니다
3. for-in
let numbers = [1, 2, 3, 4, 5]
for number in numbers {
print(number)
}
// 출력: 1 2 3 4 5
4. while
var count = 0
while count < 3 {
print("현재 카운트: \(count)")
count += 1
}
// 출력:
// 현재 카운트: 0
// 현재 카운트: 1
// 현재 카운트: 2
5. guard
func greet(person: [String: String]) {
guard let name = person["name"] else {
print("이름이 없습니다")
return
}
print("안녕하세요, \(name)님!")
}
greet(person: ["name": "철수"])
// 출력: 안녕하세요, 철수님!
6. repeat-while
var number = 1
repeat {
print(number)
number += 1
} while number <= 3
// 출력: 1 2 3
Optional
Int형 vs Optional Int형
var x : Int = 10
print(x) // 출력: 10
var y : Int? = 20
print(y) // 출력: Optional(20)
Optional 변수 선언
: 자료형 뒤에 물음표(?)를 붙인다.
사용하려면 풀어야함
푸는 방법
: 변수뒤에 느낌표(!)
var y : Int?
print(y) // 출력: nil
nil: 값이 없다
var y : Int?
print(y!)
error: Execution was interrupted, reason: EXC_BREAKPOINT (code=1, subcode=0x105fb7200).
값이 있을 때만 풀 수 있다.
var y : Int? = 20
y = y! + 1
print(y) // 출력: Optional(21)
Optional 변수는 그냥 사용하지 못하고 풀어서 사용해야 한다.
푸는 방법은 !를 붙이는 것이고, 마지막에 들어갈 때는 Optional로 들어간다.
optional binding
var x : Int?
x = 10
if let xx = x { // 옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반상수 xx에 대입하고 if문 실행
print(x, xx)
}
else {
print("nil")
}
var x1 : Int?
if let xx = x1 { // 옵셔널 변수 x1 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 감
print(xx)
}
else {
print("nil")
}
// 출력
// Optional(10) 10
// nil
if let x = x 라고 써도 됨
Swift 5.7부터는 if let x라고 써도 됨 - short form of if-let to the Optional Binding
Optional binding(여러 옵셔널 값 동시에 언래핑)
var x : Int?
var y : Int?
x = 10
y = 20
if let xx = x, let yy = y {
print(xx, yy)
}
else {
print("nil")
}
Implicitly Unwrapped Optional
var x : Int? = 10
var y : Int! = 20
var z : Int = 1
print(x, y, z) // Optional(10), Optional(20), 1
z = x!
print(z) // 10
z = y
print(z) // 20
if let x, let y {
print(x, y) // 10, 20
}
형 다음에 ?가 아닌 !를 쓰는 옵셔널 형
먼저 일반 옵셔널 값으로 사용하려고 하지만, optional로 사용할 . 수없는 경우 Swift는 값을 자동으로 강제로 품
Optional로 사용할 수 없으면 자동으로 unwrap함
nil-coalescing operator(nil병합연산자) ??
var x : Int? //= 10
var y : Int = 0
y = x ?? 1
print(x, y) // nil, 1
swift 에서 옵셔널 변수를 unwarp하는 방법
1. 옵셔널 바인딩 (Optional Binding)
가장 안전하고 널리 사용되는 방법입니다.
if let unwrappedValue = optionalValue {
// unwrappedValue를 사용
}
2. 가드 문 (Guard Statement)
조기 종료를 위해 자주 사용됩니다.
guard let unwrappedValue = optionalValue else {
return
}
// unwrappedValue를 사용
3. 옵셔널 체이닝 (Optional Chaining)
여러 옵셔널을 연결할 때 유용합니다.
let value = optionalValue?.property?.method()
4. nil 병합 연산자 (Nil-Coalescing Operator)
기본값을 제공할 때 편리합니다.
let value = optionalValue ?? defaultValue
5. 암시적 언래핑 (Implicitly Unwrapped Optionals)
초기화 후 항상 값이 있다고 확신할 때 사용합니다.
var implicitlyUnwrappedOptional: String!
6. 강제 언래핑 (Forced Unwrapping)
값이 확실히 있을 때만 사용해야 합니다. 위험할 수 있습니다.
let value = optionalValue!
출처: iOS 프로그래밍 강의 자료