Queue와 Stack은 자료구조 종류이다.
선입선출, FIFO(First-In-First-Out) 방식
현실세계에서 은행업무, 놀이공원 줄서기가 선입선출에 해당된다.
먼저 들어온 데이터가 먼저 나가는 선입선출 방식이다.
큐에서 데이터가 들어오는 곳을 rear, 데이터가 나가는 곳을 front라고 한다.
큐의 rear에서 데이터를 삽입하는 연산을 enQueue, front에서 데이터를 삭제하는 연산을 deQueue라 한다.
후입선출, LIFO(Last-In-First-Out) 방식
현실세계에서 쌓아둔 접시를 위에서 부터 하나씩 빼는 것이 후입선출에 해당된다.
가장 마지막에 들어온 데이터가 먼저 나가는 후입선출 방식이다.
Queue와 달리 데이터가 들어오는 곳과 나가는 곳은 하나(top)이다. 즉, 통로가 하나이다.
top에서 데이터를 삽입하는 연산을 push, top에서 데이터를 삭제하는 연산을 pop이라 한다.
소스코드의 특정 모듈이 의도된대로 정확히 작동하는지 검증하는 절차
함수나 메서드에 대한 Test code를 작성해서 검증한다.
예를 들면, 과일로 쥬스를 만드는 메서드가 정상 작동하는지 검증하고 싶다.
그렇다면 "바나나 3개로 바나나 쥬스를 만든다"라는 case를 정의하고,
test code안에 case와 같은 상황을 셋팅한 후,
내가 검증하고 싶은 메서드를 호출하는 방식이다. 그러면 test case는 test에 대한 결과를 알려준다.
1. 프로젝트에서 새로운 Target을 만든다.
Unit Test Bundle
템플릿으로 생성한다.
보통 테스트 이름은 "프로젝트명+test"
2. 프로젝트의 Test에 Test Target을 추가한다.
프로젝트 코드를 어떤 test로 테스트할지 설정해주는 과정이다.
command + shift + ,
또는 Edit Schemes
에서 연결한다.(Command Line Tool에서도 가능)
3. Target Membership 맺기
test하려는 소스코드로 가서 [Target Membership]에서 JuiceMakertest
를 체크한다.
JuiceMaker.swift
를 빌드할 때 JuiceMakertest
도 함께 컴파일하게 하겠다는 의미이다.
Target Membership
Target Membership에서 체크된 target은 target을 build할 때 compile할 파일에 포함된다.
????????? 반대 아닌가?????????
4. test
메서드를 클래스안에 작성한다.
메서드명은 꼭 test
로 시작해야한다.
import XCTest
class IntStackTests: XCTestCase {
func test_바나나_3개로_바나나쥬스를_만든다() {
// test code 작성
let maker = JuiceMaker()
let result = maker.makeJuice(fruit: .banana, amount: 3)
XCTAssertEqual(result, .success(.banana))
}
}
5. test를 실행한다.
edge case를 만들어 체크해주면 더 정확하게 검증할 수 있다.
요구사항, 구현해야할 기능을 분석한 다음 작성한다.
각각의 case는 서로 영향을 주고 받으면 안된다. 독립적이어야 한다.
소프트웨어 개발 프로세스 중 하나.
1) 요구사항에 대한 실패할 test case를 먼저 작성하고,
2) 그 다음 test case를 통과하기 위한 최소한의 프로덕션 코드를 작성한다.
3) 마지막으로 작성한 코드를 리팩토링한다.
[출처] https://www.thinktocode.com/2018/02/05/what-is-tdd/
compile error또한 failure, 실패한 test case로 간주 할 수 있다.
Result
A value that represents either a success or a failure, including an associated value in each case.
Generic Enumeration으로, success
또는 failure
를 표현할 수 있는 값이다. 각 케이스에 연관 값을 가질 수 있다.
@frozen enum Result<Success, Failure> where Failure : Error
stepper의 +
-
버튼으로 value
를 증감시킬 수 있다.
두번째 화면 viewcontroller의 인스턴스를 첫번째 화면에서 생성하고, 인스턴스의 UILabel을 변경해준다음 두번째 화면으로 전환하려고 했다. 그런데 두번째 화면을 띄웠더니 첫번째 화면에서 변경해준 UILabel이 반영되지 않았다.
스트리보드 UI는 viewDidLoad()
에서 로드된다. 따라서 첫번째 뷰 컨트롤러에서 UILabel에 접근을 할 수가 없고, UILabel에 값을 변경해줘도, viewDidLoad()
가 호출되면서 스토리보드UI로 초기화가 된다.