블로그

솔 (Sol)

개발 기술 스택 심볼 & 마스코트 톺아보기

‘노트북 꾸미기’ 좋아하세요? 많은 개발자들이 노트북에 자기가 쓰고 있거나 좋아하는 기술 스택 로고 스티커를 붙이며 나만의 개성을 표현하곤 하는데요. 혹시 여러분의 노트북엔 어떤 스티커가 붙어 있나요?귀엽고 멋진 건 놓칠 수 없는 개발자라면 주목! 수많은 개발자들의 마음을 사로잡은 기술 스택에 숨은 아기자기한 심볼과 마스코트 몇 가지를 가볍게 소개할게요.썸네일 속 노트북은 인프런 백엔드 개발자 제이의 노트북!지금 쓰고 있는 스택(GraphQL 등...)이나 앞으로 배우고 싶은 스택(Go 등...), “Think Twice Code Once” 같은 개발자 밈 스티커까지 컨퍼런스나 주변 개발자 분들께 받은 스티커가 붙어 있어요. 🥰프로그래밍 언어 로고/심볼자바 (Java) 모락모락 김이 나는 귀여운 커피 컵! 자바 개발자들은 인도네시아 자바 섬에서 난 원두로 만든 커피를 마시곤 했대요. 몇 시간 동안 머리를 맞대고 토의한 끝에 정한 이름이라고 합니다.파이썬 (Python)‘비단뱀’이라는 뜻의 파이썬. 심볼 속 뱀 두 마리를 찾으셨나요? 파이썬을 만든 귀도 반 로섬(Guido van Rossum)이 영국 코미디 그룹 몬티 파이튼(Monty Python)에서 이름을 따왔다고 해요.스위프트 (Swift) iOS, macOS 개발에 쓰이는 스위프트는 ‘칼새’ 혹은 ‘신속한, 재빠른’이라는 뜻의 영단어 Swift에서 따온 이름이에요. 로고 모양도 날쌘 칼새를 닮았죠? 신속함을 강조하는 스위프트의 정체성을 잘 보여주네요.코틀린 (Kotlin) 자바와 비슷하면서도 간결한 문법으로 이목을 끄는 코틀린! 코틀린을 개발한 젯브레인(JetBrains) 사의 R&D 센터가 있는 러시아 코틀린(Ко́тлин) 섬에서 이름을 따왔는데요. 자바 역시 섬 이름인 걸 보면 두 언어의 관계가 재미있죠. 심볼 역시 머리글자 K를 간결하게 변형한 모양이에요.•••다양한 기술 스택 속 귀여운 마스코트깃허브 (Github) - 옥토캣 (Octocat) 복잡한 코드를 결합하고 관리하는 깃허브의 문어 다리 달린 고양이 마스코트 ‘옥토캣’. 3개 이상의 브랜치를 결합하는 작업을 가리키는 Octopus Merge에서 영감을 얻었다고 해요.리눅스 (Linux) - 턱스 (Tux) 믿거나 말거나! 리눅스를 만든 리누스 토르발스(Linus Torvalds)는 호주 캔버라 동물원에서 펭귄에게 물어뜯겨 펭귄염(?)에 걸린 적이 있다고 해요. 리눅스 마스코트로 삼을 정도면 그만큼 강렬한 경험이었던 모양이죠? 😅PHP (PHP: Hypertext Preprocessor) - 코끼리 (ElePHPant) 대문자로 쓴 PHP라는 글자를 옆에서 비스듬히 보면 코끼리처럼 보인다는 이유로 코끼리 마스코트를 갖게 된 PHP. elePHPant라는 말장난도 왠지 귀엽지 않나요?러스트 (Rust) - 페리스 (Ferris) 최근 개발자들 사이에 코어한 인기를 끄는 언어, 러스트의 비공식 마스코트는 주황색 게 모양이죠. 갑각류(Crustacean)에서 따온 듯한 요 마스코트 덕에 러스트 개발자들은 스스로를 Rustacean이라고 부른다고 하네요.고 (Golang) - 고 고퍼 (Go Gopher) 일러스트레이터 르네 프렌치(Renee French)가 그린 고퍼는 프로그래밍 언어 Go를 상징하는 주머니고퍼(흙파는쥐) 모양의 마스코트예요. 원래는 특별히 정해진 색이 없었다가 Google I/O 2011에서 Go App Engine 런타임을 출시하면서 파란색이 되었다고 해요.안드로이드 (Android) - 안드로보이 (Androboi) 단순한 듯 귀여운 녹색 로봇 마스코트 안드로보이! 안드로이드는 버전 1.1부터 OS 버전에 따라 디저트 이름을 붙이기로 유명한데 (컵케이크, 도넛, 오레오, 롤리팝…) 디저트 모양에 따라 달라지는 안드로보이의 모습을 보는 소소한 재미도 있죠.셀 수 없이 많은 기술 스택만큼, 매력적인 심볼과 마스코트도 무궁무진한데요. 여러분이 좋아하는 기술 심볼/마스코트는 어떻게 생겼나요? 댓글로 여러분의 최애 스킬(!)의 모습을 소개해주세요. 🥰

