블로그

woozoobro

앱스토어 출시 후 무료로 마케팅하기

출시한 앱을 마케팅하려면 어떻게 해야할까요?마케팅을 1도 모르는 상태로 단순히 홍보를 해야한다고 하니 당장 떠오르는 건 블로그 포스팅말고는 없더라구요. 그렇다고 다짜고짜 앱 좀 다운 받아주십쇼! 부탁하기는 또 거부감이 생기고… 저도 그런 홍보글들을 읽을 때 경험했던 것들이 있으니 무지성으로 글을 퍼나르고 싶진 않았습니다.어느 정도 콘텐츠로 느껴질 수 있으면서 은근히 만다린이라는 앱을 노출할 수 있게 만드는 글이 필요하겠다는 생각이 들었어요.먼저 앱을 개발하게 됐던 이유를 바탕으로 “지속 가능한 개발 스터디를 통해 성장하기”라는 미디엄 포스트를 발행했습니다. 이 포스팅을 첨부해서 링크드인, okky에 다시 한번 게시물을 작성했구요! 총 3일 동안 유의미한 통계를 볼 수 있게 되었는데요. 불특정 다수의 500명 중 10% 정도는 미디엄 글을 확인했고, 이 미디엄 글을 확인한 사람의 대부분이 앱스토어 페이지까지 랜딩, 이 중 실제 다운로드까지 이어진 경우는 4건이었어요.(28일에 3건이 더 추가되서 합계는 총 7건이 됐어요!)우선 미디엄 글 자체는 흥미로웠다는 걸 알 수 있었구요. 앱 스토어에서 앱을 다운받고 싶다는 마음이 들게 하려면 지금보다 더 많은 노력이 필요하겠다는 생각이 드네요. 어떻게 하면 다운로드를 늘릴 수 있을까?미디엄까지 확인한 분들이 앱 스토어 프리뷰에 도달을 했지만 다운로드 수가 생각보다 적게 나온 게 너무너무 아쉽더라구요. 지금보다는 조금 더 유저분들을 설득할만한 근거가 필요하다는 생각이 들었고 한달 전쯤 애플에서 진행한 전문가와의 만남 세션이 기억 났습니다. 앱을 마케팅하기 좋은 방법들을 여러가지 추천해주셨는데 세션의 내용 자체는 애플의 TechTalks 영상과 거의 유사해서 아래 영상을 참고해보셔도 좋을 것 같아요.(한국어 자막 지원 됩니다!!)애플 Tech Talks 영상이 영상에서 추천해준 여러가지 방법 중 제가 시도해 본건 총 3가지입니다. 1. Product Page 최적화급하게 출시를 서두르다 보니 제일 신경을 많이 쓰지 못했던 부분이었어요. 기존의 프리뷰 페이지는 아래처럼 되어 있었습니다.아쉽지만 리소스를 많이 투자할 시간이 없어서 우선은 아래처럼 변경을 해줬구요. 그 결과는~!~!프로덕트 페이지 View 수가 늘어났고, 다운로드 수도 증가했습니다! 2. 그리고 키워드 최적화앱 스토어에서 마케팅을 성공적으로 이끌어가려면 제일 중요한 건 Organic 트래픽의 증가, 유저가 검색엔진을 통해 직접 검색하여 자연스럽게 유입된 트래픽을 늘려야 합니다! 이걸 위해선 앱스토어에서 앱을 검색할 때 서치 키워드에 대한 최적화가 필요하겠네요.기존엔 Mandarin이라는 영어 타이틀이었는데-> 만다린 — 개발 스터디 모집 이라는 타이틀로 변경해줬구요개발 스터디와 관련된 서치 키워드 위주의 단어들에서-> 조금 더 확장된 코딩 공부, 커뮤니티 등의 키워드들을 추가해줬습니다.키워드를 추가할 때 구글 트렌드와 같은 키워드 리서치를 위한 도구들을 사용하는 것도 하나의 방법이 될 것 같네요. 3. 앱스토어 커넥트 마케팅 리소스마지막으로 마케팅 리소스를 자동으로 만들어주는 페이지가 있습니다.앱 스토어 Promote Tool 고정된 키워드이긴 하지만 앱을 홍보할 때 애플이 추천해주는 방향으로 이미지 배너들 생성을 해주더라구요.이외에도 짧은 링크 생성도 가능하고 https://apple.co/3RlbVcNQR코드 제작도 가능했습니다.이렇게 총 3가지의 방법들을 현재 시도해보고 있어요. 다음주의 지표는 또 어떻게 될지 궁금하네요:) 어제 잠깐 외국 개발자님이랑 대화를 나누게 됐는데 Quora나 Reddit 같은 게시판들에 올라오는 질문들에 답변을 하면서 은근슬쩍 홍보하는 방법도 종종 활용한다고 알려주셨어요. 글로벌로 배포를 고려해볼 땐 저렇게 시작해보는 것도 좋을 것 같습니다.개발이 사실 제일 쉬운 거였구, 이제 제일 어려운 부분만 남은 것 같네요🥹무료로 앱 마케팅을 할 수 있는 방법들은 이 정도가 되지 않을까... 또 좋은 방법이 있다면 언제든 알려주세요!읽으신 내용이 도움이 되셨다면~아 만다린 다운 좀 한번 해주십쇼!만다린 앱 스토어

모바일 앱 개발마케팅ios앱스토어앱개발

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

softeer

