iOS 프로그래밍 실무 (1)

김제형·2025년 3월 14일

변수/상수/자료형

  1. 변수 - 변경할 수 있는 값
  2. 상수 - 변경할 수 없는 값
  3. 자료형 - Int, String, Character, Bool, Float, Double, Void
var num : Int //Int형 변수 num 선언
let nameFile : String //String형 상수 nameFile 선언

변수명 생성 규칙
UpperCamelCase : 두가지 이상의 단어가 결합된 변수명을 만들 때 단어의 시작을 모두 대문자로 명명
lowerCamelCase : uppercamelcase와 비슷하지만 첫 시작 단어의 첫번째 글자를 소문자로 한다는 차이가 있다.

  • 주의점
    일반적인 Swift 함수,변수명을 만들땐 lowercamelcase를 사용하고 클래스, 구조체, 열거형등을 사용할 때 uppercamelcase를 사용한다.

Swift를 사용할 때 주의점

  1. = (이퀄) 양쪽엔 같은 간격의 공백을 주어야 함
var charName= "JH" // error
var charName = "JH" 

print(charName) // JH
  1. 자료형 표기을 표기할 땐 첫 글자를 대문자로 써야하며 변수에 값이 존재할 경우 자료형을 표기하지 않는다.
var name : string //error
var name : String

var name : String = "JH" //사용하지 않음
var name = "JH" 
//타입추론의 기능으로 인해 자동으로 String형으로 인식
Swift에는 타입추론이라는 기능이 있어 타입을 명시하지 않고 더욱 간결하게 코드 작성이 가능하다.
  1. Character를 사용할 땐 타입추론으로 인한 생략이 불가능하다.
var address = "서울" //String형으로 인식
var address : Charater = "서울"
// 명시해주어 Characte형으로 인식하게 된디.
  1. 출력문 중간에 변수 사용을 하고자 할 땐 (변수명)을 사용하여 표기해 줄 수 있다.
var name : String
name = "홍길동"
print("저의 이름은 \(name) 입니다.")

타입 어노테이션

  • 애플은 코드의 효율성을 높이기 위해 상수 사용을 권장한다.
  • 상수는 값을 할당할 때는 초기화가 보장 되어 있어야 한다, 즉 값을 바로 할당하거나 뒤에 초기화가 보장 되는 조건이 있는 경우 타입 어노테이션을 사용할 수 있다.
let frogname : String //타입 어노테이션으로 인한 초기화 지연
.
.
frogName = "개굴" //이와같이 초기화가 보장되어야 한다.

Tuple

  • 다양한 자료형의 값들을 묶어둘 수 있는 기능

    튜플은 함수에서 동일하지 않은 자료형을 가진 여러 값들을 한번에 반환할 수 있는 점이 매우 강력한 부분이다.

let student : (String, Int, String) = ("JH", 24 , "male")
var school = student.1

print(school)
  • Swift에서는 인덱스 값이 0부터 시작되기 때문에 1을 출력하면 두번째 값인 24가 출력된다.

Tuple의 사용의 주의사항

  1. 튜플의 각 이름을 부여할 수 있다.
let student: (name: String, age: Int, sex: String) = (name: "JH", age: 24, sex: "male")

let myTuple = (10, 12.1, "Hi") 
//myTuple의 자료형 = Int , Double, String

let myTuple = (count: 10, length: 12.1, message:Hi) 
//myTuple의 자료형 = Int , Double , String

print(myTuple.message, myTuple.2) 
//출력값 = Hi Hi
  1. 튜플을 출력할 때 _ (언더스코어)를 사용하면 그 값을 생략하고 출력할 수 있다.
var (name, age , _ ) = myTuple

print(myTuple) //출력 = name , age 만을 출력한다.

Void형

  • 반환값이 없는 클로저, 함수를 선언할 땐 Void나 빈 튜플을 반환 형으로 사용한다.
func voidPrac(_ p : String ) {
	print(p)
}
let log : (String)->Void = voidPrac 
log("HI")

p를 출력하는 함수 voidPrac을 만들고 그 만든 함수를 log라는 상수에 대합한 후 p를 출력하는 log에 Hi 라는 값 을 대입 했기 때문에 Hi가 출력되게 된다.

옵셔널 (optional)

  • 옵셔널은 오류가 발생할 수 있는 가능성이 있는 값에 옵셔널 선언을 하고 반환한다.
var name : String? //옵셔널 선언
name = "JH"

print(name)

옵셔널은 자료형 뒤에 ?를 붙여 선언한다.
2번째 줄과 같이 값을 지정해 줄 수 있으며 이렇게 값이 주어졌을 경우
값을 출력할 수 있지만 옵셔널이 감싸진 값을 반환하게 된다.

  • 위 예제의 이유는 혹시나 값이 사용자에게 값을 입력 받아 처리하는 프로그램일 경우
    사용자가 지정된 형태의 값을 주지 않을 가능성이 있기 때문에(ex-전화번호 입력칸에 이름)
    옵셔널을 감싸 값을 반환하게 되는거고 반환을 하였을 때 옳지 않은 값이 입력된 경우 값을 반환하는 것이 아닌 nil 값을 반환해 안전하게 프로그램을 유지할 수 있는 것이다.

