Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

브래의 슬기로운 코딩 생활

iOS프로그래밍 실무 3주차 정리 본문

2-1/iOS프로그래밍 실무

iOS프로그래밍 실무 3주차 정리

김브래 2023. 3. 22. 17:43

오늘은 거의 전부 지난주차 내용 복습만 했다.

아마도 저번주 내용이 중요도가 높기도 하고 동영상 강의 였어서 그런 것 같다.

이번 시간에 교수님 께서 언급하시고 중요한 내용만 일단 정리해 보겠다.


일반적으로 초깃값을 주지 않을 경우에만 자료형을 씀

 

정수 데이터 타입 : Int

부동 소수점 데이터 타입: Double

부울 데이터 타입 : Bool

문자 데이터 타입 : Character

문자열 데이터 타입 : String

 

변수 : var

상수 : let

 

튜플(Tuple)

Void는 빈 튜플 이다. = ()

typealias Void = ()*

()는 빈 튜플(empty tuple)

 

함수(메서드)를 선언할 때 반환 값이 없으면 반환형을 지정할 필요 없음

 

그러나 함수, 메서드 또는 클로저의 형(type)에는 반환형 반드시 작성
- 리턴값이 없는 함수의 형을 작성할 때는 반드시 Void 지정

 

반환값이 없는 클로저, 함수(메서드)를 선언할 때는 Void나 빈 튜플(())을 반환 형으로 사용
func logMessage(_ s: String) { // {앞에 ->Void나 ->() 생략
    print("Message: \(s)")
}
let logger: (String) -> Void = logMessage //여기서 ->Void는 생략 불가
logger("Hello")

 

옵셔널 타입(매우 중요)

Optional(10)
- Int? / Int!
- Int형 값을 저장 or 값이 없음(nil)
- var y : Int? = 10 //y?
- var z : Int! //z?

 

값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환함
- Int("100") // 100이 아닌 Optional(100)을 리턴함,print(Int("100")), Int형 initializer
- Int("Hi") // 정수 값을 반환할 수 없음, 아무런 값도 반환할 수 없다는 의미로 nil을 반환
- Swift에서 기본 자료형(Int, Double, String 등)은 nil값을 저장할 수 없음
- nil도 저장하려면 옵셔널 타입으로 선언해야 함
- 옵셔널 타입은 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법 제공
- 옵셔널 타입 변수를 선언하기 위해서는 타입 선언부 뒤에 “?” 문자를 씀

옵셔널 타입 강제 언래핑(forced unwrapping)

- 옵셔널 변수에 값이 있으면 옵셔널로 "래핑되었다(wrapped)"고 함
- 옵셔널에 래핑된 값은 강제 언래핑(forced unwrapping)으로 풀어줌

