하루살이 개발일지

Swift란? Swift에서의 변수, 상수, 정적 변수 본문

앱개발/Swift

Swift란? Swift에서의 변수, 상수, 정적 변수

harusari 2024. 5. 30. 18:01

Swift란?

Swift는 애플이 개발한 프로그래밍 언어로, iOS, macOS, watchOS, tvOS 및 Linux에서 사용되는 소프트웨어를 작성하는 데 사용된다. Swift는 안전하고 빠르며 현대적인 언어 사상을 반영하고 있다.

 

Swift의 특징

Swift는 안전하고, 빠르며, 현대적인 문법을 가진 언어이다.

 

1. Swift는 안전한 프로그래밍을 지향하며, 프로그래밍 도중 개발자가 저지를 수 있는 실수를 엄격한 문법을 적용해 미연에 방지한다.

  • 변수는 사용 전에 항상 초기화된다.
  • 배열 인덱스는 범위를 벗어나지 않도록 검사된다.
  • 정수는 오버플로우가 있는지 검사된다.
  • 옵셔널은 nil 값을 명시적으로 처리하도록 한다.
  • 에러 핸들링을 통해 예상치 못한 오류의 제어된 복구를 가능하게 한다.
  • 메모리는 자동으로 관리되어 개발자가 메모리 관리에 신경쓸 필요가 없다.

 

2. C언어를 기반으로 한 C, C++, Object-C와 같은 프로그래밍 언어를 대체하기 위해 만들어진 언어로, 실행 속도 최적화 및 더 빠른 컴파일 성능을 구현하게 해준다.

3. 수많은 프로그래밍 언어 문법을 참고해 좀 더 사용하기 편하고 보기 좋은 문법을 사용한다. 현대적이고 세련된 문법을 구사할 수 있다.

  • Swift는 다중 패러다임 프로그래밍 언어이다.
    • C : 명령형 프로그램이 패러다임
    • C++, Java : 다중 프로그래밍 패러다임 (명령형 + 객체지향)
    • Swift : 다중 프로그래밍 패러다임 (명령형 + 객체지향 + 함수형 + 프로토콜 지향)

 


 

변수(var), 상수(let), 옵셔널 변수

변수(var)

  • var 사용
  • 변수의 값을 나중에 바꿀 수 있음
  • 변수 스코프는 선언된 위치에 따라 다름. 함수 내부에 선언된 변수는 외부에서 접근 불가.
var message = "Hello, World!"
message = "Hello, Swift!" // 값 변경 가능
print(message) // 출력: Hello, Swift!

 

 

상수(let)

  • let 사용
  • 한 번 값이 설정되면 바꿀 수 없음
  • 선언과 할당을 동시에 해야 함
let pi = 3.14159
// pi = 3.14 // 오류 발생: 상수는 재할당할 수 없음
print(pi) // 출력: 3.14159

 

 

옵셔널 변수

  • 옵셔널 변수는 값이 있을 수도 있고 없을 수도 있는 변수
  • `?` 를 사용하여 선언
  • 옵셔널 변수는 값이 없을 때 `nil`을 가질 수 있음
var optionalString: String?

 

이는 String 타입의 값을 가질 수도 있고 아무런 값을 가지지 않을 수도 있음

즉, 값이 string이거나 nil일 수도 있다는 뜻

 

 

[옵셔널 변수의 활용]

옵셔널 변수는 값이 없을 수 있기 때문에, 이를 확인한 후 안전하게 사용하는 것이 좋다.

(옵셔널 언래핑 : 옵셔널로 감싸진 값을 풀어 옵셔널이 아닌 값을 추출하는 작업)

 

1. 강제 언래핑

값이 있다고 확신할 때 `!` 를 사용해 강제 언래핑할 수 있다. but 값이 없는 경우 런타임 에러가 날 수 있으니 조심.

var optionalName: String? = "Alice"
print(optionalName!) // 출력: Alice

 

 

2. 옵셔널 바인딩

`if let` 또는 `guard let` 을 통해 안전하게 값을 언래핑할 수 있다.

