- 연산자
- 제어문1(for~in, while, repeat~while, break, continue, if~else,switch~case)
- Optional, as, nil, Any, AnyObject
# 연산자
프로그래밍 언어에서 가장 많이 사용되는 연산자들의 대략적인 순서
1. 산술 연산자
기본적인 수학적 연산을 수행하는 데 사용되며 가장 빈번하게 사용
- 덧셈 (+)
- 뺄셈 (-)
- 곱셈 (*)
- 나눗셈 (/)
- 나머지 (%)
2. 대입 연산자
변수에 값을 할당하는 데 사용되는 기본적인 연산자
- 단순 대입 (=)
(Swift)
오른쪽 피연산자는 주로 산술식 또는 논리식을 수행하는 표현식이며, 그 결과는 왼쪽 피연산자인 변수나 상수에 할당
var x: Int? // 옵셔널 Int 변수를 선언함
var y = 10 // 일반 Int 변수를 선언하고 초기화함
x = 10 // 값을 x에 할당함, Optional(10)
x = x! + y // x + y의 결과를 x에 할당함, Optional(20)
x = y // y의 값을 x에 할당함, Optional(10)
- 복합 대입 (+=, -=, *=, /=, %=)
- x = x + y
- x += y
x와 y를 더하고 그 결과를 x에 할당 - x -= y
x에서 y를 빼고 그 결과를 x에 할당 - x *= y
x와 y를 곱하고 그 결과를 x에 할당 - x /= y
x를 y로 나누고 그 결과를 x에 할당 - x %= y
x를 y로 나눈 나머지를 x에 할당 - x &= y
x와 y의 bit AND 연산 결과를 x에 할당 - x |= y
x와 y의 bit OR 연산 결과를 x에 할당
3. 비교 연산자
두 값을 비교하는 데 사용되며, 조건문에서 자주 사용
- 같음 (==)
- 다름 (!=)
- 크다 (>)
- 작다 (<)
- 크거나 같다 (>=)
- 작거나 같다 (<=)
"===" 연산자
식별 연산자(Identity Operator), 참조 동등성 연산자(Reference Equality Operator)
(Swift)
참조 비교
"===" 연산자는 두 객체가 메모리 상에서 동일한 인스턴스를 참조하고 있는지를 비교
클래스 인스턴스에만 사용
이 연산자는 주로 클래스 인스턴스를 비교할 때 사용됩니다. 구조체나 열거형과 같은 값 타입에는 사용할 수 없습니다.
"==" vs "==="
- "==" 연산자 : 값의 동등성 비교
- "===" 연산자 : 객체의 동일성(identity) 비교
let obj1 = NSObject()
let obj2 = NSObject()
let obj3 = obj1
print(obj1 === obj2) // false (서로 다른 인스턴스)
print(obj1 === obj3) // true (동일한 인스턴스를 참조)
"===" 연산자를 지원하는 주요 프로그래밍 언어
1. JavaScript : 엄격한 동등 비교 연산자; 값과 타입이 모두 같은지를 비교
console.log(5 === 5); // true
console.log('5' === 5); // false
2. PHP : 엄격한 동등성 검사 수행; 값과 타입을 모두 비교
var_dump(5 === 5); // bool(true)
var_dump('5' === 5); // bool(false)
3. TypeScript : JavaScript의 상위 집합; JavaScript와 동일한 방식으로 "===" 연산자를 사용
console.log(5 === 5); // true
console.log('5' === 5); // false
4. Ruby : case 문에서의 일치 연산자; 일반적인 동등성 비교와는 다른 의미를 가짐
(1..5) === 3 # true
/\d+/ === "123" # true
이 외에도 몇몇 프로그래밍 언어들이 "===" 연산자를 지원하지만, 그 의미와 사용법은 언어마다 다를 수 있습니다. 대부분의 경우 JavaScript와 PHP에서처럼 엄격한 동등성 비교를 위해 사용됩니다.
4. 논리 연산자
여러 조건을 결합하거나 부정하는 데 사용
- AND (&&)
- OR (||)
- NOT (!)
- XOR(^)
5. 증감 연산자
변수의 값을 1 증가시키거나 감소시키는 데 사용
전위/후위 증감 연산자는 Swift 3에서 사라진 연산자임
6. 비트 연산자
비트 단위의 연산을 수행하는 데 사용
- AND (&)
- OR (|)
- XOR (^)
- NOT (~)
- 왼쪽 시프트 (<<)
- 오른쪽 시프트 (>>)
7. 범위 연산자
# 클래스 vs 객체 vs 인스턴스
JavaScript의 객체 지향적 특성
1. 프로토타입 기반 언어
JavaScript는 클래스 기반이 아닌 프로토타입 기반의 객체 지향 언어
이는 객체를 직접 생성하고 확장할 수 있으며, 객체 간의 상속 관계를 프로토타입 체인을 통해 구현한다는 의미
2. 다중 패러다임 지원
JavaScript는 명령형, 함수형, 그리고 프로토타입 기반 객체 지향 프로그래밍을 모두 지원하는 다중 패러다임 언어
3. 객체 생성 방식
JavaScript에서는 여러 가지 방법으로 객체 생성 가능 :
- 객체 리터럴
- Object() 생성자 함수
- 사용자 정의 생성자 함수[3]
4. 동적 특성
JavaScript는 이미 생성된 인스턴스의 구조와 기능을 동적으로 변경할 수 있다는 특징
## ECMAScript 6 이후의 변화
ECMAScript 6(ES6)부터는 `class` 키워드가 도입되어 클래스 기반 객체 지향 프로그래밍과 유사한 문법 제공.
하지만 이는 기존의 프로토타입 기반 객체 지향 모델을 완전히 대체하는 것이 아니라, 기존 모델을 더 쉽게 사용할 수 있도록 하는 문법적 설탕(Syntactic sugar)임
## 결론
JavaScript는 분명히 객체 지향 프로그래밍을 지원하는 언어이나, Java나 C++과 같은 전통적인 클래스 기반 언어와는 다른 방식으로 객체 지향성을 구현함. JavaScript의 객체 지향 특성을 이해하고 활용하기 위해서는 프로토타입, 생성자 함수, 그리고 ES6 이후의 클래스 문법 등에 대한 이해가 필요합니다.
javaScript에서 클래스 만드는 방법
## 기본 클래스 선언
class ClassName {
constructor(param1, param2) {
this.property1 = param1;
this.property2 = param2;
}
method1() {
// 메서드 내용
}
method2() {
// 메서드 내용
}
}
## 주요 특징
1. constructor 메서드
- 클래스의 인스턴스를 생성하고 초기화하는 특수 메서드
- 클래스당 하나만 존재
2. 클래스 필드
- constructor 내부에서 `this.property = value` 형태로 정의
- 인스턴스의 프로퍼티가 되어 클래스 외부에서 접근 가능
3. 메서드 정의
- 클래스 내부에 함수를 정의하여 메서드를 생성
- 자동으로 프로토타입에 저장
## 예시
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
introduce() {
return `안녕하세요, 제 이름은 ${this.name}입니다.`;
}
celebrateBirthday() {
this.age++;
return `${this.name}의 나이가 ${this.age}살이 되었습니다.`;
}
}
const person = new Person('홍길동', 30);
console.log(person.introduce()); // "안녕하세요, 제 이름은 홍길동입니다."
console.log(person.celebrateBirthday()); // "홍길동의 나이가 31살이 되었습니다."
## 추가 기능
1. getter와 setter
class Rectangle {
constructor(height, width) {
this._height = height;
this._width = width;
}
get area() {
return this._height * this._width;
}
set height(value) {
if (value > 0) {
this._height = value;
}
}
}
2. 정적 메서드
class MathOperations {
static add(x, y) {
return x + y;
}
}
console.log(MathOperations.add(5, 3)); // 8
클래스는 JavaScript의 객체 지향 프로그래밍을 더 쉽고 직관적으로 만들어주는 문법적 설탕(syntactic sugar)이다. 내부적으로는 여전히 프로토타입 기반으로 동작하지만, 다른 객체 지향 언어와 유사한 문법을 제공하여 코드의 가독성과 재사용성을 높여준다.
주요 프로그래밍 언어 5가지로 클래스로부터 객체를 만드는 예시
## 1. Python
class Car:
def __init__(self, model, color):
self.model = model
self.color = color
def display_info(self):
print(f"This is a {self.color} {self.model}")
my_car = Car("Tesla", "red")
my_car.display_info() # 출력: This is a red Tesla
## 2. Java
public class Car {
private String model;
private String color;
public Car(String model, String color) {
this.model = model;
this.color = color;
}
public void displayInfo() {
System.out.println("This is a " + color + " " + model);
}
public static void main(String[] args) {
Car myCar = new Car("Toyota", "blue");
myCar.displayInfo(); // 출력: This is a blue Toyota
}
}
## 3. C++
#include <iostream>
#include <string>
class Car {
private:
std::string model;
std::string color;
public:
Car(std::string m, std::string c) : model(m), color(c) {}
void displayInfo() {
std::cout << "This is a " << color << " " << model << std::endl;
}
};
int main() {
Car myCar("Honda", "silver");
myCar.displayInfo(); // 출력: This is a silver Honda
return 0;
}
## 4. JavaScript
class Car {
constructor(model, color) {
this.model = model;
this.color = color;
}
displayInfo() {
console.log(`This is a ${this.color} ${this.model}`);
}
}
const myCar = new Car("BMW", "black");
myCar.displayInfo(); // 출력: This is a black BMW
## 5. C#
using System;
public class Car
{
private string model;
private string color;
public Car(string model, string color)
{
this.model = model;
this.color = color;
}
public void DisplayInfo()
{
Console.WriteLine($"This is a {color} {model}");
}
public static void Main(string[] args)
{
Car myCar = new Car("Ford", "green");
myCar.DisplayInfo(); // 출력: This is a green Ford
}
}
각 언어마다 클래스를 정의하고 객체를 생성하는 문법이 조금씩 다르지만, 기본적인 개념은 유사합니다. 모든 예시에서 `Car` 클래스를 정의하고, 그 클래스의 인스턴스를 생성한 후, 객체의 메서드를 호출하여 정보를 출력하고 있습니다.
Swift 언어에서는 for문이 사라짐
ctrl + i : 재정렬
command = / ; 주석
for var i = 0; i < 10; i+=1 { // for i in 0..<10 로 수정해야 함
print(i)
}
for i in 0 ..< 10 {
print(i)
}
Swift문에는 각 case문에 break문이 자동으로 들어있음
범위를 지정하여 매칭할 수 있다
optional만 다룬 글입니다. optional에 대해 더 자세히 알고 싶으시면 위 글을 참고해주세요.
# optional 실습
var x : Int = 10
print(x)
var y : Int? = 20
y = y! + 1
x = y!
print(y)
optional binding
Swift에서 옵셔널 변수를 푸는 방법을 많이 사용하는 순서
1. 옵셔널 바인딩 (if let)
let name: String? = "John"
if let unwrappedName = name {
print("Hello, \(unwrappedName)!")
} else {
print("Name is nil")
}
2. 가드 문 (guard let)
func greet(name: String?) {
guard let unwrappedName = name else {
print("Name is nil")
return
}
print("Hello, \(unwrappedName)!")
}
3. 옵셔널 체이닝
let user: User? = User(name: "Alice")
let userName = user?.name?.uppercased()
4. nil 병합 연산자 (??)
let inputName: String? = nil
let name = inputName ?? "Anonymous"
5. 강제 언래핑 (!)
let number: Int? = 42
let unwrappedNumber = number!
6. 암시적 언래핑 옵셔널
var implicitString: String! = "Hello"
let unwrappedString: String = implicitString
이 중에서 안전성과 사용 빈도를 고려할 때, 옵셔널 바인딩(if let)과 가드 문(guard let)이 가장 많이 사용되고 권장됩니다[1][2][3]. 옵셔널 체이닝과 nil 병합 연산자도 자주 사용되는 안전한 방법입니다[4]. 강제 언래핑(!)은 값이 확실히 존재한다고 확신할 때만 제한적으로 사용해야 하며, 암시적 언래핑 옵셔널은 특수한 경우에만 사용됩니다[5][7].
'iOS프로그래밍기초(Smile Han) > 복습' 카테고리의 다른 글
[iOS] 복습 10 - Xcode로 간단한 앱 개발하기 2 (2) | 2024.11.06 |
---|---|
[iOS] 복습 09 - Xcode로 간단한 앱 개발하기 (0) | 2024.10.30 |
[iOS] 복습 07 - Swift 문법 5 (2) | 2024.10.16 |
[iOS] 복습 02 - Swift 문법 1 (6) | 2024.09.11 |
[iOS] 복습 01 (2) | 2024.09.09 |