var x : Int?
x = 10
if x != nil {
    print(x!)

else {
    print("nil")
}
var x1 : Int?
if x1 != nil {
    print(x1!)

else {
    print("nil")
}

 

주의 :
if x!=nil
이라고 쓰면 안됨 //error: 'nil' cannot be assigned to type 'Int'

 

chatGPT

강제 추출 연산자 !는 피연산자와 꽉 묶이는(tightly associates) 높은 우선순위를 가진다.
즉, 대부분의 다른 연산자보다 먼저 계산되며, 다른 연산자와 함께 사용되는 표현식에서는
피연산자에 밀접하게(bind tightly) 결합되어, 표현식에서 다른 연산자와는 무관하게 즉시
적용된다.
예를 들어, let x = optionalValue! + 5 표현식에서 강제 추출 연산자 !는 덧셈 연산자
+보다 높은 우선순위를 가지므로, 옵셔널 값이 5에 더해지기 전에 먼저 추출된다.
그러나 옵셔널 값이 nil인 경우 런타임 오류가 발생할 수 있으므로, 가능한한 강제 추출
대신 옵셔널 바인딩 또는 옵셔널 체인을 사용하는 것이 좋다. 
이렇게 하면 코드를 보다 견고하게 만들어 crash를 피할 수 있다.

 

optional binding

- 강제 언래핑하는 또 다른 방법으로, 옵셔널 바인딩(optional binding)을 이용하여 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당

 

if let constantName = optionalName{
//옵셔널 변수가 값이 있다면 언래핑해서 일반 상수 constantName에 대입하고 if문 실행
//값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음
}
if var variableName = optionalName {
//옵셔널 변수가 값이 있다면 언래핑해서 일반 변수 varibleName에 대입하고 if문 실행
//값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음
}

 

var x : Int?
x = 10

if let xx = x { //옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행
print(x,xx) // if let x = x 라고 써도 됨, Swift 5.7부터는 if let x 라고 써도 됨 //short form of if-let to the Optional Binding 

else {
print("nil")
}
var x1 : Int?
if let xx = x1 { //옵셔널 변수 x1이 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 감
print(xx)

else {
print("nil")
}

 

Implicitly Unwrapped Optional*

- 형 다음에 ?가 아닌 !를 쓰는 옵셔널 형 // Int!, String!

- 일반 옵셔널 값으로 사용하려고 하지만, optional로 사용할 수 없는 경우 값을 강제로 푼다.
- Optional로 사용되지 않으면 자동으로 unwrap한다.

 

let x : Int? = 1
let y : Int = x!
let z = x
print(x,y,z) //Optional(1) 1 Optional(1)
print(type(of:x),type(of:y),type(of:z))
//Optional<Int> Int Optional<Int>
let a : Int! = 1 //Implicitly Unwrapped Optional
let b : Int = a //Optional로 사용되지 않으면 자동으로 unwrap함
let c : Int = a!
let d = a //Optional로 사용될 수 있으므로 Optional형임
let e = a + 1
print(a,b,c,d,e) //Optional(1) 1 1 Optional(1) 2
print(type(of:a),type(of:b),type(of:c),type(of:d), type(of:e))
//Optional<Int> Int Int Optional<Int> Int

 

옵셔널 변수에 초깃값을 할당하지 않으면 자동으로 nil이 할당됨

 

Any와 AnyObject

Any

 

var x: Any = "Hi"
print(x, type(of:x))
x = 10
print(x, type(of:x))
x = 3.5
print(x, type(of:x))

 

Nil-Coalescing Operator (Nil합병연산자) ??*

- 옵셔널변수 ?? nil일 때 할당되는 값
- 옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨

 

형 변환(as! as?로 downcasting)

- 부모인스턴스 as! 자식클래스

// downcasting 일반 타입으로 반환
// 다운캐스팅이 반드시 성공할 것이라는 확신이 있을 때


- 부모인스턴스 as? 자식클래스

// downcasting 옵셔널 타입으로 반환. 확신이 없을 경우

if문에서 콤마는 AND의미

 

매개변수 인자 리턴값

메서드(method)

- 특정 클래스, 구조체, 열거형 내의 함수
- 함수를 클래스 내에 선언하면 메서드라 부름

함수를 선언하는 방법

func ― 함수라는 것을 스위프트 컴파일러에게 알려주는 키워드
<함수명> ― 함수에 할당되는 이름
<매개변수 이름> ― 함수 코드 내에서 참조되는 매개변수의 이름
<매개변수 타입> ― 함수에 전달되는 매개변수의 타입
<반환값 타입> ― 함수가 반환하는 결과에 대한 데이터 타입. 반환하지 않으면 “->Void”는 생략 가능

 

매개변수를 받지 않으며 결과를 반환하지도 않고 오직 메시지만 출력
func sayHello() { //리턴값 없으면( -> Void ) 지정하지 않아도 됨
print("Hello")
}
void sayHello() { //C, C++
printf("Hello");
}


하나의 문자열과 하나의 정수를 매개변수로 받아서 문자열을 반환
func message(name: String, age: Int) -> String {
return("\(name) \(age)")
}

 

Swift 함수 정의와 호출하기

내부 매개변수 이름 vs 외부 매개변수 이름

함수명이 궁금해요 : #function 리터럴(literal)

Swift 함수명
- 함수명(외부매개변수명:외부매개변수명: ...) 

 

#function 리터럴을 사용하여 얻을 수 있음

 

func add(first x: Int, second y: Int) -> Int { 
    print(#function) //add(first:second:) 
    return(x+y)
}
print(add(first:10, second:20))

-과제-

let myTuple = (count: 10, length: 12.1, message: "Hi")

print(myTuple.message, myTuple.2)

print(type(of:myTuple))

// Hi Hi

// (count: Int, length: Double, message: String)

 

Void는 빈 튜플(empty tuple)

typealias Void = () / typealias는 별명을 만드는 자료형

 

var x : Int =10

var y : Int? =10

var z : Int!=10

print (x, y, z)

// 10 Optional(10) Optional(10)

 

var x : Int =10

var y : Int? =10

var z : Int!=10

print (x, y, z+1)

// 10 Optional(10) 11

 

var x : Int?

x =1090

if let x { //옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행

print(x)

}

else {

print("nil")

}

var x1 : Int?

if let x1 { //옵셔널 변수 x1이 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 감

print(x1)

}

else {

print("nil")

}

// 1090

// nil

 

var pet1: String?

var pet2: String?

pet1 ="cat"

pet2 ="dog"

if let pet1, let pet2 {

print(pet1,pet2)

} else {

print("nil")

}

// cat dog

 

let x : Int? =1

let y : Int = x!

let z = x

print(x,y,z) //Optional(1) 1 Optional(1)

print(type(of:x),type(of:y),type(of:z))

//Optional<Int> Int Optional<Int>

 

let a : Int!=1 //Implicitly Unwrapped Optional

let b : Int = a //Optional로 사용되지 않으면 자동으로 unwrap

let c : Int = a!

let d = a //Optional로 사용될 수 있으므로 Optional형임

let e = a +1

print(a,b,c,d,e) //Optional(1) 1 1 Optional(1) 2

print(type(of:a),type(of:b),type(of:c),type(of:d), type(of:e))

// Optional(1) 1 Optional(1)

// Optional<Int> Int Optional<Int>

// Optional(1) 1 1 Optional(1) 2

// Optional<Int> Int Int Optional<Int> Int

 

!옵셔널은 옵셔널 값으로 사용되지 않을 때 자동으로 언래핑 된다.

 

let defaultAge =1

var age : Int?

age =3

print(age) //Optional(3)

var myAge = age ?? defaultAge

print(myAge) //3

 

??연산자는 앞에는 옵셔널 값을 쓰고 뒤에는 nil일 경우에 표시 되는 값을 쓴다.

 

func sayHello() { //->Void or ->() 생략

print("Hello")

} //정의

sayHello() //호출

 

func add(x: Int, y: Int) ->Int {

print(#function)

return(x+y)

}

print(add(x:100, y:200))

print(type(of:add))

// add(x:y:)

// 300

// (Int, Int) -> Int

 

func add1(x: Int, y: Int) ->Int {

print(#function)

return(x+y)

}

print(type(of:add1))

func add2(first x: Int, second y: Int) ->Int {

print(#function)

return(x+y)

}

print(type(of:add2))

func add3(_ x: Int, _ y: Int) ->Int {

print(#function)

return(x+y)

}

print(type(of:add3))

func add4(_ x: Int, with y: Int) ->Int {

print(#function)

return(x+y)

}

print(type(of:add4))

add1(x: 0, y: 0)

add2(first: 0, second: 0)

add3(0, 0)

add4(0, with: 0)

// (Int, Int) -> Int

// (Int, Int) -> Int

// (Int, Int) -> Int

// (Int, Int) -> Int

// add1(x:y:)

// add2(first:second:)

// add3(_:_:)

// add4(_:with:)