iOS 프로그래밍 3주차

2024. 9. 25. 16:47📱 모바일 프로그래밍/iOS 프로그래밍 기초


연산자


 

프로그래밍 언어에서 가장 많이 사용하는 연산자

  1. 대입 연산자 (=)
    이 연산자는 변수에 값을 할당하는 데 사용되며, 거의 모든 프로그램에서 필수적으로 사용됩니다.
  2. 산술 연산자 (+, -, , /)
    기본적인 수학 연산을 수행하는 데 사용되며, 프로그래밍에서 매우 빈번하게 사용됩니다.
  3. 비교 연산자 (==, !=, <, >, <=, >=)
    조건문이나 반복문에서 조건을 검사할 때 자주 사용됩니다.
  4. 논리 연산자 (&&, ||, !)
    복잡한 조건을 만들거나 여러 조건을 결합할 때 사용됩니다.
  5. 증감 연산자 (++, --)
    반복문에서 카운터를 증가시키거나 감소시킬 때 자주 사용됩니다.
  6. 비트 연산자 (&, |, ^, ~, <<, >>)
    저수준 프로그래밍이나 최적화가 필요한 경우에 사용됩니다.
  7. 조건 연산자 (?:)
    간단한 조건문을 한 줄로 표현할 때 사용됩니다.
  8. 멤버 접근 연산자 (., ->)
    객체 지향 프로그래밍에서 객체의 멤버에 접근할 때 사용됩니다.
  9. sizeof 연산자
    C/C++ 등의 언어에서 데이터 타입이나 변수의 크기를 알아낼 때 사용됩니다.
  10. 쉼표 연산자 (,)
    여러 표현식을 하나로 결합할 때 사용되며, 특히 for 루프에서 자주 볼 수 있습니다.

 

증가 연산자와 감소 연산자

단항 연산자

x = x + 1	// x변수의 값을 1 증가시킴
x = x - 1	// x변수의 값을 1 감소시킴

위의 표현식은 x의 값을 1 증감

이러한 방법 대신 ++ 연산자와 --연산자를 사용할 수도 있었음

Swift 3에서 없어짐

// Swift
x += 1
x -= 1

 

비교 연산자

== (값 비교)

: 두 값이 동일한지를 비교

=== (참조 비교)

: 두 클래스 인스턴스가 동일한 객체를 참조하는지를 비교

: 값이 아닌 메모리 주소 비교

 

===을 지원하는 프로그래밍 언어

 

  1. JavaScript
    JavaScript에서 === 연산자는 엄격한 동등성 비교를 수행합니다. 이는 값과 타입이 모두 같은지 확인합니다.
  2. TypeScript
    TypeScript는 JavaScript의 상위 집합이므로 === 연산자를 동일하게 지원합니다.
  3. PHP
    PHP에서도 === 연산자를 사용하여 값과 타입의 일치를 확인할 수 있습니다.
  4. Ruby
    Ruby에서는 === 연산자가 다른 의미로 사용됩니다. 주로 case 문에서 패턴 매칭을 위해 사용됩니다.
  5. Dart
    Dart 언어에서도 === 연산자를 사용하여 객체의 동일성을 검사할 수 있습니다.
  6. Kotlin
    Kotlin에서는 === 연산자를 사용하여 참조 동등성을 확인합니다.
  7. Swift
    클래스 인스턴스의 참조 동일성을 확인하는 데 사용됩니다. 두 객체가 메모리상의 동일한 인스턴스를 가리키는지 확인합니다.

범위 연산자

 

클래스 vs 객체 vs 인스턴스

 

객체 지향 언어 - 자바스크립트

JavaScript의 객체 지향적 특성

  1. 프로토타입 기반 언어
    JavaScript는 클래스 기반이 아닌 프로토타입 기반의 객체 지향 언어입니다. 객체들은 프로토타입 체인을 통해 다른 객체의 속성과 메서드를 상속받습니다.
  2. 객체 생성의 유연성
    객체를 생성하는 여러 방법(객체 리터럴, 생성자 함수, Object.create() 등)을 제공하여 유연한 객체 생성이 가능합니다.
  3. 동적 특성
    런타임에 객체의 속성을 추가, 수정, 삭제할 수 있는 동적 특성을 가집니다.
  4. 함수의 다양한 역할
    JavaScript에서 함수는 일급 객체로, 객체의 메서드로 사용될 뿐만 아니라 생성자 함수로도 사용될 수 있습니다.
  5. 클래스 문법 지원
    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 프로그래밍 강의 자료

'📱 모바일 프로그래밍 > iOS 프로그래밍 기초' 카테고리의 다른 글

iOS 프로그래밍 6주차  (0) 2024.10.16
iOS 프로그래밍 5주차  (0) 2024.10.13
iOS 프로그래밍 4주차  (0) 2024.10.07
iOS 프로그래밍 2주차  (0) 2024.09.11
iOS 프로그래밍 1주차  (0) 2024.09.04