Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Ruff! Ruff!

#2: CS50 track - lesson1 본문

Ios

#2: CS50 track - lesson1

maeng-kim 2024. 1. 13. 14:44

*swift는 명령어 뒤에 end의 뜻으로 터미네이터(;) 사용 가능하지만 애플에선 권장하지 않음. 

변수: let, var

let: 상수. 변경 불가능 

var: 변수. 변경 가능

내장 데이터 타입: array, bool, dictionary, int, double, float, set, string

 

 

변수 선언 

상수) let title: String = "cs50" -> let 변수명:(콜론) 변수타입 = 값

변수) var count = 50 -> var 변수명 = 값

 

 

조건문

if title == "ios" || title == "android" {

     print("good choice")

}

else {

      print("maybe next time")

}

* 조건에 (괄호) 사용 안 해도 됨.

* || -> or / && -> and

*format 지정자 사용가능.

 

 

배열선언

let values: [Int] = [1,2,3]  //변수타입 생략 가능, 컴파일러가 배열값 확인해서 알아서 ~

for value in values {  // for ~ in ~  문법 사용 가능. 

      print(value)

}

 

 

딕셔너리

let airports: [String : String] = [ //key, value

      "SFO": "San Francisco", //콤마로 각 쌍을 구분

      "BOS": "Boston"

]

for (code, name) in airports { //code=key, name=value

       print("\(code): \(name)") //문자열 보간*

}

*문자열 보간

- String interpolation

-문자열 내부에 변수 var를 배치하여 더 유용하게 만드는 기능

-문자열 안에 모든 유형의 변수를 넣을 수 있음. 

- 백슬래쉬 를 쓰고 괄호 () 안에 변수 이름을 입력 => \()

-문자열 보간 내부에 모든 종류의 데이터 배치 가능 (위에 나온 데이터 종류들 다 가능)

 

 

함수

func sayHello(name: String) -> String { //return값 String
	let message = "Hello, \(name)"
    print(message)
    return message
}
sayHello(name: "Tommy") //매개변수 여러개면 쉼표로 구분, 호출 시엔 매개변수 이름: 전달값

 

 

 

구조체

- 데이터를 담은 컨테이너

-다양한 형태의 field 데이터를 담아서 하나의 구조체로 표현 가능

-구조체 안의 함수=메소드/ 변수=속성

-초기화를 자동으로 해줌. class와 달리 초기화 작업 불필요

struct Course {
	let name: String
    let instructor: String
}

* 상속 불가능

* var도 가능

* apple프레임워크에서 프로그래밍을 할 땐 주로 class를 많이 사용함

*구조체는 보통 '복사'의 개념이므로 안전함을 추구할 때 많이 사용함

*구조체 안에 함수를 넣어서 잘 사용하진 않음

 

 

클래스

-초기화 함수 존재 => init

-클래스 안 함수 = 메소드(method)

class Person {
	var name: String //한 개의 field 존재. 
    init(name: String) { //method 존재. 초기화 메소드
    	self.name = name //받은 name을 클래스의 name에 할당함
        }
}
let person = Person(name: "Tommy")

-> person.name => Tommy 

 

 

메소드

class Person {
	...
    func sayHello() {
    	print("I'm \(name)")
    }
}
let person = Person(name: "Tommy")
person.sayHello() //이미 person 선언 시 name 변수의 값으로 Tommy를 넘겨줌

 

 

 

상속

class Vehicle { //2개의 요소를 갖는 클래스 , super class or parent class
	func wheels() -> Int { //return을 int형으로
    	 return 4
    }
    func go() {
   		print("Zoom!")
    }
}
//위 클래스의 subclass를 만들어볼거양. override 함수가 있을거양
class Motorcycle : Vehicle { //vehicle class를 ingeritance
	override func wheels() -> Int { //wheels함수를 새롭게 다시 작성(재정의)=> override
    	return 2
       } //motorcycle은 subclass로 vehicle의 함수를 사용가능
}

motorcycle.wheels() -> 2

 

 

프로토콜

-규약

-예를 들어 각 학교마다 학생회를 만들거임. 근데 그 학생회에는 기획부, 홍보부, 재정부가 있어야해. 

-> 따라서 위의 프로토콜을 따르는 학생회는 모두 내가 정의한대로 부서를 만들어야함

=> 내가 정의한 것 == 프로토콜

-프로토콜을 채택해서 각 구조체와 클래스는 해당 프로토콜을 상속 받는 것처럼 사용함

~애플 공식 프로토콜의 정의~