개발 · 프로그래밍 기타javapythonswiftkotlingithublinuxphpgoandroidrust

22.12.31 학습일기

4. Numeric_1var myScore: UInt = 50myScore = 50var myScore1: UInt8 = 200200이라는 값의 2진수 값을 알고 싶을 경우!!String(myScore1, radix: 2(2진수여서), uppercase: false(true/ false 아무거나 ok))String(myScore1, radix: 2, uppercase: false) uppercase : true // 16진수 표현하고자 할 때 대문자로 표현uppercase : false // 16진수 표현하고자 할 때 소문자로 표현 Int8.max // 127Int8.min // -128UInt8.max // 255UInt8.min // 0// bit (binary, 2진수) 0 -> 1 -> 10// 3bit 000 -> 111// 4bit 0000 -> 1100// 8bit 00000000 -> 111111115. Numeric_2var myScore = 1_000_000 // 숫자 중간에 언더바 사용 가능, 시각적으로 보기 편함var myBit = 00010001 // 이대로 쓰면 10001만 인식 00010001라는 2진수로 인식하게 하려면?var myBit = 0b00010001 // 앞에 0b를 쓴다! 17이 저장됨var myBit = 0b0001_0001_1111 // 이때도 사용 가능 그럼 8진수는? -> 0o (0-7까지의 숫자만 사용 가능)var myBit = 0o10 // 8그럼 16진수는? -> 0xvar myBit = 0xf // 15var myBit = 0x10 // 16// reminder %var anyNumber = 9if (anyNumber % 2 == 0) {// 짝수} else {// 홀수}var number1 = 0.7var number2 = 0.2var sum = number1 + number2 // 0.89999999가 나옴, 0.9X WHY?0.7, 0.2도 2진수로 바뀌어서 계산되기 때문에 0.1101001010 + 0.110100010012진수 소수 계산 검색하여 알아보기0.9가 나오려면 어떻게 계산해?--> Decimal // 일반적으로 우리가 사용하는 0부터 9까지의 숫자 체계대로 계산하여 나타나게 해줌따라서 Decimal(sum)을 하면 0.9가 나옴6. Array_1Swift는 Array, Set, Dictionary 세 가지 Collection Type이 있음Collection Type이란, 데이터의 묶음, 데이터의 집합 느낌// Int Arrayvar numbers1 = [4, 5, 10, 23, 0, 4, 3, 2, 1]var numbers2: [Int] = [4, 5, 10, 23, 0, 4, 3, 2, 1]var numbers3: Array<Int> = [4, 5, 10, 23, 0, 4, 3, 2, 1]// 1 ~ 5var numbers4 = Array<Int>(1...5)var numbers5 = [Int](1..5)// 1, 1, 1, 1, 1var numbers6 = Array(repeating: 1, count: 5)// String Arrayvar strings = ["lee", "kim"]// Any Arrayvar anyArray: [Any] = [0, "lee"] // 타입이 여러 개 있을 때 Any타입 사용. but, swift 성격과 맞지는 않음, 안 쓸 수 있으면 안 쓰는 게 좋음// empty Array - 타입을 꼭 명시해야 함. 네 가지 모두 같은 의미var emptyArray1: [String] = [] // String 타입의 빈 배열 만들어짐var emptyArray2: [String] = Array() // 인스턴스화 한 것 -> 그래야 메모리에 올라가 사용 가능var emptyArray3 = Array<String>()var empryArray4 = [String]()7. Array_2// addvar numbers10 = [4, 5, 10, 23, 0, 4, 3, 2, 1]var numbers11 = [100, 200, 300]numbers10.insert(contentsOf: numbers11, at: 1) // 중간에 삽입, [4, 100, 200, 300, 5, 10, 23, 0, 4, 3, 2, 1]numbers10.append(contentsOf: numbers11) // 끝에 삽입, [4, 100, 200, 300, 5, 10, 23, 0, 4, 3, 2, 1, 100, 200, 300]numbers10.append(100) // [4, 100, 200, 300, 5, 10, 23, 0, 4, 3, 2, 1, 100, 200, 300, 100]numbers10.insert(500, at: 0) // [500, 4, 100, 200, 300, 5, 10, 23, 0, 4, 3, 2, 1, 100, 200, 300, 100]numbers10.insert(1000, at: 5) // [500, 4, 100, 200, 300, 1000, 5, 10, 23, 0, 4, 3, 2, 1, 100, 200, 300, 100]// removevar numbers20 = [4, 5, 10, 23, 0, 4, 3, 2, 1]let removeNumber = numbers20.remove(at: 4) // 삭제 된 값이 리턴되어 removeNumber에 저장numbers20.removeFirst()numbers20.removeLast()numbers20.removeFirst(2) // 앞에 두 개 삭제numbers20.removeLast(2) // 뒤에 두 개 삭제// replacevar numbers30 = [4, 5, 10, 23, 0, 4, 3, 2, 1] // readnumbers30.last // 마지막 인덱스의 값 읽어옴let lastIndex = numbers30.count - 1numbers30[lastIndex]8. Set_1Set은 순서도 없고, 인덱스도 없음, 중복 허용 안됨Array는 순서대로 접근 할 때 사용 // Set typevar number1: Set = [1,2,3,4,5] // {4, 3, 1, 5, 2}var number2: Set<Int> = [1,2,3,4,5] // {2, 5, 4, 3, 1}var number3 = Set([1,2,3,4,5]) // {1, 4, 2, 3, 5} // empty Setvar numbers4 = Set<Int>()var numbers5 : Set<Int> = [] // addnumbers1.insert(100) // (inserted true, memberAfterInsert 100)numbers1.insert(100) // (inserted false, memberAfterInsert 100) true와 false 값만 얻고 싶다면?numbers1.insert(100).inserted // truenumbers1.insert(100).inserted // false, 중복 허용되지 않기 때문에 // 덮어쓰기, update는 무조건 넣는 것,numbers1.update(with: 100) // 기존에 그 값이 있는지 없는지 값으로 알려줌, 100을 넣으려고 했는데 기존에 100이 있었다는 것을 보여줌numbers1.update(with: 1000) // 기존 값은 없다라는 것이 nil로 표시됨, nil은 아무것도 없다는 의미, 이 값은 numbers1에 들어감 // removenumbers1.remove(50) // 50이란 값이 numbers1에 없으므로 nil로 표시numbers1.remove(100) // 100numbers1 // {3, 1000, 1, 2, 5, 4} 내부적으로는 Set도 순서를 가지고 있다!!numbers1.firstIndex(of: 1000) // 1000의 인덱스 값 가져오기let setIndex = numbers1.firstIndex(of: 1000) // Set<Int>.index // numbers에 1000이 있으므로 1000의 index값이 setIndex에 저장numbers1.remove(at: setIndex!) // !(느낌표) 꼭 써야함, 이유는 나중에 설명9. Set_2let numbers1: Set = [1,2,3,4,5]let numbers2: Set = [4,5,6,7,8]// 합집합numbers1.union(numbers2) // {4,1,3,5,7,8,2}// 교집합numbers.intersection(numbers2) // {4,5}// 대칭차집합 (합집합-교집합)numbers1.symmetricDifference(numbers2) // {1,3,2,7,8,6}// 여집합numbers1.subtracting(numbers2) // {1,3,2} // numbers1에서 numbers2와 겹치는 원소 제외하고 나열numbers2.subtracting(numbers1) // {7,9,8} // numbers2에서 numbers1과 겹치는 원소 제외하고 나열// 한 쪽에 모두 포함 여부let numbers3: Set = [1,2,3,4,5]let numbers4: Set = [1,5]numbers3.isSubset(of: numbers4) // numbers3의 원소들이 numbers4에 포함되어 있는가? --> falsenumbers4.isSubset(of: numbers3) // numbers4의 원소들이 numbers3에 포함되어 있는가? --> truenumbers3.isSuperset(of: numbers4) // numbers4의 원소들이 numbers3에 포함되어 있는가? --> truenumbers4.isSuperset(of: numbers3) // numbers3의 원소들이 numbers4에 포함되어 있는가? --> false// 한 쪽에 모두 불포함 여부let numbers5: Set = [1,2,3,4,5]let numbers6: Set = [6,7]numbers5.isDisjoint(with: numbers6) // numbers5와 numbers6는 중복되어 있는 값이 하나도 없는가? --> truelet numbers5: Set = [1,2,3,4,5]let numbers6: Set = [6,7,5]numbers5.isDisjoint(with: numbers6) // numbers5와 numbers6는 중복되어 있는 값이 하나도 없는가? --> false10. Counted Set// NSCountedSet : 타입의 한 종류, 중복되서 누적되는 카운팅 개수를 셀 때 사용let colors: NSCountedSet = ["red", "orange", "blue"]colors.count(for: "red") // 1colors.add("red") // {"red", "orange", "blue"}colors.count(for: "red") // 2colors.add("red") // {"red", "orange", "blue"}colors.count(for: "red") // 311. Dictionarykey - valueSet과 같이 순서가 없음, key 중복 허락x, value는 중복 가능// 생성// emptylet names1 = Dictionary<String, String>() // [:]let names2 = [String : String]() // [:]let names3: [String : String] = [:] // [:]var names4 = ["cityA" : "Seoul" , "cityB" : "La"]names4.count // 2names1.isEmpty / true// 직접 입력 추가names4["cityC"] = "tokyo"names4["cityD"] = "baijing"names4.updateValue("Busan", forKey: "cityE")names3["cityE"] = "incheon"names3["cityF"] = "SF"// Dictionary + Dictionary, cityE가 중복되므로 return 값에 따라 한쪽 cityE는 지워짐let mergingDic = names3.merging(names4) { leftValue, rightValue in return letfValue}// leftValue, rightValue는 개발자가 임의로 지은 이름. 보통은 current, new으로 씀, leftValue는 names3를, rightValue는 names4를 의미// return letfValue하면 names3에 있는 cityE : incheon이 남음// return rightValue하면 names4에 있는 cityE : Busan이 남음// 삭제names3 // ["cityE" = "incheon"], ["cityF" = "SF"]names3["cityF"] = nillnames3.removeValue(forKey: "cityF")// 두 개 같은 의미names3 // ["cityE" = "incheon"]// 업데이트names3["cityE"] = "hawaii"12. TupleTuple은 ()안에 들어 있음, 삭제, 추가할 수 없음var someTuple1 = (100, "kim", false)someTuple을 타입 추론하면 someTuple: (Int, String, Bool)==> 첫 번째 값은 Int, 두 번째 값은 String, 세 번째 값은 Bool 타입의 값이 들어가야 함// 생성var someTuple2 = (score : 100, userName : "kim", isShowName : false)var someTuple3: (String, Int) = ("lee", 50)// 조회someTuple.0 // 100someTuple2.score // 100let (score, name, isShowName) = someTuple1 // let 대신 var도 사용 가능score // 100name // "kim"isShowName // false// 업데이트someTuple2.score = 50 // 50someTuple2 // (score : 50, userName : "kim", isShowName : false) 

