![[Swift 문법] 1. 상수와 변수](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbeitoy%2FbtsJWT9FifG%2F9LWXkqtQxpC9VfofWdJGx1%2Fimg.png)
2024.06.13 수정
🍎 1. 상수와 변수
- 사실 변수와 상수의 차이점은 이름에서 그대로 나타난다.
- 변수는 변할 수 있는 값이고 상수는 변할 수 없는 값이다.
- 변수는
var
키워드로, 상수는let
키워드로 선언
🍏 1. 상수(let)
- 변하지 않는 일정값
- 값에 이름을 부여하는 것
ex) 디바이스의 전체 용량 표시 사용 가능 let 상수명 : 데이터타입 = 값
상수에 한번 값을 부여 할 수 있으며, 2번 이상 대입하게 되면 오류가 발생함, 여러 번 값을 대입하는 경우 변수 사용해야 함
🍏 2. 변수(var)
- 스위프트의 변수란 데이터를 저장할 수 있는 공간을 의미
- ex) 현재 사용가능한 용량을 표시할 때 사용 가능
- 상수와 달리 변수 생성 후 다시 값을 대입하는 것이 가능함
(var 안의 값(value)은 초기 설정값을 언제든지 수정하고 초기화할 수 있다.)
🍀 1) 스위프트 변수 문법
var name: Type = value
- 변수는 이름, 타입, 값, 영역으로 구분
- 이름(nmae)은 말 그대로 변수를 구분하기 위해 사용되는 '이름'
- name은 변수명으로써 개발자가 원하는 이름을 임의로 설정
- 형(Type)은 타입이라고도 하는데, 데이터의 자료형
- 값(value)은 변수에 들어가는 데이터를 의미
- 영역은 변수가 사용 가능한 범위를 의미
- 이름(nmae)은 말 그대로 변수를 구분하기 위해 사용되는 '이름'
🍀 2) 스위프트 변수 이름 규칙
① 스위프트에서 미리 사용하고 있는 예약어 또는 키워드는 사용이 불가함
- 사용하기 위해선 Backtic 기호인 ``를 사용
enum Sample {
case `class`
case `var`
case `let`
}
② 숫자로 시작되는 이름은 불가하지만 숫자가 포함된 이름은 가능하다
- 예시 ) jjooe1 (O) / 1 jjooe(X)
③ 변수의 이름에는 공백이 포함될 수 없다.
④ lowerCamelCase 규칙을 따름
- 첫 단어를 제외한 모든 단어의 첫 글자는 모두 대문자로 써줌
- memberNumber, userStatusCode 등
🍀 3) 스위프트 변수 선언과 할당
var x: Int
- 변수는 var이라는 키워드를 통해 선언
var x: Int = 3
- 변수의 값 할당은 대입 연사자인 = 을 통해 할당
🍏 3. 상수와 변수의 메모리 관리
- Swift는 상수와 변수를 효율적으로 관리, 메모리 관리는 Swift의 성능에 중요한 역할
- 상수의 메모리 관리:
- 상수는 변하지 않는 값을 저장하므로, 컴파일 타임에 최적화가 가능함.
- 최적화는 메모리 사용을 줄이고, 런타임 성능을 향상할 수 있습니다.
- 예시 ) 상수의 값이 고정되어 있으므로, 컴파일러는 해당 메모리 위치를 고정, 이를 통해 접근 속도를 향상
- 변수의 메모리 관리:
- 변수는 값이 변경될 수 있으므로, 메모리 관리가 더 유연해야 함.
- 변수의 값이 변할 때마다, 메모리의 내용을 업데이트해야 하므로, 메모리 사용에 대한 주의가 필요
- 예시 ) 변수의 값을 자주 변경하는 경우, 메모리 관리의 효율성을 높이기 위해 ARC(Automatic Reference Counting)와 같은 메모리 관리 기법이 사용
🍏 4. 상수와 변수의 스코프와 라이프사이클
- 스코프(Scope):
- 변수와 상수의 스코프는 코드 내에서 그들이 유효한 범위를 정의함
- 스코프는 코드의 가독성과 유지보수성에 큰 영향을 미침
- 지역 변수(Local Variable): 함수나 블록 내부에서 선언된 변수로, 그 함수나 블록이 끝나면 사라집니다.
- 전역 변수(Global Variable): 파일 또는 클래스 전체에서 접근할 수 있는 변수로, 프로그램의 실행 동안 계속 존재합니다.
- 라이프사이클(Lifecycle):
- 변수와 상수의 라이프사이클은 메모리에서 그들의 저장과 해제 과정을 설명합니다
- 초기화(Initialization): 변수나 상수가 선언되면 메모리에 할당
- 활성화(Activation): 변수나 상수가 유효 범위 내에 있을 때 활성화
- 해제(Deallocation): 변수나 상수가 더 이상 필요 없게 되면 메모리에서 해제됩니다. Swift는 ARC(Automatic Reference Counting)를 사용하여 객체의 참조 카운트를 자동으로 관리하여 메모리 해제를 처리합니다.
🍎 1. 타입 추론(Type Inference) vs 타입 어노테이션(Type Annotation)
🍏 1. Swift의 변수(상수) 선언
let name
var age
상수면 let 변수면 var 키워드를 사용하고,
옆에 변수명, 상수명을 붙여주는 식으로 사용함
BUT! 저렇게만 쓰면 `Type annotation missing in pattern ` 오류가 뜸
C나 Objective-C나 뭐 기타 좀 오래된 언어들의 선언 방식과 마찬가지로 Swift도 변수(상수)를 선언할 땐 컴파일러가 알 수 있게 Type을 명시해줘야 함
이 자료형을 명시하는 방법 2가지가
- 타입 추론(Type Inference)
- 타입 어노테이션(Type Annotation)
🍏 2. 타입 추론 (Type Inference)
let name = "jjoohee"
- 타입 추론은 위 와 같이 선언과 동시에 초기화해주는 것을 말함
- 추론이란 말 그대로 컴파일러가 초기화된 값("jjoohee")을 보고 타입을 추론하는 것
여기서 "jjoohee"는 String값이기 때문에 컴파일러가 알아서 String이겠구나 하고 추론하여 String타입으로 지정하는 것!
let name = "jjoohee"
type(of: name) // String.Type
🌈 장점
ⓛ 직접 타입을 명시(Type Annotation) 해주지 않아도 됨
② Swift 언어 특성 중 하나인 "설계에 의한 안정성" 항목이 해당됨
🌈 단점(문제점)
ⓛ 원하는 타입으로 추론되지 않는 경우
- Double / float
let num = 17.0 // float라고 하고 싶음 type(of: num) // Double.Type
- Character / String
let name = "A" // Character라고 하고 싶음 type(of: name) // String.Type
👆 위의 상황처럼 초기값을 보고 유추할 경우 자료형을 더 큰 범위의 자료형으로 지정해 버리기 때문에 100% 내가 원하는 자료형으로 지정이 안될 수 있음.
Float -> Double, Character -> String
② 초기값이 없는 경우 추론을 사용할 수 없음
③ 가독성이 떨어짐
🍀 3) 타입 명시(Type Annotation)
let/var 변수명: 자료형
let name : String
- 타입 명시는 위와 같이 직접 자료형을 지정해 주는 것
- : 뒤에 자료형을 명시하는 방법임
- : 뒤에 한 칸 띄우는 것은 가독성을 위해 띄우는 것
- 초기값 당연히 없어도 됨!
- 타입을 알려줬기 때문에 타입을 유추할 필요가 없음
= 초기값을 부여할 필요가 없음! - Annotation = 주석 / 자료형 주석을 달아줬기 때문
- 타입을 알려줬기 때문에 타입을 유추할 필요가 없음
🍀 장점
ⓛ 타입 추론으로 원하는 자료형을 얻지 못할 경우 사용할 수 있음
② 초기 값이 없을 경우 사용할 수 있음
③ 타입 추론은 컴파일러가 타입을 추론하는 과정에서 타입 명시보다 시간이 조금 더 걸림
🍀 단점
- 추가적인 타입 정보를 작성해야 하므로 코드가 길어질 수 있음
'swift' 카테고리의 다른 글
[Swift 문법] 2 - 1. 기본 자료형 (0) | 2024.10.06 |
---|---|
[Swift 문법] 2. 자료형 (0) | 2024.10.06 |
iOS Junior Developer를 위해 공부 또 공부
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!