프로토콜이란, 어떤 기능에 적합한
특정 메서드, 프로퍼티 및 기타 요구 사항의 청사진(Bluprint)을 의미합니다
프로토콜은 클래스, 구조체, 열거형에 의해 채택되며,
프로토콜에 정의된 요구사항의 실제 구현을 제공합니다
프로토콜의 요구 사항을 모두 충족하는 모든 유형(클래스/구조체/열거형)은
해당 프로토콜에 부합하다고 합니다

protocol Teacher {
	func teach(); //teacher프로토콜을 사용하는 것들은 모두 teach라는 함수를 정의해야함
}
class CS50Teacher : Teacher {
	func teach() {
    	...
    }
}

위와 같이 사용할 프로토콜을 :(콜론) 프로토콜명 으로 채택하고 해당 프로토콜에 따라서 정의해야할 것들을 정의함

(class의 상속과 비슷)

 

 

 

Optinal

-swift의 안전성에 해당

-swift의 꽃.. 🌷

-하나의  data type

-"값이 없음"을 뜻함. -> 너 지금 오류났는데 이걸로 앱을 중단시키는 건 너무하니까 프로그램의 안전성을 위해서 오류는 안 낼게 ㅇㅇ..

근데 'nil'을 돌려줄테니 오류인 건 알고 있으렴

-> 0이나 공백을 리턴하지 않고 nil을 리턴하는 이유? : 그것들도 쨋든 다 값이니

-아주아주 특수한 자료형 따라서 nil을 저장할 수 있는 건 only Optonal로 선언된 자료형만 가능

- Non-Optional Type: 그냥 보통 내가 정의하는 상수나 변수 ex. var name: String (타입 어노테이션)

  -> 무조건 값을 가져야하는 자료형. 값이 없으면 에러남(선언만 하고 대입 안 하면? error, nil을 대입해도 에러 왜냐면 nil을 저장할 수 있는 건 오직 Optional로 선언된 자료형만 가능

- Optional Type

1) type annotation use

   -자료형 뒤에 '?' 붙여주기 => ex. var name: String?

2) type inference use

   -타입 추론 이용. 선언과 동시에 값을 초기화 해주는데 이때 초기화되는 값을 nil로 (타입 추론은 초기값을 보고 자료형의 타입을 지정함)

     => ex. var a: Int? = nil

                 var b = a    //옵셔널 타입의 값인 a를 b에다가 선언과 동시에 초기화 해주면 됨

* var age = nil -> error: nil은 없는 값이니까 컴파일러가 값을 보고 자료형을 유추할 수 없음

* var a: String

   var b: String?

   => 다름. 위의 타입은 just String

                 아래의 타입은 Optional<String> (옵셔널 스트링) -> String을 Optional로 한 번 감싼 상태

var name: String? //Optional String Type
if let n = name { //name is 'nil'
	print(n) //if u assign a value to name == name has a value, just print it
}
else { //actually run this sentence. B.O u never assigned a value to name
	print("No Name")
}
guard let n = name else { //nil값을 처리해주는 guard class. if name != nil assign name to n
	print("No Name") // else, print this
    return
}
print(n)

nil을 처리하는 class (like 예외처리문)

*보통 작성하는 것을 권고함

* ? : 일반 옵셔널로 일반 타입과는 다른 타입으로 취급됨. 옵셔널 타입-일반타입 간의 연산이나 값의 교환 불가능

* ! : 암시적 추출 옵셔널로 기존 변수처럼 사용이 가능하나 nil 할당이 가능함. 

 

 

 

 

lesson1의 실습 코드

import Foundation

class Track {
    let name: String
    let instructor: String
    
    init(name: String, instructor: String) { //must
        self.name = name
        self.instructor = instructor
    }
}

let tracks = [ //let tracks: [Track] =[..]
    Track(name: "Mobile", instructor: "Tommy"),
    Track(name: "Web", instructor: "Brian"),
    Track(name: "Games", instructor: "Colton")
]

let students = ["Harry", "Ron", "Hermione"]

var assignments: [String : Track] = [:] //empty dictionary
for student in students { //굳이 말 안 해도 str임을 알아. 왜냐면 들어있는 값들이 다 str이니깐~
    let track = Int.random(in: 0 ..< tracks.count) //0~track의 원소 개수개까지 random으로.. = 0~3까지
    assignments[student] = tracks[track]
}

for (student, track) in assignments {
    print("\(student) got \(track.name) with \(track.instructor)")
}

'Ios' 카테고리의 다른 글

#3: CS50 track - lesson2  (1) 2024.01.13
#1. ios개발을 해보자  (0) 2024.01.13