지금까지는 화면을 만들 때 view의 내용을 코드에 직접 기입해서 만들었다. 예를 들어 이름을 표현하기 위해서 UILabel을 이렇게 만들었다. let nameLabel = UILabel(frame: CGRect(x: 0, y:0, width: 200, height: 50)) nameLabel.text = "사나" // asset name 위처럼 만드는 것은 빠르게 화면을 구성할 때는 좋지만 나중에 화면의 내용이 바뀌거나 추가될 때 코드를 직접 수정해야 한다. 그래서 "사나" 와 같은 데이터는 따로 저장을 해 두고 데이터로 부터 화면을 구성할 수 있도록 구축하면 좀 더 유연하게 유지보수 할 수 있다. 그 유명한 MVC(Model View Controller) 패턴이다. MVC Pattern 디자인 패턴은..
프로필 화면이 너무 허전하니까 뭔가 좀 더 꾸미고 싶은데, 샘플로 트와이스 사나님의 프로필을 사용했기 때문에 나머지 내용도 참고했다. 먼저 지난 포스팅에 프로필 사진이 네모로 그려지는 상태로 끝냈기 때문에 이걸 어떻게 동그랗게 자르는지 알아보자. CALayer UIView는 layer라는 인스턴스를 가지고 있어서 이것을 통해 화면에 내용을 그린다. view는 화면에 자리하기 위한 논리적인 사각형 범위와 속성들을 가지고, layer는 이 범위를 실제로 화면에 그리는 역할을 수행하는 것으로 분리되어 있다. 그리고 외곽선, 그림자 등 몇가지 렌더링 효과를 쉽게 설정할 수 있게 property를 제공한다. cornerRadius 이 옵션은 모서리의 곡률을 지정한다. 적용해 보기 위해서 화면 구성을 좀 바꾸자. ..
SwiftUI가 나왔지만 아직 많은 개발자들이 UIKit을 사용해서 개발하고 있기 때문에 UIKit도 공부할 필요가 있다. 프로필을 보여주는 메인 ViewController를 만들어 보자. XCode12부터 SwiftUI를 사용해서 개발할 수 있게 되었기 때문에 프로젝트를 만들 때 두가지를 선택할 수 있다. 여기에서는 Storyboard를 활용해서 만들 것이기 때문에 storyboard를 선택하고 넘어간다. 언어는 swift를 선택한다. 프로젝트를 만들면 AppDelegate, SceneDelegate, main storyboard가 자동으로 생성되어 있는 것을 볼 수 있다. AppDelegate : 애플리케이션의 생명 주기에 따라 발생하는 이벤트를 처리한다. SceneDelegate : IOS13부터 ..
swift의 함수형 언어 특성인 closure를 공부했으니 이번에는 객체지향적 특성에 대해 공부해보자. swift는 객체지향 코딩을 위해서 여러가지 인터페이스를 제공한다. 사실 인터페이스라는 단어와 가장 어울리는 개념은 protocol이다.하지만 프로그래머로 하여금 코드의 각 조각들을 서로 연결시켜주는 역할을 한다는 뜻으로 사용했다. protocol : 가장 추상적인 인터페이스로 선언만 허용되는 인터페이스다. 실제 사용하기 위해서는 상속을 받아서 구체화시켜서 사용한다. class : 아마 가장 많이 사용할 인터페이스일 것이다. 함수(=method)와 변수(=property)를 모두 가질 수 있고, 인스턴스를 생성해서 프로그램 여기저기에서 사용된다. struct : 데이터를 구조화시킬 때 많이 사용한다. ..
객체지향 프로그래밍을 하다보면 상속 관계에 있는 여러 클래스의 인스턴스를 만들고 그 인스턴스들을 관리하는 방법이 필요하다. type별로 일일히 관리하면 코드가 너무 비효율적이니까 효율적으로 관리하기 위해서는 일단 해당 인스턴스의 정확한 type을 알아야하고, 가능한 가장 추상적인 type으로 관리할 수 있어야 한다. 보통 super class type으로 모든 인스턴스를 관리하고 특정 sub class의 연산을 수행하려면 sub class type으로 캐스팅해서 접근하도록 구현하는데 swift 에서 이걸 어떻게 구현할 수 있는지 알아보자. is is라니. swift는 가독성을 향상시키기 위해서 노력한 흔적들이 굉장히 많이 보인다. 그래서 문법을 말로 설명하는 것 보다 코드를 한번 보는 게 오히려 더 이해..
함수를 많이 만들고 함수의 기능이 점점 많아지고 연결된 다른 연산들이 많을 경우 함수로 진입하기 위한 조건과 종료할 때 처리해 줘야 할 일들이 점점 더 많이 생긴다. 그래서 이 두가지를 함수의 시작과 끝에서 처리해 주어야 하는데 swift는 이 동작을 위한 문법도 제공한다. guard if문과 거의 동일한 문법, 동일한 내용이다. 단, 함수 시작 부분에 함수 진입조건을 검사할 때 guard를 사용하면 다른 사람으로 하여금 코드를 다시 읽었을 때 함수의 진입조건이 무엇이고, 어디서부터 함수의 진짜 내용인지 쉽게 알 수 있게 한다. 함수의 시작이라고 했지만 실제 동작은 함수 맨 위에서부터 순서대로 실행하다가 guard를 실행한다. if의 경우 let으로 optional binding을 하면 if 밖에서는 바..
함수형 언어는 함수를 1급 객체로 다루기 때문에 함수 자체가 여기저기에 사용될 수 있다. 변수를 파라미터로 전달할 때 변수 이름으로 넘겨주지 않고, 값을 직접 넘겨줄 수 있듯이 함수도 따로 이름에 담지 않고 연산 내용을 직접 전달할 수 있다. closure는 함수보다 좀 더 추상화된 개념이며, 함수는 이름이 있는 전역 closure라고 할 수 있다. (근데 왜 책은 closure보다 함수를 먼저 알려주는지 모르겠다.) 따라서 아래 두 표현은 같은 내용이라고 할 수 있다. // function func foo(count: Int) -> String { return “there are \(count) flowers over there.” } // closure let foo = { (count: Int) -..
swift는 함수도 1급 객체이기 때문에 변수 이름에 저장하거나 다른 함수의 파라미터로 전달할 수 있다. 객체지향 언어만 공부했으면 처음에는 이해하기가 힘들 수도 있지만 c++에도 최근에 추가되고 있는 함수 포인터와 같은 맥락이라고 이해하면 되겠다. 함수 타입 함수도 변수에 저장할 수 있다고 했다. 변수는 자료형을 가져야 되는데 그럼 함수를 변수에 담았을 때 그 변수는 어떤 자료형을 가질까? 함수의 원형을 생각해보면 쉽게 이해할 수 있다. 함수를 좀 더 추상적으로 생각해보자. func add(a: Int, b: Int) -> Int { return a + b } 위 add함수를 보자. 함수 내용은 추상화할 수 없으니까 버리고, 파라미터와 반환값만 추상화 해보자. Int 자료형 변수를 2개 받아서 Int ..
- Total
- Today
- Yesterday
- game
- 국내여행
- SHADER
- mongoDB
- SwiftUI
- C++
- ue4
- C
- winsock
- 데이터베이스
- C/C++
- JSP
- SOCKET
- 자료구조
- Java
- Spring
- ios
- rxswift
- Cocos2d-x
- swift
- 수학
- OS
- DesignPattern
- database
- 운영체제
- scala
- Git
- 드라마
- machine learing
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |