iOS 기본 개념 정리

Terry/이은한·2023년 1월 10일
1

SWIFT

목록 보기
1/4

Q1 변수와 상수가 있는데, 언제 변수를 사용하고 언제 상수를 사용하는가?

변수는 계속 변하는 값을 지정 할 때에 사용하고, 상수는 변하지 않는 값을 지정할 때에 사용한다.

변수: var name: type(생략가능) = value
상수: let name: type(생략가능) = vlaue

Q2 기본 자료형 4가지는 무엇인가?

Bool, Character, Int, Float 이다.

Bool: Ture/False, A == B 에 대한 참/거짓을 반환
Character: 문자 (String: 문자열;;문자의 나열)
Int: 정수 (UInt: 0을 포함한 자연수)
Float: 유리수
64비트: Double, 32비트: Float

Q3 if 절 문법을 사용하여 라면 끓이는 방법을 의사코드로 작성하라.

라면 끓이는 방법

라면개수 설정
버너 위에 냄비를 올린다.
냄비에 (라면개수-1)*200 + 500 물을 넣는다.
냄비가 올려진 버너에 불을 붙인다.
라면개수만큼의 포장봉지를 뜯는다.
라면개수만큼의 라면스프봉지를 뜯는다.
라면개수만큼의 야채스프봉지를 뜯는다.
냄비에 라면스프를 라면개수 만큼 넣는다.
냄비에 야채스프를 라면개수 만큼 넣는다.

if 물온도 > 99 {
	냄비에 라면개수 만큼 라면을 넣는다.
    
else 물온도 측정

    if 타이머 > 179 {
    	버너를 끈다.
        
        else 버너유지 
        }
    }        

냄비의 라면을 접시로 옮긴다.

Q4 1 ~ 10 사이의 자연수가 구성요소로 있는 배열이 있다. 여기서 5가 들어 있는 요소에 접근하는 방법은 무엇인가?

이분탐색

배열 중 구성요소를 찾을 때에 정중앙의 구성요소를 타겟으로 하는 요소와 비교하여 정중앙 값이 타겟보다 값이 작으면 왼쪽의 요소들을 클 경우에는 오른쪽 요소들을 제거하고 남은 요소들의 중앙값을 새로 설정하여 위 과정을 반복한다.

Q5 독립변수와 종속변수의 관계를 표현한 표현식을 무엇이라고 하는가?

함수

func 함수명(독립변수명: type) { -> 종속변수 type
}

Q6 클래스와 구조체의 차이점은 무엇인가?

클래스는 init 함수를 꼭 만들어야 함.

구조체는 복사본을 만들고 원본을 바꾸어도 복사본이 바뀌지 않음.
클래스는 복사본을 만들고 원본을 바꿀 경우 복사본이 바뀜.
클래스에서만 상속이 가능함.

Q7 옵셔널은 무엇인가?

값이 있을수도 있고, 비워저 있을 수도 있다는 의미
nil의 가능성을 주석 및 문서가 아닌 코드로 표현가능하여 효율적인 코딩이 가능하게함.

var optionalValue: Int?! = 100

switch optionalValue {
case .none:
	print(This Optional variable is nil"
case. some:
	print("Value is \(value)")
  • 옵셔널 변수 선언에는 두 가지 방식이 있음.
var someValue: String?! = "어떤 값"
// someValue는 "어떤 값" 또는 nill이 될 수 있음.

1) Optional: 옵셔널

var question: Int? = 100
question = question + 1
//Error

2) Implicitly Unwrapped Optional(IUO): 암시적 추출 옵셔널

var exclamation: Int! = 100
exclamation = exclamation + 1
//101

exclamation = nil

exclamation = exclamation + 1
//Error: Optional Chaining
  • 옵셔널체인(Optional Chaining):
    옵셔널이 연속적으로 있을 때에 값을 꺼내기 편리함.
class Person {
    var name: String
    var job: String?
    var home: Apartment?
    
    init(name: String) {
        self.name = name
    }
}

class Apartment {
    var buildingNumber: String
    var roomNumber: String
    var `guard`: Person?
    var owner: Person?
    
    init(dong: String, ho: String) {
        buildingNumber = dong
        roomNumber = ho
    }
}

let yagom: Person? = Person(name: "yagom")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")


// 옵셔널 체이닝이 실행 후 결과값이 nil일 수 있으므로
// 결과 타입도 옵셔널입니다

// 만약 우리집의 경비원의 직업이 궁금하다면..?

// 옵셔널 체이닝을 사용하지 않는다면...
func guardJob(owner: Person?) {
    if let owner = owner {
        if let home = owner.home {
            if let `guard` = home.guard {
                if let guardJob = `guard`.job {
                    print("우리집 경비원의 직업은 \(guardJob)입니다")
                } else {
                    print("우리집 경비원은 직업이 없어요")
                }
            }
        }
    }
}

