본문 바로가기
iOS

[앨런 Swift문법 마스터 스쿨] 3주차 시험 오답 노트

by 23g 2024. 8. 5.

 

3주차 시험에 대한 오답 노트를 작성하면서

개념들을 다시 정리하고 부족한 부분을 보완하겠어요 !

 

⭐️ : 정답 혹은 더 나은 답

❌ : 내가 쓴 오답

 

[ 1번 문제 ]

랜덤 값을 이용해 배열의 엘리먼트 출력하기

var result = array[num % 4]
//⭐️var result = array[num % array.count]

: 나는 배열 속 엘리먼트 갯수가 4개라 %4를 썼지만

.count를 사용하는게 유연성에 좋음

 

[ 4번 문제 ] 

배열 속 가장 큰 숫자 찾기

var numArray = [4, 0, 1, 7, 9, 3]

func findMaxNumber(array: [Int]) -> Int{
    var maxNum = 0
    for i in numArray{
        if i > maxNum{
            maxNum = i
        }
    }
    return maxNum
}
// 함수의 실행
findMaxNumber(array: numArray)


// 오답 ❌
// 대략적인 힌트
//func findMaxNumber(array: ) -> Int{
//    var maxNum = 0
//    for i in numArray {
//        if numArray[i] > maxNum {
//            maxNum = numArray[i]
//        }
//    }
//    return maxNum
//}

: 다시 풀어보니 풀렸던 문제

 

[ 5번 문제 ]

요소 변경 

var alphabetArray = ["A", "B", "C", "D", "E", "F", "G"]

// 아래 배열을 이용
["x", "y", "z"]

// 1. 서브스크립트
//오답 ❌ alphabetArray.insert(contentsOf: ["x", "y", "z"], at: 0)
// ⭐️
alphabetArray[0...2] = ["x", "y", "z"]

// 2. 정식 문법
// ⭐️
alphabetArray.replaceSubrange(0...2, with: ["x", "y", "z"])

 

: 어렵게 생각하다가 헷갈린,,,

  • count: 배열에 있는 요소의 개수를 반환함.
  • isEmpty: 배열이 비어있는지 여부를 나타냄. 비어있으면 true, 아니면 false.
  • first: 배열의 첫 번째 요소를 반환함. 배열이 비어있으면 nil.
  • append(요소): 배열의 끝에 요소를 추가함.
  • insert(요소, at:인덱스): 배열의 특정 인덱스에 요소를 삽입함.
  • remove(at:인덱스): 배열의 특정 인덱스에 있는 요소를 삭제하고, 삭제된 요소를 반환함.
  • array[index] = newValue: 배열의 특정 인덱스에 있는 값을 새로운 값으로 교체함.

[ 6번 문제 ]

해당 마지막 요소 삭제

var puppy = ["p", "u", "p", "p", "y"]

//❌
//var puppyResult = puppy.lastIndex(of: "p")
//puppy.remove(at: puppyResult!)

//⭐️
if let puppyResult = puppy.lastIndex(of: "p"){
    puppy.remove(at: puppyResult)
}
// 배열 확인 및 출력
print(puppy)

 

: 옵셔널 타입을 항상 염두에 두기

 

[ 7번 문제 ]

value 출력

var dic = ["A": "Apple", "B": "Banana", "C": "City"]

var result2 = dic["A"]

if let result3 = result2{
    print(result3)
}

//위에도 맞지만 아래처럼도 가능
// 딕셔너리의 결과값이 옵셔널 타입이기 때문에.. 옵셔널 바인딩과 합쳐서 작성⭐️
if let result2 = dic["A"] {
    print(result2)
}

: 코드의 중복을 최소화!!!

 

[ 8번 문제 ]

소수 판별

func primeNumber(num: Int) {
    for i in 2...num {
        if num % i == 0{
            print("소수가 아닙니다.")
            break
        }else{
            print("소수입니다.")
            break
        }
    }
    // 더 나은 코드 ⭐️
//    for i in 2..<num {
//        if num % i == 0 {
//            print("소수가 아닙니다.")
//            return
//        }
//    }
//    print("소수입니다.")
}

: return을 활용해서 불필요한 else 절 줄이기

 

[ 9번 문제 ]

제어 전송문 설명

// 1.break문
// 반복문 for / while
// (가장 가까운) 반복문을 종료시킴
//⭐️ switch
// 해당하는 case문이 하나도 없을 때 입력하는 약속

// 4.return문
// 리턴값 있을 때
// ⭐️return 문 뒤의 표현식을 평가한 후, 그 값을 반환하면서 함수를 종료하고 벗어남
// 리턴값 없을 때
// 함수를 종료시킴

 

: 표현식 평가 -> 반환 -> 종료!

"표현식을 평가한다"는 말은 

단순히 계산을 수행하거나, 변수의 값을 확인하거나, 함수를 호출하는 등의 작업을 통해 최종적인 결과 값을 얻는 과정을 의미!!!

 

[ 11번 문제 ]

열거형을 switch문으로 분기 처리하기

열거형 case 패턴

enum SiteLogin {
    case google(email: String, password: String)
    case facebook(email: String, password: String)
    case naver(email: String, password: String)
}
var login1 = SiteLogin.google(email: "google@gmail.com", password: "0000")

// ⭐️⭐️⭐️ 스위치문으로 이메일과 비밀번호를 출력하는 코드를 완성

switch login1 {
case .google(email: let email, password: let password):
    print("이메일 주소: \(email), 비밀번호: \(password)")
case .facebook(email: let email, password: let password):
    print("이메일 주소: \(email), 비밀번호: \(password)")
case .naver(email: let email, password: let password):
    print("이메일 주소: \(email), 비밀번호: \(password)")
}

[열거형 case 패턴]
케이스 내부에 구체적인 정보(연관값)가 들어 있고,
그 구체적인 정보를 꺼내서 활용하기 위해 변수에 바인딩해서 사용하는 패턴

[ let 변수이름 = 열거형 내부의 연관값 ]

 

[ 12번 문제 ] 

클래스의 저장 속성

:

// let, var 데이터를 저장하는 것

// ⭐️ 인스턴스 내에 실제 데이터값을 저장할 수 있는 데이터 저장 공간 / 인스턴스 내의 변수(상수)

 

[ 13번 문제 ] 

클래스의 계산 속성 :

// get을 통해 값을 받아오거니 set을 통해 값을 설정하는 것

// ⭐️

// 속성의 형태를 가진 실질적인 메서드 (실제 데이터 값은 없음)

// get블록(getter) / set블록(setter)가 존재

// 1) getter - 외부에서 인스턴스에 접근해서 값을 얻어가는 메서드 (필수/최소한)

// 2) setter - 외부에서 인스턴스에 접근해서 값을 셋팅하는 메서드 (선택)

 

[ 14번 문제 ] 

클래스와 구조체의 차이

 

// 클래스는 상속 가능, 구조체는 상속 불가능

// ⭐️

// 실제로 디테일하게는 여러가지 차이점이 있지만, 아래 가장 중요한 차이점 2가지는

// 반드시 외우고 있어야 함

 

// 1) 상속 가능 여부

//    (1) 클래스는 상속가능

//    (2) 구조체는 상속 불가능

 

// 2) 메모리 저장의 차이

//    (1) 클래스의 인스턴스는 Heap (참조 타입)

//    (2) 구조체의 인스턴스는 Stack (값 타입)


확실히 강의에서 완전히 이해하고 넘어가지 못한 부분은

시험 문제에서 걸린다...!!!

복습을 철저히 해야할 것 같다