IT 78

25. 프로토콜 - iOS 프로그래밍을 위한 스위프트 기초

- 프로토콜 프로토콜(Protocol) 은 특정 역할을 수행하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진을 정의한다. 구조체, 클래스, 열거형은 프로토콜을 채택(Adopted) 해서 특정 기능을 수행하기 위한 프로토콜의 요구사항을 실제로 구현할 수 있다. 어떤 프로토콜의 요구사항을 모두 따르는 타입은 그 프로토콜을 준수한다(Conform) 고 표현한다. 타입에서 프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 청사진의 기능을 모두 구현해야 한다. 즉, 프로토콜은 기능을 정의하고 제시 할 뿐이지 스스로 기능을 구현하지는 않는다. - 정의 protocol 키워드를 사용하여 정의한다. protocol 프로토콜 이름 { /* 정의부 */ ]} - 구현 프로퍼티 요구는 항상 var 키워드를 사용한..

[프로그래머스] 오픈채팅방 - 해시 (python) - 2019 KAKAO BLIND RECRUITMENT

1. 문제 설명 오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. [닉네임]님이 들어왔습니다. 채팅방에서 누군가 나가면 다음 메시지가 출력된다. [닉네임]님이 나갔습니다. 채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다. 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다. 채팅방에서 닉네임을 변경한다. 닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경된다. 예를 들어..

Problem Solving 2020.06.23

[프로그래머스] 괄호 변환 (python) - 2020 KAKAO BLIND RECRUITMENT

1. 문제 설명 카카오에 신입 개발자로 입사한 콘은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴파일하여 로그를 보니 대부분 소스 코드 내 작성된 괄호가 개수는 맞지만 짝이 맞지 않은 형태로 작성되어 오류가 나는 것을 알게 되었습니다. 수정해야 할 소스 파일이 너무 많아서 고민하던 콘은 소스 코드에 작성된 모든 괄호를 뽑아서 올바른 순서대로 배치된 괄호 문자열을 알려주는 프로그램을 다음과 같이 개발하려고 합니다. 용어의 정의 '(' 와 ')' 로만 이루어진 문자열이 있을 경우, '(' 의 개수와 ')' 의 개수가 같다면 이를 균형잡힌 괄호 문자열이라고 부릅니다. 그리고 여기에 '('와 ')'의 괄호의 짝도..

Problem Solving 2020.06.22

24. assert / guard - iOS 프로그래밍을 위한 스위프트 기초

애플리케이션이 동작 도중에 생성하는 다양한 연산 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 확인하고 빠르게 처리할 수 있다. - Assertion assert(_:_:file:line:) 함수를 사용한다. assert 함수는 디버깅 모드에서만 동작한다. 배포하는 애플리케이션에서는 제외된다. 예상했던 조건의 검증을 위하여 사용한다. * assert(_:_:file:line:)와 같은 역할을 하지만 실제 배포 환경에서도 동작하는 precondition(_:_:file:line:) 함수도 있다. - guard(빠른종료- Early Exit) guard를 사용하여 잘못된 값의 전달 시 특정 실행구문을 빠르게 종료한다. 디버깅 모드 뿐만 아니라 어떤 조건에서도 동작한다. guard의 else 블럭 내부..

23. 타입 캐스팅 - iOS 프로그래밍을 위한 스위프트 기초

- 스위프트 타입 캐스팅 인스턴스의 타입을 확인 하는 용도 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인 하는 용도 is, as를 사용한다. * 형변환은 'ex. let someDouble = Double(2)' 타입 캐스팅이 아니라 새로운 값을 생성하는 것이다. - 예제 클래스 - 타입확인 is를 사용하여 타입을 확인한다. - 업 캐스팅(Up Casting) as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해준다. Any 혹은 AnyObject로도 타입정보를 변환할 수 있다. 암시적으로 처리되므로 꼭 필요한 경우가 아니라면 생략해도 무방하다. - 다운 캐스팅(Down Casting) as? 또는 as!를 사용하여 자식 클래스의 인스턴스로..

