All
12 posts
첫 아이디어톤 운영, 그리고 많은 시행착오들

돌돌, 또또, 또 너냐? 응 나다. 다시 동아리 임원진을 한다고? 또 너냐? -클템 해설- 학교를 옮기게 되면서 적응하는데에 많이 힘이 들었던 건 사실이다. 유럽학제와 완전히 다른 학제, 내 편입학점이 얼마나 어떻게 인정되는지 등등 chaos 였다. 그떄마다 매번 도와준 친구가 있었는데, 정말 자기 일처럼 매번 하나하나 다 알려줘서 많이 고마웠다. 어느날, 그 친구가 나한테 사이드 프로젝트 운영하는데 부회장을 제안했다. 저는 말하는 감잔데요? ㅋㅋㅋㅋㅋㅋㅋ 사실 학교를 옮기면서 제발 이번엔 나서지 말자, 나대지 말자, 학업에 충실하자, 여러가지 다짐을 했던 건 사실이다. 그냥 너드 같은 엔지니어가 아닌, 인간을 위한 엔지니어, 사람 냄새 나며 같이 일하고 싶은 엔지니어가 되기 위해 기술경영학과를 선택하지 않았나. 지금까지 도와준 친구의 은혜를 생각해보며, 내가 마음 먹은 초심의 목표를 실천하기 위해 결정하게 된 것 같다. 창업, 스타트업 남들과 조금은 다른 낭만적인 생각 때문에 …

iOS스터디 week7, 스위프트에서 날짜와 시간 다루기

UTC(Cordinated Universal Time) 협정 세계시라고 하는 단위인데, 국제적인 표준시간의 기준이라고 한다. 국제 사회가 사용하는 과학적 시간의 표준 기존 평균태양시인 그리니치 표준시(GMT)를 대체하여 사용 (영국 그리니치 천문대 시간 기준.) 우리나라(한국)는 런던을 기준으로 + 9시간 (빠름) Date 구조체의 이해 스위프트에서 기본으로 제공해주는 날짜를 다루는 Date구조체 타입 초, 분, 시간 60초(1분) * 60분(1시간) * 24시간 = 하루를 초기준으로 3600초 3600초 * 24 = 86,400초 (하루) 정의된 타임존 날짜와 시간 다루기 Date/Calender/DateFormatter 날짜를 제대로 다루려면? 달력을 다루는 calendar 구조체의 도움도 필요 (양력, 음력인지) 문자열로 변형해주는 DateFormatter 클래스의 도움도 필요 기본적으로 지역설정/타임존의 영향이 있음. Calendar 구조체의 이해 스위프트에서 기본으로 제공…

2024 Google 새싹 해커톤 서울시 대회 수상 인터뷰

나의 발표모습ㅎ 우리팀의 모습(흰 옷이 접니다) 1. 우승의 기쁨을 맛본 소감을 한마디로 표현해 주세요. 사실 많이 수상을 기대한다기보다, 팀원들과 함께 성장을 하기 위해 나온 자리였습니다. 너무나도 좋게 봐주셔서 수상까지 하게 되어서 정말 잊을 수 없는 경험이었습니다. 팀의 이야기를 들려주세요. 저희는 데이콘에서 만들어주신 팀 게더링 단톡방에서 모이게 되었습니다. 제가 편입이라는 긴 여정을 마무리하고 개발자로서의 여정을 다시 시작하는데에 해커톤이 제격이라는 생각에 저는 새싹톤을 지원하게 되었구요. 저희 팀원 분들 모두 너무 능력자분들이셔서, 제가 최대한 페이스 맞춰가면서 제 능력을 끌어올리기에 정말 최적화 된 팀원분들이었습니다. 다시 한번 감사 인사를 드리고 싶습니다. 여러분을 돋보이게 한 특별한 점은 무엇인가요? 저희는 일단 개발을 정말 많이 했습니다. 로그인구현부터 기본적인 어플리케이션이나, 하나의 서비스 완성도를 높이는거에 좀 중점을 두었던 것 같습니다. 해커톤에서는 사실…

