스포너스 1차 스프린트가 끝나고,Swift 문법을 한 번 제대로 정독해 볼 필요성을 느꼈습니다.Python + 약간의 Java 지식으로 대부분의 코드들은 대강 이해할 수 있었지만iOS 개발자가 되겠다는 목표로 애플 디벨로퍼 아카데미에 들어온 만큼해당 도메인에서 사용되는
"Hello, world!" 출력 간단한 값 (Simple Values) 상수를 만들기 위해 let를 사용하고, 변수를 만들기 위해 var를 사용한다. let으로 선언한 상수는 컴파일 타임에 알 필요는 없지만 반드시 한 번은 할당해야 한다. 값은 한번만 할당되지만 여
조건문 - if / switch루프 - for-in / while / repeat-while조건문이나 루프 변수를 둘러싼 소괄호는 선택사항이며 중괄호는 필수사항이다.if문에서 조건식은 반드시 불리언으로 표현되어야 한다.즉, if score { ... }과 같은 코드는
함수 선언 - func소괄호 안에 인수 리스트와 함수 이름으로 호출한다.함수 리턴 타입에서 파라미터 이름과 타입을 구분하기 위해 ->를 사용한다.기본적으로 함수는 파라미터 이름을 인수의 라벨로 사용한다.파라미터 이름 전에 인수 라벨을 작성하거나,인수 라벨을 사용하지 않
class 뒤에 클래스의 이름을 사용하여 클래스를 생성한다. 클래스에서 프로퍼티 선언은 클래스의 컨텍스트 내에 있다는 점을 제외하면, 상수 또는 변수를 선언하는 방법과 동일하다. 클래스 이름 뒤에 소괄호를 넣어 클래스의 인스턴스를 생성한다. 인스턴스의 프로퍼티와 메소
열거형을 생성하기 위해서 enum을 사용한다. 클래스, 다른 명명된 타입과 같이 열거형을 메소드를 가질 수 있다.
비동기적으로 실행되는 함수를 나타내기 위해 async를 사용한다.앞에 await를 작성하여 비동기 함수를 호출하는 것을 나타낸다.비동기 함수를 호출하기 위해 async let을 사용하여 다른 비동기 코드와 병렬로 실행할 수 있다.await를 작성하여 반환된 값을 사용한
프로토콜을 선언하려면 protocol을 사용해야 한다.클래스, 열거형, 그리고 구조체는 프로토콜을 채택할 수 있다.구조체를 수정하는 메소드를 표시하기 위해 SimpleStructure의 선언에서 mutating 키워드를 사용했다.클래스의 메소드는 항상 클래스를 수정할
Error 프로토콜을 채택하는 모든 타입을 사용하여 에러를 나타낸다.에러를 던지기 위해 throw를 사용하고 에러를 던질 수 있는 함수를 나타내기 위해 throws를 사용한다.함수에서 에러가 발생하면 함수는 즉시 반환되고 함수를 호출한 코드가 에러를 처리한다.에러를 처
제네릭(generic) 함수 또는 타입을 만들기 위해 꺾쇠 괄호 안에 이름을 작성한다.제네릭 형태의 함수와 메서드 뿐만 아니라 클래스, 열거형, 그리고 구조체도 만들 수 있다.요구사항의 리스트를 지정하기 위해 본문 바로 전에 where을 사용한다.예를 들어, 타입이 프
Swift는 정수에 대한 Int, 부동 소수점 값에 대한 Double, 불리언 값에 대한 Bool, 그리고 텍스트에 대한 String을 포함하는 많은 기본적인 데이터 타입을 제공한다.Swift는 또한 Array, Set, 그리고 Dictionary인 3개의 기본 콜렉션
코드에서 설명 또는 기록을 위해 실행되지 않는 문자를 추가할 땐 주석(Comments)을 사용한다.주석은 코드 컴파일 시 컴파일러에 의해 무시된다.Swift 주석은 C에서 주석을 다는 방법과 유사하다. 한줄 주석은 두 개의 슬래시(//)로 시작한다.여러 줄 주석은 슬래
정수는 부호가 있는 정수(signed), 또는 부호가 없는 정수(unsigned)가 있다.Swift는 8, 16, 32, 그리고 64비트 형태의 signed/unsigned 정수를 지원한다.8비트 unsigned 정수는 UInt8, 32비트 signed 정수는 Int3
부동 소수점 숫자(Floating-point numbers)는 3.14159, 0,1, -273.15와 같은 분수 성분을 가진 숫자이다.부동 소수점은 정수 타입 값 범위보다 더 넓은 표현이 가능하고, Int보다 더 크거나 작은 값 저장이 가능하다.Swift는 2개의 부
정수 리터럴은 아래와 같이 표현할 수 있다.접두사 X: 10진수0b 접두사: 2진수0o 접두사: 8진수0x 접두사: 16진수아래의 예에서 모든 정수 리터럴은 10진수 17의 값을 가진다.부동 소수점 리터럴은 10진수 또는 16진수일 수 있다.소수점 양쪽에 항상 숫자(1
음수를 사용하지 않더라도 코드에서 상수와 변수가 정수로 사용되면 Int 타입을 사용한다.일반적인 상황에서 기본 정수 타입을 사용하는 것은 정수 상수와 변수가 코드에서 즉시 상호 운용 가능하며 정수 리터럴 값의 유추된 타입이 일치한다는 것을 의미한다.외부 소스에서 명시적
타입 별칭(Type Aliases)는 이미 존재하는 타입을 다른 이름으로 정의한다.타입 별칭은 typealias 키워드를 사용하여 정의할 수 있다.타입 별칭은 외부 소스에서 특정 크기의 데이터로 작업할 때와 같이 상황에 맞는 이름으로 기존 타입을 참조하려는 경우에 유용
Swift는 Bool이라 불리는 기본 불리언 타입이 있다.Bool 값은 오직 참 또는 거짓 값만 가지므로 논리적으로 참조된다.Swift는 2개의 부울 상수 값인 true와 false를 제공한다.orangesAreOrange와 turnipsAreDelicious의 타입은
변수 또는 상수에 값이 없을 수도 있을 경우 옵셔널을 사용한다.옵셔널 값은 특정 타입의 값을 가지고 있을 수도 있고 nil 값을 가지고 있을 수도 있다.누락될 수 있는 값의 예로는, Swift의 Int 타입은 String 값을 Int로 변환하는 초기화가 존재한다.그러나
프로그램이 실행되는 동안 에러가 발생할 때 처리하기 위해 에러 처리(error handling)를 사용한다.값의 존재 유무를 사용하여 함수의 성공 또는 실패를 전달할 수 있는 옵셔널과 달리 에러 처리를 사용하면 에러 원인을 판별하고 필요한 경우 에러를 프로그램의 다른
역설과 전제조건 (Assertions and preconditions)은 런타임 시 발생하는 조건이다.추가 코드를 실행하기 전에 이를 사용하여 필수조건이 충족되는지 확인할 수 있다.역설 또는 전제조건의 부울 조건이 true이면 코드는 평소와 같이 진행되며,false이면
긴 문자열을 만들기 위한 시작점으로 빈 String 값을 만드려면 빈 문자열 리터럴을 변수에 할당하거나 초기화 구문으로 새 String 인스턴스를 초기화한다.String 값은 부울 isEmpty 프로퍼티로 비어있는지 체크할 수 있다.
특정 String은 변수 또는 상수에 할당되어 변경할 수 있는지 여부를 알 수 있다.Note:이 접근방식은 Objective-C와 Cocoa의 문자열 변형과 다르다.두 클래스 (NSString 및 NSMutableString) 중에서 선택하여 문자열 변형이 가능한지 여
Swift의 String 타입은 값 타입 (value type)이다.새로운 String 값을 생성한다면 String 값은 함수 또는 메서드에 전달될 때나 상수 또는 변수에 대입될 때 복사된다.각 경우에 존재하는 String 값의 새로운 복사본이 생성되고 원본이 아닌 새
문자열과 for-in 루프로 String 의 각각의 Character 값에 접근할 수 있다.또는 하나의 문자 문자열 리터럴을 Character 타입을 명시하여 단독의 Character 상수 또는 변수를 생성할 수 있.String 값은 초기화 인수로 Character 값
String 값은 덧셈 연산자 (+)를 추가 (또는 연결) 하여 새로운 String 값을 생성할 수 있다.또한 존재하는 String 변수에 덧셈 대입 연산자 (+=)로 String 값을 연결할 수 있다.String 타입의 append() 메서드를 이용하여 String
문자열 삽입 (String interpolation)은 상수, 변수, 리터럴, 그리고 문자열 리터럴에 값이 포함된 표현식을 혼합해 새로운 String 값을 생성하는 방법이다. 문자열 삽입은 한줄과 여러줄 문자열 리터럴에서 사용할 수 있다.문자열 리터럴에 추가하는 방법은
유니코드 (Unicode) 는 인코딩, 표기, 그리고 다른 쓰기 시스템에서의 텍스트 프로세싱을 위한 국제 표준이다.거의 모든 언어의 문자를 표준화된 형식으로 표현하고 텍스트 파일 또는 웹 페이지와 같은 외부 소스에서 해당 문자를 읽고 쓸 수 있습니다.Swift의 Str
문자열에서 Character 값의 카운트를 구하려면 문자열에서 count 프로퍼티를 사용한다.Swift에서 Character값을 위한 확장된 문자소 클러스터 사용은 문자열 카운트에 영향을 주지 않는다.예를 들어, 4개의 문자 단어인 cafe로 새로운 문자열을 초기화하고
각 String 값은 문자열에 각 Character의 위치에 해당하는 String.Index인 인덱스 타입을 가지고 있다.위에서 언급했듯이 문자마다 저장할 메모리 양이 다를 수 있으므로 특정 위치에 있는 Character를 확인하려면 해당 String의 시작 또는 끝에

문자열에서 서브스크립토 또는 prefix(\_:)과 같은 메소드를 사용하여 부분 문자열을 얻을 때 그 결과는 다른 문자열이 아닌 Substring의 인스턴스이다.Swift의 부분 문자열은 문자열과 거의 동일한 메소드를 가지고 있기 때문에 문자열과 동일하게 부분 문자열을
Swift는 문자열과 문자 같음, 접두사 같음, 그리고 접미사 같음과 같이 텍스트 값을 비교하는 3가지 방법이 있다.== 연산자와 != 연산자로 문자열과 문자가 같은지 확인한다.2개의 String 값 또는 2개의 Character 값은 확장된 문자소 클러스터가 정규적으

유니코드 문자열이 텍스트 파일 또는 다른 저장소에 쓰여질 때 해당 문자열의 유니코드 스칼라는 정의된 유니코드 인코딩 형식 중 하나로 인코딩된다.각 형식은 코드 유닛으로 알려진 작은 청크로 문자열을 인코딩한다.이건승 UTF-8, UTF-16, UTF-32 방식을 포함한다

배열, 집합, 그리고 딕셔너리를 사용하여 데이터를 구성한다.Swift는 콜렉션의 값을 저장하기 위한 배열, 집합, 딕셔너리와 같은 3개의 원시적인 콜렉션 타입을 제공한다.배열은 콜렉션 값에 순서를 가지고 있다.집합은 반복되지 않은 값에 순서가 없는 콜렉션 타입이다.딕셔
배열은 순서대로 같은 타입의 값을 저장한다.같은 값은 배열에 다른 순서로 존재할 수 있다.Note:Swift의 Array 타입은 Foundation의 NSArray 클래스와 연결된다.Swift 배열의 타입은 저장할 배열 값의 타입을 나타내는 Array<Elemen
집합은 콜렉션의 순서와 상과없이 같은 타입의 다른 값을 저장한다.아이템의 순서가 중요하지 않거나 아이템이 반복되면 안될 때 배열 대신에 집합을 사용할 수 있다.Note:Swift의 집합 타입은 Foundation의 NSSet 클래스와 연결된다.집합(set)에 저장하기

두 집합을 합치거나 두 집합의 공통 값을 구하거나 두 집합이 모두 같은 값을 갖고 있거나 한쪽에만 존재하거나 아예 없거나와 같은 기본적인 집합 연산을 효율적으로 수행할 수 있다.아래 그림은 두 집합 a 와 b 의 여러가지 집합 연산에 대한 결과를 나타낸다.interse
딕셔너리 (dictionary) 는 순서와 상관없이 콜렉션에 같은 타입의 키 (key)와 같은 타입의 값 (value)를 저장한다. 각 값은 딕셔너리 내부에서 값에 대한 식별자로 동작하는 유니크한 키 와 조합됩니다. 배열의 아이템과 다르게 딕셔너리의 아이템은 특정 순서
분기, 루프, 이른 종료로 코드를 구성한다.Swift는 다양한 제어 흐름(control flow) 구문을 제공한다.이것은 여러번 작업을 수행하는 while 루프를 포함하고조건에 따라 다르게 실행되는 if, guard, switch 구문과코드에서 다른 포인트로 실행 플로

while 루프는 조건이 false 가 될 때까지 구문을 수행한다.이러한 루프는 첫번째 반복이 시작되기 전에 반복 횟수를 알 수 없을 때 가장 잘 사용된다.Swift는 두 종류의 while 루프를 제공한다.while 은 루프가 시작할 때마다 조건을 비교한다.repeat

조건이 포함하는 코드 기반의 다른 조각을 실행할 때 유용한 경우가 있다.에러가 발생하거나 값이 너무 크거나 작을 때 메세지를 출력하려고 할 때 코드의 별도의 부분을 실행하고 싶을 수 있다.이러한 동작을 위해 코드 조건부의 부분을 만들어야 한다.Swift는 코드에 조건부

제어 변경 구문 (Control transfer statements) 은 한 코드에서 다른 코드로 제어를 변경하여 코드가 실행되는 순서를 변경한다.Swift는 5개의 제어 변경 구문이 있다.continuebreakfallthroughreturnthrowcontinue
코드의 일부분이 실행되거나 실행 횟수를 제어할 수 있는 if 와 while 과 같은 제어 흐름 구조와 다르게 defer 는 코드 일부분이 실행되는 시기를 제어한다.현재 범위의 마지막에 실행되는 코드블럭을 작성하기 위해 defer 블럭을 사용한다.위의 예제에서 defer
Swift는 주어진 타겟에서 사용 불가능한 API를 실수로 사용하는 것을 막기위해 사용 가능한 API 확인 (checking API availability)을 제공한다.컴파일러는 사용된 API가 프로젝트에 특정 타겟에서 사용 가능한지 확인하기 위해 SDK 안에 사용 가
함수, 인수 라벨을 정의하고 호출하고 반환값을 사용한다.함수 (Functions) 는 특정 작업을 수행하는 코드 모음 형태이다.무슨 동작을 하는지 함수에 특정 이름을 부여할 수 있으며 작업을 수행하기 위해 함수를 "호출" 할 때 사용된다.Swift의 통합 함수 구문은
함수 파라미터와 반환값 (Function parameters and return values)은 Swift에서 매우 유연하다. 이름이 지정되지 않은 단일 파라미터가 있는 간단한 유틸리티 함수에서 파라미터 이름과 다른 파라미터 옵션이 있는 복잡한 함수에 이르기까지 모든
각 함수 파라미터는 인수 라벨 (argument label) 과 파라미터 이름 (parameter name) 을 가지고 있다. 인수 라벨은 함수가 호출될 때 사용되고 각 인수는 함수 호출 시 인수 라벨 다음에 작성한다. 파라미터 이름은 함수를 구현할 때 사용된다. 기본
모든 함수는 파라미터 타입과 반환 타입으로 구성된 특정 함수 타입 (function type) 이 있다.예를 들어:이 예제는 addTwoInts 와 multiplyTwoInts 라 불리는 간단한 수학 방정식 함수를 정의한다. 이 함수는 각각 2개의 Int 값을 가지며
이 챕터에서 접한 모든 함수는 전역 범위에서 정의된 전역 함수 (global functions) 의 예이다. 중첩 함수 (nested functions) 라고 하는 다른 함수 내에 함수를 정의할 수도 있다.중첩 함수는 기본적으로 바깥에서 보이지 않지만 중첩 함수를 둘러
명명된 함수 생성 없이 실행되는 코드 그룹이다.클로저는 코드에서 주변에 전달과 사용할 수 있는 자체가 포함된 기능 블럭이다.Swift의 클로저는 다른 프로그래밍 언어에서 클로저, 익명 함수, 람다, 그리고 블럭과 유사하다.클로저는 정의된 컨텍스트에서 모든 상수와 변수에
클로저는 정의된 둘러싸인 컨텍스트에서 상수와 변수를 캡처 (capture) 할 수 있다. 그러면 클로저는 상수와 변수를 정의한 원래 범위가 더이상 존재하지 않더라도 본문 내에서 해당 상수와 변수의 값을 참조하고 수정할 수 있다.Swift에서 값을 캡처할 수 있는 가장
함수에 인수로 클로저를 전달하지만 함수가 반환된 후 호출되는 클로저를 함수를 탈출 (escape) 하다 라고 말한다. 클로저를 파라미터로 갖는 함수를 선언할 때 이 클로저는 탈출을 허락한다는 의미로 파라미터의 타입 전에 @escaping 을 작성할 수 있다.클로저가 탈
자동 클로저 (autoclosure) 는 함수에 인수로 전달되는 표현식을 래핑하기 위해 자동으로 생성되는 클로저이다.인수를 가지지 않으며 호출될 때 내부에 래핑된 표현식의 값을 반환한다.이러한 구문상의 편의를 통해 명시적 클로저 대신에 일반 표현식을 작성하여 함수의 파
리스트의 가능한 값으로 정의한 사용자 정의 타입을 모델링한다.열거형 (enumeration) 은 관련된 값의 그룹을 위한 일반 타입을 정의하고 코드에서 타입-세이프 방법으로 값을 동작하게 한다.C에 익숙하다면 C 열거형은 정수값을 설정하기 위해 연관된 이름을 할당하는
switch 구문으로 각각의 열거형 값을 일치시킬 수 있다:이 코드를 아래와 같이 읽을 수 있다:"directionToHead 값을 고려합니다. .north 와 같은 케이스일 경우 "Lots of planets have a north" 를 출력합니다. .south 와

이전 섹션에서 예제는 열거형 케이스가 어떻게 정의되고 값이 입력되는지 보여 준다. 상수 또는 변수를 Planet.earth 로 설정하고 나중에 값을 체크할 수 있다. 그러나 경우에 따라 이러한 케이스 값과 함께 다른 타입의 값을 저장할 수 있는 것이 유용하다. 이 추가
연관된 값 (Associated Values) 에서의 바코드 예제는 어떻게 열거형 케이스에 다른 타입의 연관된 값을 저장한다고 선언 하는지를 보여준다. 연관된 값의 대안으로 열거형 케이스는 모두 동일한 타입의 기본값 (원시값 (raw values))으로 미리 채워질 수
재귀 열거형 (recursive enumeration) 은 열거형 케이스에 하나 이상의 연관된 값으로 열거형의 다른 인스턴스를 가지고 있는 열거형이다. 열거형 케이스가 재귀적임을 나타내기 위해 케이스 작성 전에 indirect 를 작성하여 컴파일러에게 필요한 간접 (i
데이터를 캡슐화하는 사용자 정의 타입을 모델링한다.구조체 (Structures) 와 클래스 (classes) 는 프로그램 코드의 구성 요소가 되는 범용의 유연한 구조이다. 상수, 변수, 그리고 함수를 정의하는 것과 같은 구문을 사용하여 구조체와 클래스에 프로퍼티와 메서

값 타입 (value type) 은 변수 또는 상수에 할당될 때나 함수에 전달될 때 복사 되는 값인 타입이다.실제로 값 타입에 대해 이전 챕터에서 광범위하게 다뤘다. 실제로 Swift에서 정수, 부동 소수점, 부울, 문자열, 배열 그리고 딕셔너리와 같은 기본 타입의 모

값 타입과 반대로 참조 타입 (reference types)은 변수 또는 상수에 할당될 대나 함수로 전달될 때 복사되지 앟ㄴ는다. 복사본 대신에 존재하는 같은 인스턴스에 대한 참조가 사용된다.다음은 위에 정의된 VideoMode를 사용하는 예이다.이 예제는 tenEig
인스턴스 또는 타입의 부분인 저장된 값과 계산된 값에 접근한다.프로퍼티 (Properties) 는 값을 특정 클래스, 구조체, 또는 열거형에 연결한다. 저장된 프로퍼티 (Stored properties)는 인스턴스의 일부로 상수와 변수 값을 저장하는 반면에 계산된 프로

저장된 프로퍼티 외에도 클래스, 구조체, 그리고 열거형은 값을 실질적으로 저장하지 않는 계산된 프로퍼티 (computed properties) 를 정의할 수 있다. 대신 다른 프로퍼티와 값을 간접적으로 조회하고 설정하는 getter와 옵셔널 setter를 제공한다.이
프로퍼티 관찰자 (Property observers)는 프로퍼티의 값이 변경되는지 관찰하고 응답한다. 프로퍼티 관찰자는 프로퍼티의 현재 값이 새로운 값과 같더라도 프로퍼티의 값이 설정될 때 호출된다.아래의 위치에 프로퍼티 관찰자를 추가할 수 있다:정의한 저장된 프로퍼티
프로퍼티 래퍼 (property wrapper)는 프로퍼티가 저장되는 방법을 관리하는 코드와 프로퍼티를 정의하는 코드 사이에 분리 계층을 추가한다. 예를 들어 쓰레드 안정성 검사를 제공하거나 기본 데이터를 데이터베이스에 저장하는 프로퍼티가 있는 경우 모든 프로퍼티에 해
프로퍼티를 계산하고 관찰하기 위해 위에서 설명한 기능은 전역 변수 (global variables) 와 지역 변수 (local variables) 에도 사용할 수 있다. 전역 변수는 함수, 메서드, 클로저, 또는 타입 컨텍스트의 외부에 정의된 변수이다. 지역 변수는 함

인스턴스 프로퍼티는 특정 타입의 인스턴스에 속하는 프로퍼티이다. 타입의 새로운 인스턴스를 만들 때마다 다른 인스턴스와는 별도로 고유한 프로퍼티 값을 설정한다.또한 해당 타입의 인스턴스가 아닌 타입 자체에 속하는 프로퍼티를 정의할 수도 있다. 생성하는 해당 타입의 인스턴
인스턴스 또는 타입의 부분인 함수를 정의하고 호출한다. 메서드 (Methods) 는 특정 타입과 연관된 함수이다. 클래스, 구조체, 그리고 열거형은 주어진 타입의 인스턴스 동작을 위한 특정 작업과 기능을 캡슐화하는 인스턴스 메서드를 정의할 수 있다. 클래스, 구조체,
위에 설명한 인스턴스 메서드는 특정 타입의 인스턴스에서 호출하는 메서드이다. 타입 자체에서 호출되는 메서드도 정의할 수 있다. 이런 종류의 메서드를 타입 메서드 (type methods) 라고 한다. 메서드의 func 키워드 전에 static 키워드를 작성하여 타입 메

콜렉션의 요소에 접근한다.클래스, 구조체, 그리고 열거형은 콜렉션, 리스트, 또는 시퀀스의 멤버 요소에 접근할 수 있는 단축키인 서브 스크립트 (subscripts) 를 정의할 수 있다. 설정과 검색을 위한 별도의 메서드 없이 인덱스로 값을 설정하고 조회하기 위해 서브
기능을 추가 또는 재정의 하기 위한 하위 클래스이다.클래스는 다른 클래스에서 메서드, 프로퍼티, 그리고 다른 특성을 상속 (inherit)할 수 있다. 클래스가 다른 클래스로 부터 상속될 때 상속하는 클래스를 하위 클래스 (subclass) 라고 하고 상속된 클래스를
하위 클래스는 상위 클래스에서 상속할 인스턴스 메소드, 타입 메소드, 인스턴스 프로퍼티, 타입 프로퍼티, 또는 서브스크립트 자체 사용자 구현을 제공할 수 있다. 이것을 재정의(Overriding)이라 한다. 상속될 특성을 재정의하려면 재정의할 정의 앞에 overide
fianl 키워드를 사용하여 실수로 메소드, 프로퍼티, 서브스크립트를 재정의하는 것을 방지할 수 있다. 재정의를 방지하려면 메소드, 프로퍼티, 서브스크립트의 키워드 전에 final 수정자를 작성한다 (final var, final func, final class fun
fianl 키워드를 사용하여 실수로 메소드, 프로퍼티, 서브스크립트를 재정의하는 것을 방지할 수 있다. 재정의를 방지하려면 메소드, 프로퍼티, 서브스크립트의 키워드 전에 final 수정자를 작성한다 (final var, final func, final class fun
타입의 저장된 프로퍼티에 초기값을 설정하고 초기 설정을 수행한다.초기화 (Initialization)는 인스턴스의 클래스, 구조체, 또는 열거형을 사용하기 위해 준비하는 단계이다. 이 단계에는 인스턴스의 저장된 프로퍼티에 초기값을 설정하고 새로운 인스턴스가 사용할 준비