[프로그래머스] 스킬트리 (python)

1. 문제 설명 선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다. 예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다. 위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다. 선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요. 2. ..

Problem Solving 2020.06.22

22. 옵셔널 체이닝과 nil 병합 - iOS 프로그래밍을 위한 스위프트 기초

- 옵셔널 체이닝 옵셔널 체이닝은 옵셔널의 내부의 내부의 내부로 옵셔널이 연결되어 있을 때 유용하게 활용할 수 있다. 매번 nil 확인을 하지 않고 최종적으로 원하는 값이 있는지 없는지 확인할 수 있다. - nil 병합 연산자 중위 연산자이다. ?? Optional ?? Value 옵셔널 값이 nil일 경우, 우측의 값을 반환한다. 띄어쓰기에 주의하여야 한다.

21. 인스턴스 생성 / 소멸 (init / deinit) - iOS 프로그래밍을 위한 스위프트 기초

인스턴스를 생성하는 이니셜라이저와 클래스의 인스턴스가 소멸될 때 호출되는 디이니셜라이저, 그리고 이와 관련된 것들에 대해 알아보겠다. 프로퍼티 초기값 이니셜라이저 init 디이니셜라이저 deinit - 프로퍼티 초기값 스위프트의 모든 인스턴스는 초기화와 동시에 모든 프로퍼티에 유효한 값이 할당되어 있어야 한다. 프로퍼티에 미리 기본값을 할당해두면 인스턴스가 생성됨과 동시에 초기값을 지니게 된다. 1. 이니셜라이저(initializer) 프로퍼티 초기값을 지정하기 어려운 경우에는 이니셜라이저 init을 통해 인스턴스가 가져야 할 초기값을 전달할 수 있다. 프로퍼티의 초기값이 꼭 필요 없을 때 옵셔널을 사용! class 내부의 init을 사용할때는 convenience 키워드 사용 암시적 추출 옵셔널은 인스..

20. 상속 - iOS 프로그래밍을 위한 스위프트 기초

- 스위프트 상속 상속은 클래스, 프로토콜 등에서 가능하다. 열거형, 구조체는 상속이 불가능하다. 스위프트의 클래스는 단일상속으로, 다중상속을 지원하지 않는다. 이번 파트에서는 클래스의 상속에 대해서 알아본다. - 문법 class 이름: 상속받을 클래스 이름 { /* 구현부 */ } - 사용 final 키워드를 사용하면 재정의(override)를 방지할 수 있다. static 키워드를 사용해 타입 메서드를 만들면 재정의가 불가능 하다. class 키워드를 사용해 타입 메서드를 만들면 재정의가 가능하다. class 앞에 final을 붙이면 static 키워드를 사용한것과 동일하게 동작한다. override 키워드를 사용해 부모 클래스의 메서드를 재정의 할 수 있다.

19. 프로퍼티 감시자 - iOS 프로그래밍을 위한 스위프트 기초

- 프로퍼티 감시자 프로퍼티 감시자를 사용하면 프로퍼티의 값이 변경될 때 원하는 동작을 수행할 수 있다. 값이 변경되기 직전에 willSet블럭이, 값이 변경된 직후에 didSet블럭이 호출된다. 둘 중 필요한 하나만 구현해 주어도 무관하다. 변경되려는 값이 기존 값과 똑같더라도 프로퍼티 감시자는 항상 동작한다. willSet 블럭에서는 암시적 매개변수 newValue를, didSet 블럭에서는 oldValue를 사용할 수 있다. 프로퍼티 감시자는 연산 프로퍼티에는 사용할 수 없다. 프로퍼티 감시자는 함수, 메서드, 클로저, 타입 등의 지역/전역 변수에 모두 사용 가능하다. - 정의 및 사용