모바일 앱 개발학습일기swiftiOS

Part1. 변수와 상수 / 데이터 타입(DataType)

Swift 프로그래밍의 기본 원리와 데이터 타입1. 변수와 데이터 타입1) 변수변수는 데이터를 담을 수 있는 공간으로, 프로그램 동작의 핵심입니다. 값을 저장하고 계산하는 데 사용됩니다.var a = 3 var b = 7 var c = a + b print(c) // 출력 결과: 10 2) 변수의 이름 규칙변수의 이름은 소문자로 시작하며, 중간에 숫자를 사용할 수 있습니다. 특수문자나 한자, 한글도 사용 가능하지만 관습적으로 잘 사용하지 않습니다.3) 변수 사용 예시변수는 다양한 정보를 담을 수 있습니다. 값을 변경하거나 출력할 수도 있습니다.var name = "홍길동" var age = 20 var address = "서울 강남구" print(name, age, address) // 출력 결과: 홍길동 20 서울 강남구 name = "전지현" print("저의 이름은 \(name)입니다. 나이는 \(age)살이고, \(address)에서 살고 있습니다.") 4) String Interpolation(스트링 인터폴레이션)스트링 인터폴레이션은 문자열 중간에 변수나 상수를 삽입하는 기법입니다. (변수) 형식으로 사용하며, 문자열에 동적인 데이터를 쉽게 포함시킬 수 있습니다.var name = "임꺽정" age = 30 print("저의 이름은 \(name)입니다. 나이는 \(age)살이고, \(address)에서 살고 있습니다.") 2. 상수상수는 변하지 않는 데이터를 담을 수 있는 공간으로, 한 번 할당되면 변경할 수 없습니다.let name2 = "김철수" // name2 = "이나영" // 오류! 상수는 변경할 수 없음 3. 데이터 타입1) 데이터 타입의 이해Swift에서 사용하는 데이터 타입은 다양한 형태의 정보를 다루는 데 사용됩니다.Int: 정수Float: 6자리 소수점 실수Double: 15자리 소수점 실수Character: 문자String: 문자열Bool: 참과 거짓2) 데이터 타입 지정데이터 타입을 지정하는 방법은 두 가지가 있습니다.타입 주석(Type Annotation): 변수를 선언할 때 타입을 명시적으로 지정합니다.타입 추론(Type Inference): 컴파일러가 변수의 초기값을 보고 타입을 유추합니다.var i: Int = 4 var j: Int = 3 3) 타입 안정성과 변환Swift는 데이터 타입을 엄격하게 다루며, 다른 타입끼리의 계산이 불가능합니다. 필요한 경우 타입을 변환하여 사용해야 합니다.타입 변환은 Swift에서 서로 다른 데이터 타입 간의 값 변환을 의미합니다. 다른 데이터 타입으로 값을 변환하는 것은 코드 작성 및 데이터 처리에 유용합니다.타입 변환의 종류Swift에서는 크게 두 가지 타입 변환 방법을 지원합니다:명시적 타입 변환 (Explicit Type Conversion): 개발자가 명시적으로 타입 변환을 지정하는 방법입니다. 이 방법은 자료의 손실이 발생할 수 있으므로 주의해야 합니다.암시적 타입 변환 (Implicit Type Conversion): Swift는 타입 추론을 통해 컴파일러가 자동으로 타입을 추정하여 변환하는 방법입니다. 자료의 손실이 없는 범위 내에서 수행됩니다.타입 변환의 예제명시적 타입 변환 (Explicit Type Conversion)swiftCopy codelet intValue = 42 let doubleValue = Double(intValue) // Int를 Double로 명시적으로 변환 let stringValue = "123" let intFromString = Int(stringValue)! // String을 Int로 변환 (nil 값 처리에 주의) 암시적 타입 변환 (Implicit Type Conversion)swiftCopy codelet intValue = 42 let doubleValue = Double(intValue) // 암시적 타입 변환 (자료 손실 없음) let intResult = intValue + Int(doubleValue) // Double을 Int로 암시적 타입 변환 타입 확인 및 타입 캐스팅Swift에서는 런타임 중에 객체의 타입을 확인하고, 필요한 경우 해당 타입으로 캐스팅할 수도 있습니다.swiftCopy codelet someValue: Any = 42 if let intValue = someValue as? Int { print("intValue is \(intValue)") } else if let doubleValue = someValue as? Double { print("doubleValue is \(doubleValue)") } else { print("Unknown type") } 위 예제에서 as? 키워드를 사용하여 타입을 확인하고 캐스팅합니다.타입 변환 예제: 숫자와 문자열 간의 변환swiftCopy codelet intValue = 42 let doubleValue = 3.14159 let stringValue = "123" let intFromDouble = Int(doubleValue) // Double을 Int로 변환 let doubleFromInt = Double(intValue) // Int를 Double로 변환 let intFromString = Int(stringValue)! // String을 Int로 변환 (nil 값 처리에 주의) let stringFromInt = String(intValue) // Int를 String으로 변환 print(intFromDouble) // 출력: 3 (정수부분만 취함) print(doubleFromInt) // 출력: 42.0 print(intFromString) // 출력: 123 print(stringFromInt) // 출력: "42" 다양한 타입 변환Swift에서는 다양한 데이터 타입 간의 변환을 지원하며, 간편하게 값을 변환하여 활용할 수 있습니다.4. 결론변수와 상수, 그리고 데이터 타입은 Swift 프로그래밍의 핵심 개념 중 하나입니다. 올바른 변수와 데이터 타입의 활용은 프로그램의 효율성과 가독성을 높일 수 있습니다. 기본 원리와 데이터 타입을 이해하고 적절히 활용해보세요.