guardJob(owner: yagom)

// 옵셔널 체이닝을 사용한다면
func guardJobWithOptionalChaining(owner: Person?) {
    if let guardJob = owner?.home?.guard?.job {
        print("우리집 경비원의 직업은 \(guardJob)입니다")
    } else {
        print("우리집 경비원은 직업이 없어요")
    }
}

guardJobWithOptionalChaining(owner: yagom)
// 우리집 경비원은 직업이 없어요



yagom?.home?.guard?.job // nil

yagom?.home = apart

yagom?.home // Optional(Apartment)
yagom?.home?.guard // nil

yagom?.home?.guard = superman

yagom?.home?.guard // Optional(Person)

yagom?.home?.guard?.name // superman
yagom?.home?.guard?.job // nil

yagom?.home?.guard?.job = "경비원"

nil 병합 연산자

optional ?? Value 로 사용
optional 값이 nil일 경우 오른쪽 값 사용

var guardJob: String
    
guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원

yagom?.home?.guard?.job = nil

guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 슈퍼맨

  • Optional Unwrapping: 옵셔널 값 추출
    1) Optional Binding: 옵셔널 바인딩
    -> nil check + 안전한 값 추출
    if-let 구문으로 값이 있을 경우 추출, 없을 경우 nil
var my: String?! = "yagom"
	print(my) // optional("yagom")
    
if let name = my {
    print(name)
}
   //yagom

2) Force Unwrapping: 강제 추출
-> !를 붙여서 강제로 추출

var my: String? = "yagom"
	print(my!) // yagom

3) Force Unwrapping이 편함에도 주의해야 할 것: 런타임 오류

  • Compile Error: 문법적인 오류로 run을 돌리기 전에 오류를 발견하여 쉽게 발견할 수 있음.
  • Runtime Error: run을 돌린 후에 발견되는 오류로 원인을 발견하기가 비교적 까다로움.

따라서 Force Unwrapping 보다는 Optional Binding을 사용하는 것이 더 안전함.

RunTimeError

nil이 아닌 값이 들어갈 때만 동작하게 하는 Optional Binding으로 옵셔널 값을 추출하면, RunTimeError를 예방할 수 있음.

var my: String? = "ag"
var you: String! = nil


if let name = my, let friend = you {
    print("\(name) and \(friend)")
}
// 실행해도 아무 일이 일어나지 않음

Q8 부모클래스와 자식클래스의 예시를 UIKit에서 들어보시오.

클래스 상속:
부모클래스(Superclass/Parents-class)의 methods, properties등을 자식클래스(Subclass/Child-class) 에서도 동일하게 사용할 수 있게 함.

// 기반 클래스 Person
class Person {
    var name: String = ""
    
    func selfIntroduce() {
        print("저는 \(name)입니다")
    }
    
    // final 키워드를 사용하여 재정의를 방지할 수 있습니다
    final func sayHello() {
        print("hello")
    }
    
    // 타입 메서드
    // 재정의 불가 타입 메서드 - static
    static func typeMethod() {
        print("type method - static")
    }
    
    // 재정의 가능 타입 메서드 - class
    class func classMethod() {
        print("type method - class")
    }
    
    // 재정의 가능한 class 메서드라도 
    // final 키워드를 사용하면 재정의 할 수 없습니다
    // 메서드 앞의 `static`과 `final class`는 똑같은 역할을 합니다
    final class func finalCalssMethod() {
        print("type method - final class")
    }
}

// Person을 상속받는 Student
class Student: Person {
    var major: String = ""
    
    override func selfIntroduce() {
        print("저는 \(name)이고, 전공은 \(major)입니다")
    }
    
    override class func classMethod() {
        print("overriden type method - class")
    }
    
    // static을 사용한 타입 메서드는 재정의 할 수 없습니다
//    override static func typeMethod() {    }
    
    // final 키워드를 사용한 메서드, 프로퍼티는 재정의 할 수 없습니다
//    override func sayHello() {    }
//    override class func finalClassMethod() {    }

}


UIKit: Apple 플랫폼에서 앱을 구축하기 위한 그래픽, 이팩트 기반의 프레임워크.

UIViewController는 UIKit 프레임워크에 정의 된 클래스.
ViewController는 UIViewCotroller를 상속받는다.

여기서 부모클래스는 UIViewController
자식클래스는 ViewController가 된다.

Q9 익스텐션은 클래스와 차이점은 무엇인가?

  • 상속
    클래스는 클래스 타입에서만 가능하나 익스텐션은 구조체, 프로토콜 등 타입을 넘나들며 가능
  • 자식클래스를 바꿀 경우 부모클래스가 변하는 클래스와 다르게 익스텐션은 변하지 않음
profile
iOS 개발자

0개의 댓글