All
27 posts
JAVA Coding Test Stack

Stack(LIFO) 데이터의 입력과 출력 순서는 후입선출(FILO)방식이다. 데이터를 제한적으로 접근할 수 있는 구조이고, 한쪽 끝에서만 자료를 넣거나 뺄 수 있는 구조 (DFS) 스택은 거의 모든 애플리케이션을 만들 때 사용되는 자료구조로서, 스택과 연관된 알고리즘을 제대로 이해하느냐 못하느냐에 따라 기본 알고리즘을 설계할 수 있느냐 없느냐가 결정 Stackoverflow 꽉 찬 스택에 요소를 삽입하고자 할 때 스택에 요소가 넘쳐서 에러가 발생하는 것을 스택 버퍼 오버플로(stack buffer overflow) 우리가 흔히 아는 stackoverflow도 이와 같은 의미에서 가져왔다 Stack 자료구조 LIFO(Last In First Out), 후입선출(後入先出) 구조이다. 마지막에 들어온게 첫번째로 빠져나간다. 그래서 직전의 데이터를 빠르게 갖고 올 수 있다. 뒤로 가기, 실행 취소(redo/undo), 그리고 컴퓨터 구조에서의 스택 메모리가 대표적이다. 균형성 검사를…

JAVA Coding Test Hash

Hash 데이터를 효율적으로 저장하고 검색하기 위해 사용되는 알고리즘. Java에서 해시는 , , 과 같은 자료구조에서 많이 활용함. 해시 알고리즘을 사용하려면 먼저 데이터의 해시 값을 계산해야 하는데, 이때 해시 함수는 객체의 속성 값을 기반으로 고유한 해시 코드를 생성. key-value 에서 key를 테이블에 저장할 때 key값을 Hash Method를 이용해 계산을 수행한 후, 그 결과값을 배열의 인덱스로 사용하여 저장하는 방식이다. 여기서 key값을 계산하는 것이 Hash Method 이다. Hashing HashMap과 같이 Hashing을 구현한 컬렉션 클래스에서는 Object 클래스에 정의된 hashCode()를 Hash Method로 사용한다. Object 클래스에 정의된 hashCode()는 객체의 주소를 이용하는 알고리즘으로 해시 코드를 만들어내기 때문에 모든 객체에 대해 중복되지 않는 값을 제공한다. String 클래스의 경우 Object로 부터 상속받은 ha…

JAVA Coding Test Introduction

백준 입출력 일반적으로 Scanner sc = new Scanner(System.in); 을 통해 입력을 받곤한다. 그런데 Scanner는 내부적으로 nextFloat() 이런걸 호출 시 다음 입력을 찾기 위해 정규식을 사용하므로 느리다. 이걸 쓰면 로직은 맞았는데도 시간초과나서 맞왜틀을 외치게될 수 있다. java, java.util.Scanner -> 6.068초 java, java.io.BufferedReader -> 0.934초 입력은 하나만! 입력을 위한 클래스는 하나만 쓸 것! Scanner나 BufferedReader나 둘 다 미리 일정량을 읽어들인 후 사용자의 요청(readLine() 등)에 따라 해당 버퍼에서 꺼내온다. 따라서 이걸 여러개 선언해버리면 이미 다른 클래스에서 버퍼에 쌓인 부분때문에 제대로 읽을 수 없게된다. BufferedReader (입력 TIP) 사용하려면 main클래스에 throws IOException을 추가해 주어야 한다. System.out…

OpenGL ES 3차원 컴퓨터그래픽스 Screen-space Object Manipulation

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. Object Picking 어떠한 픽셀을 클릭했을 때, 해당 픽셀이 포함된 물체가 선택되는 현상을 구현해보자. Ray : 어떤 시작점에서 한쪽 방향으로의 직선. 여기에는 start point랑 Direction vector가 있다고 생각해보자. 이 Ray가 쭉 버떠나갔을 때 어디와 마주치는지를 확인해보자. Object space → World space → Camera space → Clips space → Screen space 이 전체의 스페이스 변환을 보아도 object간 구별을 확인한 적이 없다. ray-object intersection Test에서 Object가 첫번째로 ray에 닿는 순간을 찾으면 될꺼 같다. 하지만 이는 screen-space에서는 해당 정보가 없기 때문에, Object Space공간에서 해결해야 할 것이다. screen space에…

OpenGL ES 3차원 컴퓨터그래픽스 Euler Transforms & Quaternion

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. Euler Transforms 물체를 여러 축(Principal Axes)을 기준으로 연속적으로 회전시킬 때, 물체는 새로운 임의의 방향을 갖게 된다. 이 방법을 통해 물체의 방향을 결정하는 것이 “Euler Transform”이라고 부르기로 함. Euler Angle은 여기서 Euler Angles(오일러 각): 회전할 때 사용하는 각도들로, 여기서는 𝜃1, θ2, θ3로 나타낸다. 이 각도들은 각각 다른 축을 기준으로 하는 회전을 가지게 된다. 이때 x,y,z에서 어느 축을 먼저 건드리느냐에 따라 결과물이 달라지게 된다. 축의 순서에 따라 결과가 달라지는걸 볼 수 있다. Key Frame Animation in 2D 고전에는 keyframe에는 메인 keyframe이 있고, 그 메인 keyframe들 사이를 채우는 in-between frames가 있다고 한…