모바일 앱 개발swift

23.01.08 학습일기

19. ControlFlow - for inlet names = ["kim", "lee", "min"]let numbers = [1,5,3,35,3,65]for name in names { // in names => 3번 반복print(name) // "kim", "lee", "min"가 출력}for number in numbers { // in numbers => 6번 반복print(number) // 1,5,3,35,3,65가 출력} let myRange1 = (0...5)let myRande2 = (0..<6)for number in myRange1 {print(number) // 0부터 5까지 출력}인덱스 값까지 가져오고 싶다!=> for (index, name) in names.enumerated(){print(name, index)} // index도 같이 출력됨하나 씩 늘어나는 값 말고 5분 간격으로 뛰어 넘고 싶다!=> let minute = 60for minute in 0..<minutes {if minute % 5 == 0 {print(minute)}} // 60번 반복, 0부터 59까지 5분 간격으로 출력됨위의 방식과 같은 방식// 0..<minutesfor minute in stride(from: 0, to: minute, by: 5) { // from: 시작, to: 끝(포함x), by: 간격print(minute)} // 12번 반복, 이게 더 효율적. 0부터 59까지 5분 간격으로 출력// 0...minutesfor minute in stride(from: 0, through: minute, by: 5) { // from: 시작, to: 끝(포함o), by: 간격print(minute)}20. ControlFlow - while// while은 반복 끝이 정해지지 않을 때 사용// 주사위 (1~6)// 주사위 홀수 -1// 주사위 짝수 +2// 목표 10까지 도달var dice = 0 // 랜덤하게 나오는 주사위 번호var myPosition = 0while myPosition < 10 {dice = Int.random(in 1...6) if dice % 2 ==0 {myPosition += 2}else if myPosition > 0 {myPosition -= 1}print("dice", dice, " position", myPosition)}print("end")21. ControlFlow - switchvar number = 14switch number {case 3:print("삼")case 10...100:print("십~백")case 5, 7:print("오, 칠")default:print("기타 숫자")} var someString = "e"switch someString {case "a":print("삼")case "c"..."f":print("씨~에프")case "g", "z":print("쥐, 지")default:break // 빠져 나감//print("기타 문자")}  // switch case let : 이름을 지정하여 해당되는 값을 받아와 그 값으로 무언가를 하고 싶을 때 사용let media = ("abc음악", 180)switch media {case let (title, length):print("제목", title)print("길이", length)} // 제목 abc음악길이 180으로 출력 ==> 만일 하나의 값만 쓰고 싶다면? let media = ("abc음악", 180)switch media {case let (title, _):print("제목", title)} // 제목 abc음악만 출력22. Function_1// 파라미터에 하나의 값func presentMyScore(score: Int) {print(score.description + "점") // String 형으로 변환. 변환을 해야 숫자가 화면에 찍힘}presentMyScore(score: 50)-----------------------------------------------// 파라미터에 두 개의 값func presentScore(myScore: Int, yourScore: Int) {print(myScore.description + " vs " + yourScore.description)}func presentScore(myScore: 80, yourScore: 100)-----------------------------------------------// function returnfunc plus(numver1: Int, number2: Int) -> Int {return number1 + number2}let sumResult = plus(numver1: 50, number2: 30)print(sumResult)-----------------------------------------------// 파라미터가 없는 경우func printHello() {print("Hello")}printHello() + "안녕"-----------------------------------------------// multiple return valuesfunc scoreList() -> [Int] {return [50, 30, 60]}scoreList()func scoreList2() -> (eng: Int, music: Int) {return (50, 80)}scoreList2().engscoreList2().music-----------------------------------------------// argument lables, parameter name - 다른 이름을 사용하고 싶을 때func sumNumber1(num number1: Int, num number2: Int) {number1 + number2 // 이 때는 뒤에 이름 씀}sumNumber1(num: 80, num: 80) // 이 때는 앞에 이름 씀// 딱히 이름을 쓰지 않아도 될 때func sumNumber1(_ number1: Int, _ number2: Int) {number1 + number2 // 이 때는 뒤에 이름 씀}sumNumber1(50, 100)-----------------------------------------------// In-Out parameters// Inputvar myScore = 60func plusFive() {myScore += 5}myScore // 60plusFive() // 이것만 봐서는 무엇을 +5 한다는 것인지 모름myScore // 65 ==> 함수의 용도를 직관적으로 파악하고 싶을 때!// In-Out parameters// inout func plusNewFive(score: inout Int) {score += 5} plusNewFive(score: &myScore) // 70myScore // 70----------------------------------------------------------------------------------22. Function_2// Function Typesvar someString: String = ""func sayHello() {print("hello")}sayHello // () -> ()// () -> void와 같음func plus(a: Int, b: Int -> Int) {return a+b}func minus(a: Int, b: Int -> Int) {return a-b}let inputValue1 = 4let inputValue2 = 5func selectSymbolButton(buttonStyle: String) { // 함수가 무슨 기능 하는지 이름 정확하게 설정하기!!!if buttonStyle == "+" {plus(a: inputValue1, b: inputValue2)} else if buttonStyle == "-" {minus(a: inputValue1, b: inputValue2)}}// 위의 경우는 실행까지 완료하는 경우. 실행하지 않고 기능을 담기만 하는 방법은?// Optional 사용!var calc : ((Int, Int) -> Int)?func selectSymbolButton2(buttonStyle: String) {if buttonStyle == "+" {calc = plus // calc에 plus기능을 담기만 함. 실행x} else if buttonStyle == "-" {calc = minus // calc에 minus기능을 담기만 함. 실행x}}func showResult() {calc?(inputValue1, inputValue2) // ? 꼭 붙여야 함!!} // "="를 눌렀을 경우와 같이 미리 담아둔 함수 기능을 여기서 실행!!!

모바일 앱 개발학습일기swiftiOS

23.01.03 학습일기

15. Optional_3// if let(var)// guard let(var)var myAge1: Int? = 20var myAge2: Optional<Int> = 40myAge1이 nil이 아닐 경우, 그냥 Int 값으로 처리 가능따라서, myAge1은 unwrapping 가능var sum = 0if let age = myAge1 { sum+age+1 // 21} 그러나, myAge1이 nil일 경우, myAge1은 unwrapping 할 수 없기 때문에 연산 불가var sum = 0myAge1 = nil // nilif let age = myAge1 { sum+age+1 // 21} // 0if let(var)과 형식은 똑같은데 동작되는 방식이 다른 것 = guard let(var)guard let age = myAge1 else { // 값을 가져오지 못했을 때 // guard 문은 중단시키고자 할 때 사용 return // 해당되는 코드블럭 끝남을 의미 //fatalError("여기는 nil이 나오면 안 되는 부분입니다.") // 앱 자체를 종료시키면서 에러 표시를 나타내는 기능, 왜 에러 발생했는지 써주기}age // age 가져왔을 때 처리는 밑에 씀16. Operators_1var (age1, age2) = (10, 20)let newStr = str1 + " " + str2var arr1 = ["a", "b", "c"]var arr2 = ["d", "e", "f"]var newArr = arr1 + arr2 // 배열도 합치기 가능, ["a", "b", "c", "d", "e", "f"]// String이나 Array 같은 경우 타입 같으면 +연산 했을 때 이어붙여서 출력됨//Remainder Operator 나머지 값 알려주는 연산자 % -> Int 타입만 가능!!!var num1 = 8var num2 = 3num1 % num2 // 2// Double 타입var num3: Double = 8var num4: Double = 3num3.truncatingRemainder(dividingBy: num4) //2!! num3.remainder(dividingBy: num4) // -1이 나옴 => why?==> num3 / num4를 하면 2.66666이 나오는데, 몫은 가까운 정수로 표현되여 3이 된다.이 때, 3X3(num4)=9가 되어 8(num3)보다 1이 커지므로, -1이 출력된다.17. Operators_2var a = "a"var b = "b" // 문자 - 대소 비교 가능if a>b { print("true")}else { print}// Range Operator// 범위 0...5for index in 0..<5 { print(index)}let names = ['"kim", "lee", "min"]for index in 0..<names.count) { print(names[index]}for name in names { print(name) // 범위 지정 하지 않아도 처음부터 끝까지 도는 것}for name in names[1...] // 1부터 끝까지 쓴다는 의미for name in names[...3] // 처음부터 3까지 쓴다는 의미&& AND|| OR.toggle()은 해당 성질을 반대로 바꿔버림 - 원본 자체가 바뀜isGreen.toggle() - falseisGreen - false18. Unicode// 문자 -> 내부적으로 특정한 코드 값(16진수)\u안에 코드 값 넣으면 유니코드 나옴"a""\u{61}" // "a""가를" 유니코드로 변경하고 싶다면?UnicodeScalar("가") // 44032-But 이것은 10진수유니코드는 16진수이기 때문에, 44032를 16진수로 바꾸기 위해서는?String(44032, radix: 16) // AC00// 숫자만 입력let inputValue = "ㄱ"if inputValue >= "\u{30}" && inputValue <= "\u{39}" // 0 에서 9 { print("숫자")} else{ print("숫자 아님")}// 한글만 입력UnicodeScalar("가") // 44032String(44032, radix: 16) // ac00UnicodeScalar("힣") // 55203String(55203, radix: 16) // d7a3if inputValue >= "\u{ac00}" && inputValue <= "\u{d7a3}" // 0 에서 9 { print("한글")} else{ print("한글 아님")}

모바일 앱 개발학습일기iOSswift모바일앱개발

23.01.02 학습일기

13. Optional_1Optional type이란?값이 있을 수도, 없을 수도 있음. 타입에 ?를 붙임. 모든 타입은 Optional type 가능값이 없다라는 개념은 - nil로 표현 (null) - 어떤 상태인지 모른다는 뜻var age: Int? = 100 // 값을 넣어도 되지만var age1: Int? = nil // 값이 없다. nil을 쓰는 것이 더 맞는 표현. 메모리에 아직 올라가지 않은 상태를 말함var age2: Int = 0과 다른 의미임!!! 값이 있는 상태if age1 == nil {// print("나이가 0살이다") - 틀림print("나이 값을 확인할 수 없다.)}var str1: String = "" // 값이 있음var str2: String? = nil // 값이 없음if str2 == nil {//print("글자 개수가 0개이다") - 틀림print("글자를 쓰지 않았다. 스트립 값이 어떤 지 모른다)}var myfavorite: [String]? // String 타입의 Optional 배열, 초기 값 안 주면 nil로 처리됨if myfavorite == nil {// print("내 즐겨찾기 개수가 0개다") - xprint("내 즐겨찾기 개수를 받아오는데 실패했습니다.")}14. Optional_2// unwrapping// 옵셔널로 래핑(wrap) 되어 있다.var myAge1: Int = 20var myAge2: Optional<Int> = 40var sum = myAge2 + 1 // error. unwrapped 해야 함. 옵셔널이 되는 것이 있고 안 되는 것이 있는데, +는 Optinal로 사용할 수 없는 기능// force unwrapping (강제로 unwrapping 하는 것, ! 붙이기)var sum = myAge2! + 1// 주의 사항myAge = nilmyAge! // error. 앱이 죽은 상태. 절대 하면 안됨var sum2 = (myAge1 ?? 0) + 1 // myAge1이 nil일 경우 0으로 대체하여 사용하겠다는 뜻

모바일 앱 개발학습일기iOSswift모바일앱개발

채널톡 아이콘