옵셔널 언래핑방법

1. 강제 언래핑 ( forced unwrapping )

  • 옵셔널을 사용할 때 출력된 값에는 옵셔널 형이라는 객체가 감싸져 있기 때문에 연산이 불가능 하다. 그러기에 강제 언래핑이라는 방법으로 연산을 할 수 있다.
var x = Int?
x = 5
print(x) // 옵셔널로 감싸진 5
print( x + 1 ) //error
print( x! + 1 ) // 6

2. 옵셔널 바인딩 ( optional binding )

  • 옵셔널이 선언된 변수를 사용하고자 할때 그 변수 안에 값이 있는지 nil인지를 판단하여 값이 있을 경우 상수에 넣어 출력 , 없는 경우 실행되지 않게 하는 방법
let optionalName: String? = "Jea"

if let name = optionalName {
    print("이름이 \(name) 입니다.")
} else {
    print("값이 없습니다.")
}
  • 위 코드에선 옵셔널 형으로 선언 되었지만 jea 라는 값이 존재하기 때문에 "이름이 jea 입니다" 라는 값이 출력되게 된다.

  • 하지만 값이 존재하지 않는 아래의 경우

let optionalName: String?

값이 존재하지 않기 때문에 else문인 "값이 없습니다"를 출력하게 된다.

2-1. 다중 옵셔널 바인딩

  • 여러개의 옵셔널 값이 존재할 경우 한번에 바인딩을 하여 코드를 간결하게 만드는 방법
var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"
if let firstPet = pet1, let secondPet = pet2 { //1
print(firstPet, secondPet)
} else {
print("nil")
}
  • 이렇게 각 매개변수들 마다 옵셔널 바인딩을 해도 되지만 첫 if만 두고 뒤에 오는 let을 처음 한개만 써 short form of if-let to the Optional Binding이라는 방식으로 줄일 수 있다.