iOS 스터디 week6. 스위프트 네트워크와 비동기 프로그래밍

네트워킹 네트워크 연결을 통해 받은 JSON형태 데이터를 다시 클래스나 구조체의 형태로 변환하는 것은 매우 어려운 일이다. 특히 이 작업을 하나하나 손으로 해야한다면 말이다. 구조체로 바꿔주는 사이트 ↑ 위 사이트를 이용한다면 더 쉽게 형태를 바꾸어 서버에서 보내준 데이터를 사용할 수 있을 것이다. 자 이제 우리가 받아온 데이터를 우리가 쓰기 좋게 변환하는 과정(분석)을 해보자. 일단의 예전의 형태를 먼저 보면, 너무 복잡하다… 현재의 스위프트에서는 매우 간략하게 바뀔 수 있다. 궁극적으로 배열로 반환된 데이터를 볼 수 있다. 이때 좀 살펴봐야하는 것이 Decodable이라는 프로토콜이 있는데, 이는 위에어 JSON Decoder를 선택할 때 필요한 프로토콜이라고 생각하면 되겠다. 마찬가지로 Encodable 이라는 프로토콜도 존재하는데, Decodable과는 반대로 구조체나 클래스를 데이터의 형태로 변형시켜주는 프로토콜이라고 한다. decode(변형하고 싶은 객체, from: 데…

iOS 스터디 week5. 프로토콜

프로토콜 프로토콜은 타입이다. 함수를 호출할 때, “프로토콜”을 파라미터로 전달할 수 있음. 함수에서 “프로토콜”을 반환할 수 있음. “프로토콜”을 변수에 할당할 수 있음. 구조체, 열거형, 클래스랑 비슷한 타입이라는 뜻이다. → 일급객체로 취급한다.(타입으로 사용하는 조건) 인스턴스를 찍어낼 때 프로토콜로 지정해서 찍어내면, 프로토콜 선언 메서드들만 사용할 수 있다. 그 외에 해당 함수의 프로토콜에서 지정된 함수 이외에 다른 메서드를 지정하고 싶다면, 다운캐스팅을 하면 된다. 프로토콜 타입 취급의 장점 배열로 담을 수 있음. 파라미터로 사용할 수 있음. 프로토콜의 준수성 검사 특정타입이 프로토콜을 채택하고 있는지 확인 프로토콜 타입으로 저장된 인스턴스가 더 구체적인 타입인지 확인 가능 업캐스팅(as) 무조건 성공 다운캐스팅(as?/as!) 프로토콜의 상속 실제로 프로토콜을 이용해서 상속을 하는 경우는 많이 없지만, 애플이 swift내에서 많은 것들을 프로토콜의 상속을 바탕으로 구…

Github 대용량 파일 업로드 삽질....

GIF는 어지간하면 올리지 말자… 회고록을 올리면서 영상 데이터는 올릴 수가 없어서 MOV 파일을 Gif로 변환하여 깃허브에 push를 했다. 이게 도대체 뭔데…자세히 보니, gif의 용량이 너무 커서 원격서버에 올릴 수 없다는 경고문구였다 오케이 그럼 GIF 용량을 줄여야겠다~~ 너무 단순히 생각했었다. 그냥 gif 픽셀값을 줄여서 업로드 했다. 네??? 기존의 파일은 삭제되지 않을 뿐더러, 새로운 파일 조차도 깃허브 제한에 걸리고 있는 모습이었다. Sibal 구글링해보자.. 제일 먼저 깃허브 공식문서를 봤다. 아…공식문서에서 조차 1GB 미만을 강력히 권고하고 있다.. 코드와 다양한 사진들을 함께 푸시했기 때문에 전체 용량으로 봤을 때 위험한 상황임으로 판단 되었다. 오케이 그럼 삭제했는데 왜 삭제가 안되었다고 하지? 로컬에서는 삭제되었더라도, 히스토리나 캐시데이터가 남아있을 수 있다는 걸 알았다. 해당 커밋기록이나, 캐시들을 전부 지워줘야 할 꺼 같았다. GPT에서 추천하…

2024 Google 새싹 해커톤 서울시 대회 수상 회고록

프롤로그 인간을 대체할 만한 AI의 발전, 개발직을 정말 내가 원하긴 하는지, 그래서 T자형 인간이 도대체 뭐일까에 대한 회의감 등등 지난 1년동안 참 많은 것들을 고민하며 지내온 것 같다. 이런 시간을 보내면서, VS code를 단 한번도 열어보지 않았고, 그 수북하고 초록색으로 물들어있던 내 깃허브 잔디 또한 잿빛 가뭄이 되어버리고 말았다. 23년 5월 이후 24년 7월까지 잔디가 비어있다… IMG_3727.JPG 어느 날 문득 엔지니어의 길이 확신을 서는 순간이 있었고, 이 확신을 다시 한번 검증하는 무대가 필요했다. 사실 AI, FE, iOS, AR(Unity)까지 경험해보면서, 어떤 한 분야라도 전문분야로 잡고 있지 못하고 있다는 점이 내게는 정말 치명적이었고 이 부분부터 하루빨리 정해야하는 상황이긴 했다. 이 모든 걸 검증하고, 1년간 묵혀둔 내 빨(?)을 끌어올리기에 가장 좋은 건 해커톤에 참여하는 것이라고 판단했던 것 같다. 너 아싸인데 팀은…? 사실 팀이 가장…

iOS 스터디 week4. 구조체의 확장과 생성자 관련 세부사항

구조체의 확장과 생성자 관련 세부사항 확장에서도 생성자를 구현할 수 있지만, 모든 생성자를 구현할 수는 없다. 잘생각해보자 class에서 편의생성자는 delegate across로 같은 스코프? 계층에 있는 생성자를 호출 호출된 지정생성자는 메모리를 찍어내는 역할을 함. 확장에서도, 말 의미 그대로 지정생성자를 추가하기보다는, 편의 생성자만 생성가능 (지정생성자 추가 불가/소멸자 추가 불가) 다만 클래스가 아닌 경우에, 본체에 지정생성자를 호출하는 방법만 가능(convinence는 아니지만, 비슷한 방식) 값타입(구조체)의 경우 저장속성에 기본값/생성자 정의안한 경우, 생성자 구현 가능 클래스에서의 확장예시 구조체에서의 확장 예시 구조체는 (원래) 편의 생성자가 존재하지 않고, 상속과 관련이 없기 때문에 지정생성자의 형태로도 자유롭게 생성자 구현 가능 -> 본체에 멤버와이즈 이니셜라이저랑 기본생성자가 자동 구현이 됨. 따라서 확장에서 같은 기본 생성자를 한번 더 구현하게 되면 …

iOS스터디 week3, 계산속성과 저장속성

구조체(struct) and 클래스(class) 이 둘은 모두 객체지향 → 공통적으로 속성값(properties)은 같다. 저장속성, 지연(Lazy)저장속성, 계산속성(Computed), 타입속성, 속성 감시자(observer) 공통적인 속성값 중, 계산속성과 타입속성에 대해 알아보자. 계산속성(Computd Properties) 값이 일반적으로 저장되는 일반적인 속성(변수)를 저장 속성이라고 한다. 지금까지는 변수선언 부 밑에 매서드를 작성하여 간단하게 리턴하는 방식을 사용하였다. 이 방식은 단순이 계산 속성이라기 보다는, 저장속성으로 저장 value들을 이용하여 계산 문법을 실행한 결과값을 리턴했다고 보는게 맞겠다. 밖에서 해당 인스턴스에 접근해서 “get”, 값을 얻는다는 의미이다. 어떻게 보면 저장속성이라고 볼 수 있지만, 리눅스의 Read속성과 비슷해보인다. 단순히 값을 읽어오는 것도 컴퓨터로서는 계산으로 판단하게 되는 것 같아보임. 항상 다른 저장 속성에 의한 결과로 계…

Swift 특이점①, 열거형(Enum)

열거형(Enumerations) 타입 자체를 한정된 사례(case)안에서 정의할 수 있는 타입 한정된 사례(정해진 갯수) 안에서 정의할 수 있을때 월 / 화 / 수 / 목 / 금 / 토 / 일 동 / 서 / 남 / 북 좌로 정렬 / 가운데 정렬 / 우측 정렬 초등학교 / 중학교 / 고등학교 / 대학교 남 / 여 가위 / 바위 / 보 열거형을 사용하면 코드의 가독성과 안정성이 높아짐 ===> 명확한 분기 처리 가능 열거형의 원시값과 연관값 열거형의 원시값은 매칭되는 기본값(정수/문자열)을 정해, 열거형을 좀 더 쉽게 활용 가능 → Int나 String 형태가 보통 많이 쓰이긴 한다. 원시값 입력안하면 0, 1, 2 이렇게 자동으로 저장됨 (정수의 경우 숫자가 하나씩 증가) 1(설정시), 2, 3 0, 2(설정시), 3 원시값의 활용 숫자 또는 문자열과 매칭시켜 자유롭게 활용 가능 (숫자 ←→ 열거형 타입) 논리적으로 nil이 될 수 없다면, 출력은 하지만 문자열은 아님에 주의 여기…

iOS스터디 week2, 컬렉션(collection)

스위프트 컬렉션 데이터를 효율적으로 관리하기 위한 자료형 타입이다. Array : 데이터를 순서대로 저장하는 컬렉션 Dictionary : key: value 하나의 쌍으로 관리 (X순서) Set : X순서, X중복 Array 배열 파이썬에서의 와 많이 유사한 형태이다 배열의 문법 약속 [] 대괄호로 묶는다. 배열의 인덱스의 시작은 0부터 (모든 프로그래밍 언어 공통 사항) 1개의 배열에는 동일한 타입의 데이터만 담을 수 있다. (순서가 있기 때문에) 값은 중복 가능 배열의 기본기능 배열의 각 요소(element)에 대한 접근 서브스크립트를 이용해서 각 요소에 효율적으로 접근할 수 있다. 이 점 또한 파이썬과 매우 유사한 형태 스위프트를 배우면서 제일 많이 느끼는건, 에러처리에 굉장히 쫄아있는(?) 느낌이다. 파이썬에 비하면 정말 과할 정도로 많은 함수를 지원하는데, 공통적으로 모든함수에서, ‘너가 찾으려는 게 없을 수도 있어~‘를 대비하여 옵셔널 처리를 하여 결과값을 보여준다.…

inout 입출력 파라미터, gaurd문, 옵셔널 바인딩

기존 파이썬이나 자바스크립트 문법을 알고 있기 때문에, 비슷한 방식의 문법구조와 관련된 건 스킵하기로 했다. 다만 Swift에서 꼭 알아야만 하는 문법과 이 언어의 특징과 같은 문법들은 꼼꼼하게 되짚어보자. (사실 이게 더 어려움;;) 1. inout 입출력 파라미터 함수를 통해, 변수를 직접 수정하고 싶은 경우, 함수내의 파라미터는 기본적으로 복사되어 전달되는 값타입(str, string, Int…)이며, 임시상수이기 때문에 변경 불가가 원칙임. 뭐 파이썬처럼 생각해보면 맞지 않을까? 라는 의문이 들 수 있는게 당연하다 (일단 나부터 개추;;) 실제로는 이 코드는 에러블록을 띄우는데, a와 b는 파라미터이기 때문에, 전역변수 scope에 있던 변수들이 복사되어 전달된다 (직접 쓰인다 정도로 이해하면 될 듯) 따라서, 원본이 전달되기 때문에 전역변수의 값이 변경되어서는 안되는 변경 불가가 원칙이다. 이 예시를 보면 파라미터 앞에 inout 키워드를 쓰게되면, 이는 직접 전달 방식보…