본문 바로가기
iOS

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

by 23g 2024. 7. 20.

나름 강의 듣고 복습까지 했는데

은근 모르겠는 + 당황스러운 문제들이 많아서

공부를 더 열심히 해야겠다고 느꼈다 ㅎ

 

역시 보기만하면 공부가 아니라

내 것으로 만들어야 한다!

/**==================================================================
 [2번 문제]
  - 프로그래밍에서, 표현식(Expression)이 어떤 의미인가요? 아는대로 작성하세요.
 ===================================================================**/

// 오답 : 결과가 나오는 식
✅// 계산의 결과가 어떤 하나의 값으로 나올 수 있는 문장
// (예시) num + 5
/**==================================================================
 [6번 문제]
  - 함수만들어 보기: 여러개의 정해지지 않은 갯수의 정수를 받아서, 평균을 구하는 함수를 작성해 보세요.
    (힌트: 함수의 이름은 누구봐도 알아볼 수 있게, 평균..이란 말이 들어가면 좋겠네요!)
 ===================================================================**/


func average(num: Int...)-> Int{
    var sum = 0
    
    //오답 : for i in 0...num.count - 1 -> 굳이 이렇게 쓸 필요 없음,,
    ✅for i in num{
        sum += num[i]
    }
    //오답 : return sum/num.count -> 실수형까지 대비!
    ✅ return Double(sum) / Double(nums.count)
}

print(average(num: 50, 100))​
/**==================================================================
 [8번 문제]
  - 함수의 파라미터에서 사용하는 inout키워드에 대해서, 간단하게 설명해 보세요.
 ===================================================================**/

//오답 : // 함수 파라미터는 let(상수)로 선언되기 때문에 새로운 값을 대입하기 위해서는 inout 키워드를 이용해야함
// inout 키워드는 원본을 그대로 전달하는 것, 함수를 선언할 때는 타입 앞에 inout을 쓰고 함수를 사용할땐 &를 붙여야 함

// ✅함수의 파라미터에서 inout 키워드를 사용하면,
// 파라미터로 사용하는 변수의 직접적인 메모리 주소를 전달함

// 그래서 보통 두 숫자를 직접적으로 바꿀 수 있는 swap과 같은 함수를 구현할 수 있게 됨
// (두 숫자를 바꾸기 위해서는 함수 내부에서 상수로 사용하면 안되고, 직접 변수의 주소 전달이 필요)
/**==================================================================
 [9번 문제]
  -  다음의 제어전송문 4가지를 각각 쓰이는 경우와 어떻게 사용되는지 간단하게 설명하세요.
    (break / fallthrough / continue / return)
    (힌트1: break는 2가지 경우에 쓰입니다.)
    (힌트2: return은 리턴타입이 있는 함수/리턴타입이 없는 함수 구분해서, 설명해 주세요.)
 ===================================================================**/

//✅ 1.break문
/* 
 반복문 : 가장 가까운 반복문을 완전히 종료
 switch : case에서 어떤 문장의 실행도 없을 때 입력하는 약속
 */


//✅ 2.fallthrough문
// switch문에서 어떤 해당 case를 해당한 후, 다음 case의 해당 여부를
// 따지지 않고, 다음 case 내부의 문장을 실행


// 3.continue문
/*
 쓰이는 경우 : 반복문
 설명 : continue 시 반복문의 다음 주기로 넘어간다.
*/


//✅ 4.return문
/*
 쓰이는 경우 : 함수, 값을 반환하거나 함수를 종료할 때
 설명 :
 - 리턴 타입이 있는 함수 : return 문 뒤의 표현식을 평가한 후, 값을 반환하며 함수를 종료하고 벗어남.
 - 리턴 타입이 없는 함수 : 함수를 종료한다.
*/
/**==================================================================
 [11번 문제]
  - Optional 타입에는 .none이 있는데, 이것과 nil의 공통점 또는 차이점은?
 ===================================================================**/

// nil은 Optional.none의 리터럴 값의 형태 (그냥 완전히 같다고 생각해도 무방하긴 함) ⭐️

// [공통점]
// .none과 nil은 동일하게 임시타입으로써 내부에 값이 없음을 표현 (완전 동일)
// [차이점]
// .none은 실제 내부의 원시 형태이면서, 구체화된 형태 (nil은 포괄적인 표현)
/**==================================================================
 [12번 문제]
  - Optional을 언래핑(Unrapping) 하는 4가지 방법은? 간단하게 서술로 쓰시면 됩니다.
 ===================================================================**/

// 1번 방법
// 강제 언래핑 (!)


// 2번 방법
// if문으로 nil이 아님을 확인 한후, if문 안에서 강제 언래핑


// 3번 방법
// 옵셔널 바인딩(if let 바인딩)


//✅ 4번 방법
// 옵셔널표현식 ?? 디폴트값의 제시
/**==================================================================
 [13번 문제]
  - 열거형(Enum)은 어떤 경우에 사용하는 타입인가요? 아는대로 간단하게 서술해 보세요.
 ===================================================================**/

// 한정된 갯수의 사례(case)로 타입을 만들 수 있을때,
// 개발자가 직접만들어서 쓸 수 있는 Custom 타입
// 월 - 화 - 수 - 목 - 금 - 토 - 일
/**==================================================================
 [14번 문제]
 구글(google), 페이스북(facebook), 네이버(naver) 로그인을 위해 SiteLogin라는 이름을 가진
 아래의 Enum 타입을 완성해 보세요.
 
 각 case는 사용자의 아이디(String)와 비밀번호(String)를 위한 연관 값(associated value)을  가집니다.
 
 (만들고자 하는 타입 예시)
 enum SiteLogin { }
 
 (변수에 담았을때의 모습)
 var login1 = SiteLogin.google("google@gmail.com", "0000")
 
  (힌트: 연관값이라는 개념을 어떻게 사용해야 하죠?)
 ===================================================================**/

// 아래의 enum타입 완성

enum SiteLogin {
    case google(String, String)
    case facebook(String, String)
    case naver(String, String)
}

var login1 = SiteLogin.google("google@gmail.com", "0000")