[swift] swift 기본 문법 스터디 2주차
변수와 상수
메모리에 값을 저장하려면 저장하고 싶은 메모리의 주소값이 필요합니다. 그리고 우리가 저장한 값을 가져올 때도 메모리의 주소값이 필요하겠죠?
var x: Int = 10
print(x)
withUnsafeMutablePointer(to: &x) {
print("x address: \($0)")
}
x = 20
print(x)
withUnsafeMutablePointer(to: &x) {
print("x address: \($0)")
}
let y: Int = 30
print(y)
withUnsafePointer(to: &y) { // error!
print("y address: \($0)")
}
위와 같은 방법으로 메모리 주소값을 찍어보았습니다. 생각보다 간단하지 않아 당황했네요. 그런데 아직 의문인것은 같은 변수이지만, let 변수는 mutable 하지
않기 때문에 withUnsafeMutablePointer로 주소를 찍을 수 없었습니다.
이 부분에 대해서는 어떤 의미가 있는지 더 찾아보고 수정하도록 하겠습니다.
또한 변수에는 한글, 알파벳, 아라비아숫자, 특수기호까지 지원하는데 영어와숫자를 사용하는 것 이외에 다른 방법으로 변수를 할당하는 예가 있다면 알려주세요!
자료형
우리가 저장한 변수에는 타입이 있습니다. 기본적으로는 같은 타임의 변수들끼리 연산이 가능하죠.
실제 자료형들은 구조체로 구현되어 있으며, 연산이 가능한 연사자들이 내부에 정의 되어 있습니다.
-
Int - 정수를 저장할 때 씁니다.
signed
Int8 => 127 ~ -128 : 2^8(256)
Int16 => 32767 ~ -32768 : 2^16(65,536)
Int32 ^^;;
Int64 ^^;;unsigned
Int8 => 0 ~ 255 : 2^8(256)
Int16 => 0 ~ 65535 : 2^16(65,536)
Int32 ^^;;
Int64 ^^;; -
Double & Float - 소수점이 포함된 실수 값을 저장할 때 씁니다.
Double은 64bit, Float는 32bitFloat32와 Float64가 있는데 64는 Double과 같습니다.
-
Bool - 참값과 거짓값을 저장할 때 씁니다.
true or false! -
String - 문자열을 저장할 때 씁니다.
문자열을 표현할 때는"
기호를 사용합니다.
스위프트의 String과 NSString은 서로 호횐되기 때문에 변환할 수 있습니다. 오류가 발생할 가능성이 없는 완전 변환이 가능합니다.템플릿을 사용할 수 있습니다.
(변수) 를 “”(문자열) 사이에 넣어 문자열 템플릿을 사용할 수 있습니다.트리플 쿼팅이 있어서 여러줄의 문자열을 출력할 수 있습니다.
“”"
이 안에서는 문자열 그대로
출력이 됩니다.
“”"
트리플 쿼팅 안에 들어간 내용은 그대로 출력됩니다. -
Character - 문자를 저장할 때 씁니다.
문자가 모이면 문자열이 됩니다. 문자를 표현할 때도"
기호를 사용합니다.var x = "a" print(x)
위와 같이 했을 때는? String으로 추론합니다.
변수 뒤에는 변수의 타입이 어노테이션으로 와야합니다. 추론도 가능하지만, 명확하게 명시해 주는 것이 오해가 없습니다.
연산자
-
산술연산자
하나의 항만 필요한 단항 연산자와, 두개의 항이 필요한 이항연산자 (+, -, *, /, %)가 있습니다.
특이한 부분은 띄어쓰기는 꼭 항과 항사이에 똑같은 간격으로 해 주어야 합니다. -
비교연산자
비교할 수 있는 연산자이며, 그 결과가 항상 참, 거짓 값으로 반환됩니다.
크기를 비교하거나 같음을 비교하는 연산자가 있습니다. -
논리연산자
참, 거짓을 반환하는 점에서 비교연산자와 비슷합니다. 하지만 논리적인 연산을 합니다.
부정이나, 그리고, 또는 의 연산을 합니다. -
범위 연산자
1…5 -> 1, 2, 3, 4, 5
1…<5 -> 1, 2, 3, 4 -
대입 연산자
오른쪽에 있는 값을 왼쪽 변수에 대입 합니다.
다른 연산자들과 축약해서 사용될 수 있습니다.
a = a + 1 -> a += 1
열거형
'enum’이라는 키워드를 사용하여 열거할 수 있는 항목들을 만들 수 있습니다.
타입 추론을 사용할 수 있기 때문에, .case
형태로 쓸 수 있어 간결합니다.
특히 switch로 케이스를 갈라서 선택할 때 쓰면 매우 편리해 보입니다.
우리가 선택할 수 있는 경우의 수가 정해져 있다면 enum을 활용할 수 있어보입니다.
예를 들면 음식 이름을 입력 받을 때는 어떤 이름이 들어올 지 몰라서 문자열로 받아야 하지만,
내가 운영하는 식당 메뉴의 음식 이름을 입력받는다면 그 선택지가 유한하고 또한 주문하는 사람도
선택지를 알 수 있어서 주문하기 수월할 것 입니다.
order(foodname: "김치찌개")
order(foodname: .kimchizzigae)
이런 식으로 말이죠.
댓글
댓글 쓰기