[현대자동차그룹] 2023 제2회 Softeer Tech Meet-up App 개발자 행사

  “두 번째로 열린 현대자동차그룹 2nd SOFTEER TECH MEET-UP에서 App 개발자를 초대합니다.이번 MEET-UP에서는 소프트웨어 중심의 자동차 구현을 위해 고민하는 개발자의 이야기를 공유합니다.관심있는 App 개발자라면 누구든 참가 신청 가능하니 많은 참여 바랍니다.서로의 고민과 경험을 공유하며 함께 성장할 수 있는 좋은 기회가 될 거에요!푸짐한 선물과 맛있는 피맥도 제공될 예정이니 참가 신청은 필수! 많은 참여 부탁 드립니다!"• 일시 : 9월 14일 (목) 18:30• 장소 : 판교 테크원 8층 현대자동차그룹 사옥 (경기도 성남시 분당구 분당내곡로 / https://naver.me/x35faBDZ)• 대상 : App 개발 분야 관련 현직자 및 대학(원)생• 구성 : 세션 / 채용 및 직무 상담 / 네트워킹 파티• 신청 기간 : 8/16 (수) 09:00 – 8/29(화) 24:00• 신청 방법 : 행사 공식 웹페이지 접속 후 신청• 웹페이지 : https://meetup.softeer.ai/• 참가자 선정 : 9월 초 사전 설문 초대장 이메일 발송• 참가비 : 무료·문의처 (소프티어 테크 밋업 운영 사무국)·이메일 : manager@meetup.softeer.ai※참여 신청이 많을 경우, 선정(추첨)을 통해 참가자분들을 모실 예정이오니 양해 부탁드립니다.※주차 지원은 불가하오니, 가급적 대중 교통을 이용해주시기 바랍니다.

모바일 앱 개발현대자동차그룹현대자동차소프티어테크밋업소프티어테크밋업채용상담직무상담App개발App개발자

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모바일앱개발

내일배움단 앱개발종합반 학습 3일차

08.22~ 08.25 사용프로그램: 크롬과 필기에 노션 사용   1.강의내용 정리 안드로이드 사용언어: Java&Kotlin ios 사용언어: Swift ->앱 개발의 종류 네이티브 앱: 각각의 언어를 사용한 개발 하이브리드: 웹사이트에 껍데기만 씌워 배포 크로스플랫폼: 한 가지 언어(ex:자바스크립트)로 제작 후 배포 *리액트 네이티브: 크로스플랫폼 앱 개발 언어_리액트 라이브러리/프레임워크 기반 자바스크립트 사용: 웹페이지 f12 중 콘솔 ->자바스크립트 기초문법 [변수(방정식의 미지수처럼 그릇으로써 작용) 선언시 let, var 상관없음] Const(Constant)으로 선언하는 변수는 재할당 불가능 리스트(배열): let a_list = [] 추가:.push, 길이:.length 딕셔너리(객체):let a_dict = {} 키-밸류 묶음 b_dict[x]=y(x,y묶음추가), b_dict[] .키값, [키값]은 동일한 역할 *자바스크립트 기본제공 함수있음(선언, function 함수) **변수에는 특정 값(수, 문자, 배열, 객체 등)을 할당할 수 있다 ex) 조건문과 반복문 // AND 조건은 이렇게 function is_adult(age, sex){ if(age > 20 && sex == '여'){ alert('성인 여성') } else if (age > 20 && sex == '남') { alert('성인 남성') } else { alert('청소년이에요') } } // 참고: OR 조건은 이렇게 function is_adult(age, sex){ if (age > 65 || age < 10) { alert('탑승하실 수 없습니다') } else if(age > 20 && sex == '여'){ alert('성인 여성') } else if (age > 20 && sex == '남') { alert('성인 남성') } else { alert('청소년이에요') } } is_adult(25,'남') for (1. 시작조건; 2. 반복조건; 3. 더하기) { 4. 매번실행 }   2.스터디 참석여부:출석완료 3.소감 아직 자바스크립트 기초부분이라 이해하기 어렵지 않아 다행이다. 결국 언어여서 문법과 실사용에만 익숙해지면 그냥 다른 외국어, 쓰는 외국어를 배우는 거라고 생각하면 마음의 짐이 좀 덜해지는 기분이다

모바일 앱 개발

대근

반려동물 시장 진출 웹&앱 스프링 개발자 모집

반려동물 시장 진출 웹&앱 스프링 개발자 모집   안녕하세요 현재 서로 믿을 수 있는 스타트업 멤버 구축 되었고 추가로 능력있고 참하신 스프링 개발자 팀원 찾습니다. 현재 모두 메인 잡은 있는 상황이고 사이드 프로젝트로 운영중이라 부담없이 참여 가능합니다. 관심있으신분 연락 부탁드립니다   1. 주제소개: 반려동물 서비스 중 현재 시장에 없는 서비스 2. 현재 진행 단계: 시장분석 및 명확한 주제와 컨텐츠 방향성까지 잡은 상태 3. 모집분야 및 주요업무: 앱 개발자-하이브리드 앱 (웹앱을 네이티브 형태로 감싼 형태) 유사사이트: https://www.pet-friends.co.kr/main/tab/2 4. 모집경력 및 필요스킬: 앱개발 관련하여 경력이 있거나, 최소 스프링을 자유롭게 다룰 수 있는 스킬 필요 vue.js 옵션,java 등 5. 참고기타사항: 기획/디자인/개발/마케팅 포지션 다 구성되어 있으나, 추가 개발자 필요한 상황 6. 문의/연락: 010-4590-4917 카카오: antoniobae1 참고url:IT 웹 앱 마케팅 개발 창업모임 파랑새(Since 2021.10.02 : 네이버 카페 https://cafe.naver.com/lastpick1004 https://lastpick.modoo.at/ https://www.youtube.com/channel/UCpLCToWUvdjsPqkLRZ-wpZA   이 외 어떤 직군이라도 관심있으신 분은 연락 바랍니다.

모바일 앱 개발springjavavuejs