if let name = optionalName {
    print(name) // 값이 있을 때만 실행됨
} else {
    print("값이 없습니다.")
}

 

 

3. nil 병합 연산자 (Nil-Coalescing Operator)

옵셔널 변수가 `nil`인 경우 기본값을 제공할 수 있다.

let defaultName = optionalName ?? "Unknown"
print(defaultName) // optionalName이 nil일 경우 "Unknown" 출력

 

등등이 있다.

 

 


정적 변수 (static)

  • static 키워드 사용
  • 정적 변수란, 구조체의 인스턴스나 클래스가 아닌 클래스 자체에 속하는 변수
  • 즉, 클래스의 모든 인스턴스가 공유하는 변수
class Person {
    static var age = 12 // 정적 변수
    var lastName = "IM" // 인스턴스 변수
}

// class Person의 새로운 인스턴스 생성
var haru = Person()
var maru = Person()
var daru = Person()

// 각 인스턴스는 자신의 lastName을 가짐
haru.lastName = "Kim"
maru.lastName = "Lee"
daru.lastName = "Park"

// 정적 변수는 모든 인스턴스가 공유, 인스턴스 생성하지 않고도 출력 가능
print(Person.age) // 출력: 12

// 정적 변수 변경
Person.age = 15
print(Person.age) // 출력: 15

// 모든 인스턴스가 같은 정적 변수를 공유
print("Haru's age: \(haru.age)") // 출력: Haru's age: 15
print("Maru's age: \(maru.age)") // 출력: Maru's age: 15
print("Daru's age: \(daru.age)") // 출력: Daru's age: 15

// 모든 인스턴스의 lastName은 인스턴스마다 다름
print(haru.lastName) // 출력: Kim
print(maru.lastName) // 출력: Lee
print(daru.lastName) // 출력: Park

 

위 예시에서 Person 클래스의 정적 변수는 age이다. 이는 클래스 자체에 속하며, 모든 인스턴스가 이 변수를 공유한다.

반면 lastName은 인스턴스 변수로, 각 인스턴스마다 별도로 존재한다.

 

더보기

문자열 보간 (string interpolation)

 

문자열 보건은 문자열 내에 변수나 표현식을 삽입할 수 있게 해준다.

`\(변수나 표현식)` 형태로 사용한다. 

 

즉, 정적 변수는 모든 인스턴스가 하나의 값을 공유해야 할 때 유용하다.

또 다른 예시로, 전체 사용자 수를 카운트해야 할 때를 들 수 있다.

class User {
    static var userCount = 0 // 정적 변수
    var name: String // 인스턴스 변수

    init(name: String) {
        self.name = name
        User.userCount += 1
    }
}

let user1 = User(name: "Alice")
let user2 = User(name: "Bob")

// 전체 사용자 수 출력
print(User.userCount) // 출력: 2

 

userCount는 정적 변수로 모든 User 인스턴스가 공유하며, name은 인스턴스 변수로 각 User 인스턴스마다 별도의 값을 가진다.

각 인스턴스가 생성될 때마다 init 메서드가 호출되며, 내부에서 userCount를 증가시킨다.

 

더보기
💡참고) Swift의 class와 JavaScript의 class 비교

 

기능 Swift JavaScript
클래스 선언 class User { ... } class User { ... }
정적 변수 static var userCount = 0 static userCount = 0
인스턴스 변수 var name: String constructor(name) { this.name = name }
초기화 메서드 init(name: String) { ... } constructor(name) { ... }
인스턴스 참조 self.name this.name
정적 변수 접근 User.userCount User.userCount

 

 

 

 


Reference

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/guidedtour

https://velog.io/@dbqls200/Swift-Swift-%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8%EB%9E%80

https://www.youtube.com/watch?v=xKf6iNilRYI&list=PL5PR3UyfTWvfacnfUsvNcxIiKIgidNRoW&index=2

 

'앱개발 > Swift' 카테고리의 다른 글

[Swift] 함수  (1) 2024.06.08
Swift에서의 기본 데이터 타입  (0) 2024.05.30