if let firstPet = pet1, secondPet = pet2 { 

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

  • 옵셔널 변수를 바인딩 할 때 출력된 값은 옵셔널형인 변수를 출력하게 되어 값이 없을 경우 nil값을 반환하게 되지만 ??를 사용하여 nil값 대신 출력할 수 있는 값을 미리 지정할 수 있다.
let defaultColor = "black"
var userDefinedColor: String?
var myColor = userDefinedColor ?? defaultColor
print(myColor) 

userDefinedColor = "red"
myColor = userDefinedColor ?? defaultColor
print(myColor)
  • 첫 print 문에는 myColor에 값이 할당되지 않았으므로 defaultColor인 black이 출력되게 되고 두번째 print 문 같은 경우엔 red라는 값이 할당되어있으므로 red가 출력되게 된다.
red는 옵셔널 형이 아닌 일반 String형인 red가 반환되게 된다.

이유는 nil 병합연산자를 사용하게 될 경우 이미 myColor에 값이 할당될 때 옵셔널 형이 없는 상태로 저장되기 때문에 마지막에 출력되는 red는 옵셔널 형이 아닌 값이 저장되게 되는 것이다.

연산자

  1. - : (단항) 변수 또는 표현식의 값을 음수로 만듦
  2. * : 곱셈
  3. / : 나눗셈
  4. + : 덧셈
  5. - : 뺄셈
  6. % : 나머지 연산

복합 대입 연산자

  • 변수 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로 나눈 나머지를 x에 할당
x &= y //x와 y의 bit AND 연산 결과를 x에 할당
x |= y //x와 y의 bit OR 연산 결과를 x에 할당

비교 연산자

  • 비교 연산자를 통해 Boolean 값을 반환함
x == y //x 와 y 가 같으면 True 반환
x == y //x와 y가 같다면 true를 반환
x > y //x가 y보다 크면 true를 반환
x >= y //x가 y보다 크거나 같다면 true를 반환
x < y //x가 y보다 작다면 true를 반환
x <= y //x가 y보다 작거나 같다면 true를 반환
x != y //x와 y가 같지 않다면 true를 반환

논리 연산자

! = NOT
&& = AND
|| = OR
^ = XOR

범위 연산자 ( ... )

  1. 닫힌 범위 연산자
x...n // x부터 n까지
  1. 반 열린 범위 연산자
x..<n // x부터 n 미만까지
  1. One-Sided Ranges
let names = ["A", "B", "C", "D"]
for name in names[2...] { 
print(name) //C D
}

//[...2] A B C
//[..<2] A B

삼항 연산자 (< ? :)

  • 형태 = [조건] ? [참 표현식] : [거짓 표현식]
var x = 10
var y = 56
print(\( x<y ? x : y)
  • x와 y의 값을 비교한 후 값이 참일 경우 "?" 뒤인 x가 실행되고 거짓이면 ":" 뒤에 있는 y가 실행되게 된다

다운캐스팅 (as! / as?)

  • 부모클래스의 인스턴스를 자식클래스로 바꾸는 과정
  1. as! : 강제로 바꾸지만, 실패하면 프로그램이 크래시 난다.
  2. as? : 안전하게 시도하고, 실패하면 nil을 돌려주어 옵셔널 타입으로 결과가 나온다.

타입 검사 (is)

  • 타입 검사는 is라는 연산자를 기준으로 왼쪽에 있는 값이 오른쪽에 있는 자료형이 맞는지 확인 후 Boolean 값을 반환하는 기능이다.
let name = "JH"
if name is String {
	print("문자열 값이야!")
}else{
	print("문자열이 아닌데?")
}
  • 위 예제는 name이라는 객체가 is 연산자를 통해 String형인지 판단하고 참일 경우 if문 거짓일 경우 false를 출력하게 된다.

제어문

  1. for~in 문
  • 원하는 만큼 반복하고자 할 때 사용한다.
- for 상수명 in 컬렉션 또는 범위 {
// 실행될 코드
}

참조체 i 대신 _(언더스코어)를 사용해 생략할 수 있다.

for i in 1...5 {
print("\(i) 안녕")
}
for _ in 1...5 {
print("안녕")
}

let names = ["A", "B", "C", "D"]
for name in names {
print(name)
} //A B C D 출력
  1. while 문
  • 반복 횟수를 정할 수 없고 조건문에 따라 반복하고자 할 때 사용한다.
while 조건식 {
// 반복 코드
}
  1. repeat~while 문
  • 반복 실행을 하고 조건문이 나중에 있어 코드를 실행 한 후 조건에 맞는지 검사한다.

    while 문 = 조건문 확인 후 코드 진행
    repeat~while 문 = 코드 실행 후 조건문 확인

repeat {
//
} while 조건식

var i = 10
repeat {
i=i-1
print(i) 
} while (i > 0)
//출력 = 9 8 7 6 5 4 3 2 1 

break문

for i in 1..<10 {
if i > 5 break
print(i)
}
  • 위와 같이 코드를 쓰게 되면 1부터 시작되게 되는데 처음부터 조건문에 부합하지 않아 에러가 나기 때문에 break 문을 걸어 반복문을 종료시킨다.
for i in 1..<10 {
if i < 5 break
print(i)
}

수정
미만 연산자를 초과 연사자로 바꾸게 되면 1이 반복문을 돌다가 6번째 반복에서 코드가 6이 되기 때문에 5까지 출력 후 반복문이 끝나게 된다.

continue

  • 반복문에서 continue문을 만나게 되면 모든 코드를 건너뛰고 반복문 상단부터 돌게 된다.
for i in 1...10 {
if i % 2 == 0 {
	continue
	}
	print(i)
}
//1 3 5 7 9
  • if문에 나눴을 때 몫이 0이면 건너뛰고 출력되게 되니 1부터 10중에 홀수만 출력되게 된다.
  1. if~else 문
if 불리언 표현식 {
// 표현식이 참일 경우 실행되는 코드
} else {
// 표현식이 거짓일 경우 실행되는 코드
}

var x = 3
if x % 2 == 0 {
	print("짝수")
}else{
	print("홀수")
}

조건 나열

  • if문에서 조건을 여러개를 부여하고 싶을 때 아래와 같이 수정하면 두 조건을 만족시킬때 코드가 실행되게 된다.
- && : 논리적인 연결을 강조한다.
if x % 2 == 0 && x != 0 {
	//실행 될 코드
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
> - , : 조건을 나열하여 깔끔한 조건을 쌓고 싶을 때 사용한다.
if x % 2 == 0 , x != 0 {
	//실행 될 코드
}
  1. guard 문
  • 코드의 조건이 거짓일 때 아래 코드를 실행한다.
guard <불리언 표현식> else {
// 표현식이 거짓일 경우에 실행될 코드
<코드 블록을 빠져 나갈 구문>
}
// 표현식이 참일 경우에 실행되는 코드는 이곳에 위치

특정 조건이 맞지 않을 경우 현재 함수나 반복문을 빠져나갈 수 있게 한다.

  1. switch~case 문
  • 내가 원하는 조건들이 들어있는 case문이 존재하고 값을 넣었을때 맞는 case를 반환하는 반복문이다.

  • 필히 case문 다음엔 구문이 들어가 있어야 한다.

switch 표현식
{
case match1:
	구문
case match2:
	구문
case match3, match4:
	구문
default:
	구문
}

모든 case 문에는 자동으로 break 문이 들어가 있다.

profile
개발자 지망생

0개의 댓글