OpenGL ES 3차원 컴퓨터그래픽스 Output Merger

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. Color and Depth Buffers Viewport : 실제적으로 스크린에 보여줄 영역이다. 이때 그 영역을 잠시 보관하고 있는 공간을 Buffer라고 한다. Color Buffer : 스크린에 나타날 픽셀들을 잠시 저장하는 곳 (WxH) Depth Buffer : Color Buffer에 저장된 픽셀들의 Z-value들을 저장하는 곳이라 생각하면 되겠다. Fragment Shader에서 계산된 normal을 이용해서 Lighting을 진행하고, 계산된 texCoord를 사용해서 texturing을 진행해서 결국 output merger에 RGB값을 전달하게 된다. Z-buffering color buffer에 저장하게 되는데, 각 fragment 모두마다 z-value를 비교를 해서 나타나게 된다. 예를 들어, 1,0으로 주어진 default 값에 비…

OpenGL ES 3차원 컴퓨터그래픽스 Lighting

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. Lighting 빛과 물체릐 상호작용을 다루는 모든 행위를 lighting이라고 한다. Phong Model 가장 유명한 lighting 모델 중에 Phong Model을 자주 쓴다. diffuse specular ambient emissive Diffuse Term Directional light source : 워낙 멀리 떨어져있어서 평행하다고 가정하고 한다. 가상카메라가 어디에 있든, 색깔은 동일하다고 볼 수 있다. → 난반사 (Lambertian Surface) l을 광원으로 부터는 벡터 방향 n을 p점의 normal 벡터 방향이라고 하자. 이 두 벡터 사이의 각도 세타가 커질수록 빛의 양이 더 작아진다. → cosθ cosθ에서 θ가 90도를 넘어가면, 0이 그 값이 되겠다. 백색광인 RGB가 (1,1,1)인데, 이 빛을 쐈을 때 물체 표면이 (1,0…

OpenGL ES 3차원 컴퓨터그래픽스 이미지 텍스쳐링

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. Fragment Shader Lighting Texturing Texel 텍스쳐의 구성요소를 texture element의 약자인 texcel이라고 부른다. Texture Coordinate는 polygon mesh의 각 vertex들이 계산된 값을 의미한다. Texture Coordinates (s, t)는 texture space에 투영될 fragment를 구성하기 위해서 interpolation이 되는데, 이는 fragment의 color를 결정하게 된다. s와 t는 각각 해상도가 계산되어서 최종 결정되어버린다. parameter space가 Normalized 되어있기 때문에, Texture Coordinate도 정규화된다는 걸 알 수 있다. 정규화된 texture coordinate는 특정 해상도에 의존하지 않으며 다양하게 연결할 수 있다. Surfac…

OpenGL ES 3차원 컴퓨터그래픽스 Rasterizer

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. Rasterizer 앞서 배운 vertex shader를 통해 삼각형이 그려질 것이고, 삼각형이 화면에 나타나면서 픽셀을 점유하게 될 것이다. 픽셀마다 필요한 색깔과 같은 데이터를 대입시켜주어야 한다. Clipping Perspective Back-face culling Viewport Transform Scan conversion Clipping t1의 경우 view frustum 밖에 있기 때문에 신경쓰지 않아도 된다. t2의 경우 view frustum안에 있기 때문에 구현해야겠다. GPU rendering pipeline 다음 단계로 넘어감. t3의 경우 view frustum 경계에 걸쳐있기 때문에 Clipping을 활용하여 처리를 해주어야겠다. clipping의 결과물로 일부 vertex들은 무시하고 처리될 수 있지만, 잘라진 선을 기준으로 다른 ver…

OpenGL ES 3차원 컴퓨터그래픽스 GL & Shader

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. GPU Rendering Pipeline, All Transforms 물체가 n개라면 n번의 world transform이 일어날 것이다. Vertex and Index Arrays texture coordinate라는 좌표도 vertex array에 각 셀에 같이 입력되는데, position, normal과 함께 필수 요소라고 볼 수 있다. GPU는 parallel 프로세서이기 때문에 각 vertex들이 병렬적으로 처리될 수 있다. OpenGL ES Vertex Shader와 Fragment Shader는 결국 프로그램이기 때문에, 각자가 스스로 API에게 제공을 해야 시스템이 돌아간다. Shader를 짜기 위한 GPU에 특화된 언어를 사용해야하는데, 이를 OpenGL ES Shading Language라고 한다.(GLSL) OpenGL ES Shading L…

OpenGL ES 3차원 컴퓨터그래픽스 정점 처리

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. GPU Rendering Pipeline GPU 렌더링은 다양한 과정을 걸쳐서 나타나는데, polygon mesh가 GPU안으로 입력되면, polygon mesh의 정점들은 vertex array에 저장이 되어 있을 것이다. 해당 정점들을 vertex shader가 한번에 하나씩 불러들이면서 연산을 하기 시작함. rasterizer를 통해 index array에 있는 정보를 바탕으로 삼각형을 조립하기 시작. 조립된 삼각형은 화면 안에서 여러개의 픽셀을 품고 있을텐데, 이때 각각의 픽셀의 색상을 결정할 정보를 rasterizer가 모아서 각 픽셀 위치마다 저장을 해놓는다.(= fragment) fragment shader를 통해서 각 fragment의 색깔을 결정한다. 마지막으로, output merger가 결정된 색상을 보여줄 건지, 말건지를 결정해서 최종 스크린…

OpenGL ES 3차원 컴퓨터그래픽스 스케일링

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. Scaling(축소/확대) 2차원 축소 확대는, x방향과 y방향인자를 포함하게 된다. 행렬의 곱셈으로 처리함 Rotation(회전 변환) 반시계/시계 방향은 사실 상관없음. 음수로 작성하면 동일하다. Translation anf Homogenous Coordinates 주어진 x,y를 dx dy만큼 이동하는 것을 의미함. 벡터의 덧셈으로 정의됨. 동차좌표 (homogeneous coordinates) 회전 변환과 똑같이 벡터의 곱셈으로 나타냈으면 좋겠다. (x, y) → (x, y, 1) scaling과 rotation과 다른 점은 3 x 3 행렬이라는 점. 사실 (x,y,1) 이라고 했지만, 꼭 1일 필요는 없다. with any non-zero w 가능하기 때문에, (wx, wy, w) 로 정의해도 괜찮다. 반대로 Cartesian 좌표를 변환하는 것은,…

OpenGL ES 3차원 컴퓨터그래픽스 모델링

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. Modeling 모델링이란, 그래픽스에서 렌더링할 물체를 만들어내는 것을 모델링이라고 한다. 우리가 흔히 아는 것은, 음함수 구의 방정식을 이용해서 구를 모델링하는 것이다. 문제는, GPU는 음함수를 처리하는데에 매우 적합하지 않게 설계되어있다. (추후에 이유는 알아보자.) 구의 방정식으로 모델링하는 방법 대신, 구 위의 여러가지의 정점들을 샘플링을 한다. 해당 정점들을 다각형으로 이루어져서 만들어 낸 것을 polydon mesh라고 한다. GPU는 반대로, 이런 폴리곤 매쉬를 처리하는데에 매우 적합하다고 하자 (왜 적합할까?) 1. Polygon Mesh 가장 간단한 polygon mesh는 삼각형으로 이루어진 triangle mesh이다. 우리가 배우는 OpenGL ES에서는 삼각형의 triangle mesh만 처리를 한다. 삼각형 메쉬는 보통 꼭짓점 갯수의 …

OpenGL ES 3차원 컴퓨터그래픽스 수학

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. Matrices and Vectors m x n 벡터를 표현할 때, m = n 이면 정사각(square) 행렬이라 부른다. A 행렬의 크기가 l x m 이고, B 행렬의 크기가 m x n 이면, A * B = l x n 행렬이 된다. OpenGL은 열벡터를 사용하고, M*V와 같이 행렬-벡터 (vector-on-the-right)곱셈을 사용하는 반면, Direct3D는 행벡터를 사용하고, V^T*M^T와 같은 방식(vector-on-the-left)을 사용한다. Coordinate System and Basis Coordinate System = origin(원점) + basis(기저) 좌표계 = 공간 표준기저에서 보다싶이 e1과 e2가 주축 (principle axis, x축과 y축)에 나란하므로, e1과 e2를 특별히 표준기저(Standard Basis)라…

OpenGL ES 3차원 컴퓨터그래픽스 Introduction

ⓒ 2019. JungHyun Han Korea University Seoul, All rights reserved. 3차원 컴퓨터그래픽스의 정의 3차원으로 표현된 물체를 입력으로 받아서 2차원 영상을 출력하는 작업. 이를 프레임이라고 부르는데, 이 프레임을 얼마나 빠르게 변환할 수 있는지에 따라 실시간 그래픽스(real-time grapics)와, 비-실시간 그래픽스(visual effects)로 분류할 수 있다. 초당 30개 이상(fps)을 만들어내는 대표적인 예로는 게임, 가상현실(VR), 증강현실(AR)이 있다. OpenGL ES를 이용해서 실시간 그래픽스의 기본적인 알고리즘을 이해하는 것이 주 목적이 될 것이다. Computer Grapics Production Modeling Rigging Animation Rendering Post-Processing Modeling 가상의 그래픽스 환경을 구성하는 각각의 물체를 컴퓨터가 처리할 수 있는 방식으로 표현한 것이 모델(Mo…

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

돌돌, 또또, 또 너냐? 응 나다. 다시 동아리 임원진을 한다고? 또 너냐? -클템 해설- 학교를 옮기게 되면서 적응하는데에 많이 힘이 들었던 건 사실이다. 유럽학제와 완전히 다른 학제, 내 편입학점이 얼마나 어떻게 인정되는지 등등 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 키워드를 쓰게되면, 이는 직접 전달 방식보…