내일배움캠프 앱개발 iOS 파트 사전캠프를 시작했다.
캠프 시작일이 달라 개인 진도가 다르기 때문에 본캠프 전까지는 개인적으로 데일리 루틴 및 미션 수행을 진행하게 되었다.
나는 아직 HRD 수강신청 허가가 나지 않아 사이트 강의를 들을 수 없는 상태.
그래서 다른 세 가지 자료 및 활용해 공부를 진행했다.
첫 번째, 인프런 강의
두 번째, 유튜브 강의
세 번째, 캠프에서 제공해 준 Swift 선행 학습 자료
1.인프런 강의
[개발하는 정대리 스위프트 기초 문법]
Section 0
개발레벨 0에서 1000 가기
- 일단 모르는 걸 적는다
- 검색하는 능력 키우기
- 주변 사람들의 뜨거운 관심 무시하기
구글링 하는 법
1. 구글링 하는 이유?
"Self taught developer"
검색 > 정보 탐색 > 습득
- 구글링 하는 방법
a. 단어 단위로 검색: [플랫폼][언어] [기능 or 배울 것]
b. 최신순으로 보기
c. 댓글까지 디테일 하게 보기 (해결책에 대한 평가 or 피드백 확인)
d. 공식문서(스택오버플로우, 미디엄, 깃) 확인 (가장 정확한 자료 & 심화 학습 가능)
e. 깃허브 참조
f. Awesome [iOS]
iOS 개발자 준비
1. 회사에서 요구하는 인재와 내가 갖춘 것 일치해야 한다.
2. 기술 블로그 운영하기
3. 어플 만들고 출시
4. 애플 휴먼 인터페이스 디자인 (벗어나지 않게 원칙/지침 알아두고 디자인)
여기까지 듣고 기초 문법-조건문으로 넘어갔는데,
개발에 대해 공부해본 적이 없다보니 머리에 하나도 들어오지 않더라..!
그래서 차근차근 공부하기 위해 개발에 사용하는 기본 용어들부터 알아보기로 했다.
유튜브에 개발 용어를 검색해 듣기 시작했다.
2.유튜브 강의
[기본 개발 용어 알아보기 - 얄팍한 코딩사전]
https://www.youtube.com/watch?v=GYmuQJiPeM4&t=613s
기본 개발 용어
디버깅
- 소프트웨어에 발생하는 문제의 원인 찾는 것
- 개발 과정에서 계속해서 이루어지는 것으로 “개발 중”인 상태를 나타내는 의미로 쓰기도 함
- 프로그램 에러 원인?
- 코드 오타
- 문법 오류
- 논리적으로 설계 잘못
- 코드가 실행될 컴퓨터와 안맞음
- 예상하지 못한 데이터가 일으키는 문제 등
- 프로그램 복잡해질 수록 디버깅 하는 방식 다양해짐
- 코드 살펴 보며 규격 및 메커니즘 오류 살펴보기
- 코드 실행해보고 단계마다 진행과정 살펴보고 오류 발생 지점 확인
- 디버깅을 도와주는 코딩 툴
- Visual Studio, Eclipse, IntelliJ 등
컴파일러 vs 인터프리터- Compile 컴파일
개발자가 작성한 프로그래밍 코드를 출시 전에 컴퓨터 언어로 번역- Interpreter 인터프리터 (=Script 스크립트)
실행할 때마다 실시간으로 컴퓨터 언어 번역
빌드- 개발자의 편의에 맞춰 나눠져 있는 파일과 폴더들(개발자가 직접 작성한 코드들, 라이브러리-다른 곳에서 작성한 코드들, 이미지, 기타 소프트웨어에 필요한 피일들)을 다른 형태로 변형/압축하여 내보내는 것
- 목적, 이유?
- 사용자가 바로 실행할 수 있는 파일로 제공하기 위해서
- 압축해서 전체 크기 줄이기 위해
- 다른 사람들이 알아보지 못하게 난독화 하기 위해
- 컴파일 언어로 만든 소프웨어는 빌드에 컴파일 작업이 포함되어 있음
- 형태
- 파일 하나로 압축
- 많은 파일 적은 수의 파일로 정리
- 파일의 형식 및 내용만 바뀌기
배포- 코딩해서 빌드한 결과물 사용자에게 전달하는 과정
환경 변수- 환경=소프트웨어가 동작하는 공간
- 변수=소프트웨어가 동작하는 공간에서 지정된 값
- 용도
- 환경 안의 프로그램 위치 찾아서 실행할 수 있도록 입력
- 각 환경의 조건마다 어떤 동작을 시행할 지, 어떻게 시행할 지 입력 (ex. dev 개발용, prod 배포용 구분해서 코드 나타나도록)
- 코드에 보안 요소들이 직접 노출 되지 않도록 환경변수로 작성
- 다양한 용도로 각 환경마다의 값을 지정할 때 사용되는 것이 환경 변수!
라이브러리 vs 프레임워크
"집"
라이브러리=자재들
프레임워크= 기본 골격, 조립키트- 라이브러리
- 특정 기능들이 함수나 클래스 형태로 공개되어 이를 가져다가 내 소프트웨어에 붙여넣어 사용할 수 있는 것
- 어떤 소프트웨어든 필요 시 사용할 수 있도록 모듈화 된 코드 또는 그 묶음
- 프레임워크
- 소프트웨어의 기초 설계 프로그래밍 되어 있고 이를 다운 받아 그 위에 덧붙여 원하는 프로그램을 만드는 것
- 스프링, 장고, .NET, 라라벨, Express, Vue 들이 모두 프레임워크
웹 프로그래밍 과정
특정 언어 공부 → 그 언어로 돌아가는 프레임워크 정해 사용법 익힘 → 제품 개발(필요한 라이브러리 찾아 활용) → 소프트웨어 완성
기본 용어들 습득 후에는
캠프에서 제공해준 Swift 문법 학습 자료를 보며
1. Swift 언어가 무엇인지?
2. Swift의 기본 문법
공부를 진행했다.
3.Swift
CH01. 애플의 새로운 언어, 스위프트
2014 Objective-C 대체하는 New 언어, Swift 발표
2015 앱 개발 플랫폼으로 사용하기 충분한 언어로 자리 잡음
1.1 스위프트 언어의 탄생과 배경
1. 객체지향형 C언어
2. 앱 개발자들이 기능적으로 다양한 종류 앱 만들 수 있도록
코드 최적화, 메모리 관리, 성능 관리 등
기술 경험 기반 개발 이슈 시스템 전담하여
개발자들의 부담 덜어주고자 만들어진 언어 플랫폼
3. 개발에 갓 입문하는 사람들도 무리 없이 사용할 수 있는 언어
4. 인터랙티브 플레이그라운드
-직관적 인터페이스
-코드 작성 후 바로 결과 확인 가능한 편집기
1.2 스위프트 언어의 특징
1. 개발 생산성과 앱 성능 모두 만족할 수 있을 만한 결과 가져오는 언어
2. 정적 바인딩 언어
3. 데이터 타입 구분 엄격
-선언된 변수, 상수는 컴파일 단계에서 데이터 타입 미리 정의 되어 있어야 함
-변수의 데이터 타입 정의 후에는 다른 타입으로 변경 불가
-컴파일러는 타임에 맞지 않는 데이터가 변수에 대입 되는 것 사전에 차단해 안정성 높일 수 있음
4. 네임스페이스 사용하여 필요한 객체 참조, 프로젝트 전체가 네임 스페이스의 범위로 지정되기 때문에 같은 프로젝트 내에 작성된 개체들은 반입 과정 없이 참조 가능
1.2.1 스위프트 언어에서 차용하고 있는 주요 기능들
a. 딕셔너리(해시 테이블) - 자바 스크립트, 파이썬
-대괄호 구문 이용해 값 배열, 문자열 입력 받음 → 해시 테이블 역할
-애플에서는 이것을 딕셔너리(Dictionaries)라고 부름
-초기화 할 수 있는 구문 제공
-ex)
var airports = String : String?
airports["ICN"] = "Inchon International Airport"
// If close "Inchon International Airport", then delete it"
airports["ICN"] = nil
b. 데이터 타입 추론 - 함수형 프로그래밍 언어
-최근의 컴파일러들 = 데이터로부터 스스로 형식 추론 가능
-컴파일러가 변수에 알아서 데이터 형식 지정
-스위프트 컴파일러의 발전: 데이터 타입 강제하지만 데이터 타입 생략할 수 있도록
c. 데이터 구조체 타입 선언 - C#과 자바
-제네릭 타입은 ‘<’와 ‘>’ 기호 이용해 데이터 구조체에 저장될 형식 지정 및 데이터 구조체에 저장될 타입 컴파일러에게 미리 제공
-ex)
var namesOfIntegers = Dictionary<Int, String>()
// namesOfIntegers is an empty Dictionary<Int, String>
d. 문자열 템플릿 - 콜드 퓨전, JSP, 파이썬 등
-변수값을 문자열 템플릿에 삽입하는 기능
-스위프트는 역슬래시와 소괄호 작성 → 그 안에 평가할 식, 변수 넣어 출력하는 템플릿 시스템
-ex)
let apples = 3
let oranges = 5
let appleSummary = "I have (apples) apples"
let fruitSummary = "I have (apples + oranges) piece of fruit."
e. 선택 사항이 세미콜론 - 자바스크립트와 파이썬
-세미콜론(;) (=한 행의 구문이 끝났음을 알려주는 간편한 방법)
-스위프트에서는 세미콜론이 선택 사항
-구문을 한 라인으로 묶을 때는 필요하지만 구문을 개별 라인으로 작성할 때는 필수가 아님
f. 프로토콜(인터페이스) - 자바와 C#
-인터페이스=클래스가 정의에 부합하기 위해 제공해야 하는 모든 함수에 대한 구조를 정의하는 기본 클래스
-스위프트에서는 이를 ‘프로토콜(Protocol)’이라는 용어로 사용
-ex)
protocol ExampleProtocol {
var simpleDescription : String { get }
mutating func adjust()
}
g. 튜플(Tuple) - 리스프와 파이썬
-함수나 메소드에서 두 개 이상의 값을 반환해야 하는 경우
-스위프트는 메소드에서 반환되는 N개의 값과 여기 바인딩 되는 N개의 변수 맞추기 위한 명시적 구문 제공하는 방식 따라 튜플 지원
h. 자동참조(가비지 콜렉터 비슷) - 자바, C#, 오브젝티브-C
-가비지 콜렉터(=메모리 탐색하면서 더는 사용되지 않는 메모리 영역 회수하는 자동 루틴=GC)
-가비지 콜렉터 때문에 프로그램 멈추는 현상 발생하기도 함
-스위프트는 자동 참조 카운트(.ARC - Auto Referening Counter) 사용
i. 부호 있는 정수와 부호 없는 정수 - C#과 오브젝티브-C
-스위프트에서는 1,2,4,8 바이트의 부호 없는 정수와 부호 있는 정수 제공
j. 클로저(Closure) - 리스프와 스킴에서 자바스크립트까지
-스위프트에서는 클로저(소량의 코드 묶어서 함수처럼 전달) 제공하고 함수를 1급 객체로 간주하고 인자값으로 함수 자체를 전달하는 기능 제공
k. 멀티 라인 쿼우팅(Multi-Line Quoting)
-큰따옴표를 세 개 겹친 “””로 문자열의 시작과 끝을 나타내는 방식
-여러 줄의 문자열 간편하게 입력 가능( 줄바꿈 문자(’\n’) 넣지 않아도 됨)
-ex)
let query = """
SELET member_id, member_name, member_level, nick_name
FROM member
WHERE login_id = ? AND password = ?
"""
1.2.2 구조적 특징
1. 빠름(Fast)
애플, 고성능 앱 개발을 위해 LLVM 컴파일러 사용
이 컴파일러에서 제공하는 코드 최적화기 사용해 소스 컴파일과 최적화 수행해 스위프트 성능 극대화
2. 설계에 의한 안정성(Safety by Design)
- 변수 상수 반드시 선언 후 사용하도록 강제
- 타입 추론 기능에 의해 변수 초기값 기준으로 타입 정의해 데이터 입력 안정성 높임
- 배열과 정소는 오버플로우에 대비하여 확인
- 개발자가 정의하지 않은 배열 값에 승인하지 않은 값들 주입될 수 없도록 Array bounds check 기능 추가
- 포인터에 직접 접근하는 시도 차단하고 클래스 통해 간접적으로만 레퍼런스 참조할 수 있도록 제한
- ARC(Auto Referencing Counter) 이용해 자동으로 메모리 관리해 메모리 누수 현상에 대한 안정성 높임
c. 현대적(Modern)
- 파이썬 언어에 기반을 둔 읽고 쓰기 쉬운 문법
- 코드 작성, 디버깅, 유지보수 과정에서 적은 양의 코드 사용
- 손쉬운 유지 보수 위해 헤더 파일 사용 대신 메인 파일에 통합하여 코드 작성할 수 있도록 설계
d. 상호반응(Interactive)
- 플레이그라운드(Playground) 편집기 제공
- 스위프트 코드 작성하고 그 결과와 메모리 스택 등의 정보 즉시 확인 가능해 상호반응적 코드 작성 가능, 디버깅 쉬움
e. 완전한 플랫폼(Complete Platform)
- 코코아 프레임워크나 코코아터치 프레임워크의 모든 API 호출 가능
- 오브젝티브-C로 작성되었던 핵심 프레임워크의 모든 라인 스위프트 언어를 이용여 거의 모두 재작성 되었음
- 스위프트만으로 하나의 완전한 앱 만들 수 있다는 의미!
f. 통합(Unified)
- C언어나 오브젝티브-C 언어 완전히 대체 가능
- 객체 지향 언어의 특성 모두 제공, 저수준 언어의 기본 요소들(자료형, 흐름 제어, 연산자)도 모두 포함
- 하나의 앱 프로젝트에서 오브젝티브-C와 함께 사용할 수 있도록 통합성 지님
1.3 오브젝티브-C vs 스위프트
두 언어 사이의 공통점과 차이점?
1. 파일 통합
- 오브젝티브-C
C를 기초로 만들어진 언어, 헤더 파일과 소스 파일로 구분(선언과 구현 분리)
- 스위프트
헤더파일과 소스파일 모두 .swift 확장자를 갖는 파일 하나로 통합
변수 상수, 각종 객체의 형식에 대한 선언과 실질적 내용 구현 모두 하나의 파일에서 이루어짐
2. 클래스의 정의와 구현
- 오브젝티브-C
헤더 파일에 클래스의 인터페이스의 정의,
스스 파일에는 정의된 인터페이스 구현
클래스 선언 시 반드시 상위 클래스 상속 받아야함
상속 받을 필요 없을 때도 최상위 클래스인 NSObject 상속 받아야함
- 스위프트
클래스의 인터페이스 정의 없이 바로 클래스 구현
아무것도 상속 받지 않아도 됨
3. 상속
- 오브젝티브-C
다중 상속 지원 X
프로토콜(Protocol) 정의해 클래스 객체가 준수해야 할 형식 제공
카테고리(Category) 개념 통해 상속 대신 기존 객체 자체 직접 확장 가능
단, 클래스 객체만 확장 가능
- 스위프트
Extentsion 제공 (=오브젝티브-C의 카테고리 개념=기존 객체 직접 확장)
단, 스위프트의 Extension은 클래스, 구조체, 프로토콜 등 대부분 객체에 적용 가능
4. 범용 타입
- 오브젝티브-C
모든 데이터 타입 저장할 수 있는 범용 타입 객체 필요할 때가 있음
이 때, id 타입 제공
모든 타입 데이터 저장 가능, 호완성만 보장 되면 어떤 데이터 타입으로든 변환 가능
- 스위프트
동일한 코코아 프레임 워크, 코코아 터치 프레임 워크 사용하기 때문에 오브젝티브-X의 id 타입에 대응하는 범용 타입 객체 필요
Any 타입, AnyObject 클래스 제공
Any=구조체, 클래스, 열거형, 함수 등 스위프트에서 제공하는 모든 타입의 값 저장할 수 있는 타입
Any Object=클래스에 한해 범용으로 사용가능한 타입
5. 메소드 호출
- 오브젝티브-C
스몰토크 문법 차용한 결과인 메소드 호출을 메시지 전송 방법으로 처리
객체에 메시지 보내 필요한 기능 처리
객체와 매시지는 공백 통해 연결, 대괄호 사용해 메시지 전송 단위 감싸서 구분
- 스위프트
일반적인 객차지향에서의 메소드 호출 방식 따름
객체와 메시지는 점(.)을 통해 연결, 호출 단위 감싸는 구분자는 사용X
CH03. 기본 문법: 이것이 바로 스위프트
3.1 스위프트 기초 문법
1. 헤더 파일을 작성할 필요가 없다
전처리를 위한 헤더 파일 필요하지 않음
헤더 파일 소스 파일 통합된 하나의 *.swift 파일에서 필요한 내용 자유롭게 정의하고 사용
클래스, 구조체 선언 때 정의(Interface)와 구현(Implemaentation) 통합해서 작성
2. 스위프트는 대소문자를 구분한다
변수나 상수 이름에서 대소문자 구분
함수, 메소드, 클래스, 구조체 등에 이름 정할 때 관례 지켜주면 좋다
- 함수와 메소드, 인스턴스명의 첫 글자는 소문자로
- 클래스와 구조체, 프로토콜 등 객체의 첫 글자는 대문자로
3. 구문 끝의 세미콜론은 생략 가능하다
4. 엔트리 포인트(시작점)로 사용되는 main() 함수가 없다
대신 @UIApplicationMain 어노테이션을 사용하여 앱을 시작하는 객체 지정
하나의 앱에서 @UIApplicationMain 어노테이션이 붙은 객체는 단 하나뿐이어야 함
5. 문자열뿐만 아니라 문자도 큰따옴표를 사용한다
문자열과 문자 모두 큰따옴표를 사용하기 때문에 구분할 수 없다
문자 저장하는 변수, 상수의 타입은 반드시 Character 타입으로 명시해주어야 한다.
6. import 키워드를 사용하지만, 라이브러리와 프레임워크의 참조 용도이다
import 구문은 프레임워크나 외부 라이브러리를 사용하기 위한 목적으로만 사용됨
프로젝트 내에 선언된 다른 객체 호출할 때는 import 구문 없이도 참조할 수 있도록 프로젝트 범위의 네임스페이스가 제공되기 때문
7. C나 자바처럼 한 줄 구석, 여러 줄 주석 처리 방식을 모두 사용할 수 있다
주석=프로그래밍 과정에서 중요한 내용 기록, 잊지 않아야 할 부분 상기, 코드 흐름 부분별로 설명하기 위해 추가하는 택스트
한 줄용 주석( // 사용), 여러 줄용 주석( /~/ 사용)으로 나뉨
주석 내부에 다시 주석 포함 가능
8. try ~ catch 방식의 오류 처리 지원한다
함수나 메소드가 리턴값 또는 매개변수를 이용하지 않고 외부로 오류를 직접 던질 수 있도록 하는 기능
던져진 오류를 try ~ catch 구문 사용해 잡아낼 수 있음
3.2 변수와 상수
1. 변수와 상수?
- 값을 저장한, 혹은 저장할 메모리 주소값을 이름으로 연결해 놓은 것
메모리 주소에 해당하는 공간에 손쉽게 값을 저장하거나 꺼낼 수 있음
(=변수와 상수에 값을 저장한다)
- 변수
필요에 따라 저장된 값을 다른 값으로 변경 가능 → 변하는 값 저장
- 상수
한 번 저장된 값을 다른 값으로 변경할 수 없음 → 변하지 않을 값 저장
2. 변수 값 변경
처음 입력한 값과 동일한 타입에 한해서만 값 변경 가능
3. 상수의 필요성
실수로 값이 변경되는 일 방지, 값의 성격 명확히 분류되어 관리 용이
4. 변수와 상수 사용 기준 모호하다면 일단 변수로 작성
변수에 할당된 후 소스 코드에서 변경되지 않은 값 있으면 컴파일러가 상수로 바꾸도록 조언해줌
3.2.1 변수와 상수를 정의하는 방법
1. 정의
- 변수 선언: var + 변수명
var year = 1999 // 1. 정수형 변수
var message = "Hello, World" // 2. 문자열 변수
- 한 번 정해진 타입은 바꿀 수 없음
- 변수의 타입은 대부분 맨 처음에 대입 된 값에 따라 정해짐
- 초기화(Initialize)
var 키워드로 선언된 변수에 처음으로 값을 대입하는 과정
- 컴파일러는 변수에 대입될 값 검토해 가장 적절한 타입 추론 → 그에 맞는 메모리 공간 확보 → 값 저장 → 변수 사용 가능
- 상수 선언: let + 상수명
let birthYear = 1980 // 3. 정수형 상수
let welcomeMessage = "안녕하세요" 4. 문자열 상수
3.2.2 변수와 상수의 이름 정의하기
1. 규칙
- 알파벳, 한글 자음 및 모음, 아라비아 숫자 사용 가능
특수 기호, 한자, 이미지용 바이너리코드 사용 가능
but 영어, 숫자, 그리고 밑줄 이외에 다른 문자, 기호 사용 X
- 연산자와 혼동할 수 있는 [+,-,*,/] 및 공백은 변수, 상수명에 사용X
단, _(언더바)는 사용 가능
- // 연산자와 공백은 변수나 상수명에 들어가면 안 됨
var abc+t = "abc plus t" // 값을 더하는 연산자라서 사용 불가
var abc-t = "abc minus t" // 값을 빼는 연산자라서 사용 불가
var abc t = "abc space t" // 변수명이 어디까지인지 구분할 수 없어서 사용 불가
- // 언더바는 예외적으로 사용 가능
var abc_t = "abc underbar t"
- 스위프트에서 예약어나 키워드로 등록되어 있는 단어는 변수나 상수명에 사용X
단, 대소문자를 바꾸어 사용하는 것은 가능
- var class = 1 // (x), 'class'는 클래스 정의를 위한 키워드
var enum = 2 // (x), 'enum'은 열거형 정의를 위한 키워드
var struct = 3 // (x), 'struct'는 구조체 정의를 위한 키워드
var extension = 4 // (x), 'extension'은 확장을 위한 키워드
var protocol = 5 // (x), 'protocol'은 프로토콜 정의를 위한 키워드
var as = 6 // (x), 'as' 는 타입 캐스팅을 위한 키워드
- // cf) 허용되는 경우
var Class = 1 // (O)
var Enum = 2 // (O)
var Struct = 3 // (O)
var Extension = 4 // (O)
var Protocol = 5 // (O)
var As = 6 // (O)
- 변수, 상수명의 첫 번째 자리에 숫자가 올 수 없음
- // 첫 번째 자리에는 숫자를 사용할 수 없음
var 1abc = 123 // (X)
var 2bcd = 345 // (X)
- // 두 번째 자리부터는 숫자 사용 가능
var a123bc = 123
var b2cd = 345
3.3 자료형
1. 서로 다른 타입의 데이터 연산
실수와 정수 일부 호환 가능
일반적으로 정수를 실수로 변환해 연산 처리
(정수 → 실수 값 손실X, 실수 → 정수 값 손실O)
2. 문자와 숫자의 결합
스위프트에서는 문자 숫자 바로 결합하면 오류 처리
3. 값의 종류 일치해야 그에 맞는 처리가 가능
변수, 상수에 할당되는 값은 모두 타입 구분이 가능하다는 전제
타입 별로 메모리 공간의 크기가 달라져야 함
4. 스위프트에서의 변수, 상수 정의
- 데이터 타입(Data Type)
=자료형
=숫자, 문자, 문자열, 논리(참/거짓) 등 몇 가지 종류 타임 지정하고 맞추어 사용하는 것
- 변수, 상수는 일반적으로 처음 입력되는 값에 맞는 자료형으로 초기화 됨, 이후로는 해당 자료형에 호환되는 형식의 값만 지정 가능, 그렇지 않을 경우 오류 발생
3.3.1 기본 자료형
1. Int
- 정수, Integer 줄임말
- 부호 있는(숫자 앞에 +나 - 붙일 수 있음) 정수값 저장하는 데 사용
- but 저장할 수 있는 정수값 범위에 제한 있음 → 컴퓨터 CPU 사용 따라 결정
- ex) 8bit CPU일 경우, 2^8인 256개 값 저장 가능 → 정수 범위 환산 시 -128 ~ 127
- Int8 => 127 ~ -127
Int16 => 32,767 ~ -32,768
Int32 => 2,147,483,647 ~ - 2,147,483,648
Int64 => 9,223,372,036,854,775,807 ~ - 9,223,372,036,854,775,808
b. UInt
- Unsigned Integer 줄임말
- 부호가 없는 정수
- 양수만 저장 가능
- 0을 포함한 우리가 일반적으로 자연수라고 부르는 범위의 정수 저장 가능
- UInt8 => 0 ~ 256
Int16 => 0 ~ 65,535
Int32 => 0 ~ 4,294,967,295
Int64 => 0 ~ 18,446,744,073,709,551,615
c. Double & Float
- 실수값 저장 가능
- Double 타입
- 64bit 부동 소수점 자료형
- Float 타입보다 더 넓은 범위의 소수점 아래 값을 저장
- 특별히 매우 정확해야 하는 부동 소수점 값 or 매우 넓은 범위의 실수값 저장할 때 사용
- 소수점 아래 15~16 자리 값에 대한 정확도 보장
- 메모리 차지 크기 큼
- Float 타입
- 32bit 부동 소수점 자료형
- 소수점 아래 7~8 자리 값을 정확하게 저장
d. Bool
- true/false 두 가지 종류의 값만 가질 수 있는 자료형
- 주로 논리값 저장
- // Bool 타입 저장 변수
var close = true
// Bool 타입 저장 상수
let success = true
let fail = false
e. String
- Int와 더불어 프로그래밍에서 가장 많이 사용되는 자료형
- 여러 글자로 이루어진 문자열 저장 가능한 집단 자료형
- 데이터 값 표현 시 큰따옴표 사용
- // String 타입 저장 변수
var projectname = "iOS study"
// String 타입 저장 상수
let language = "swift"
d. Character
- 한 개의 문자를 저장할 수 있는 단일 자료형
- String 타입에 저장된 문자열 하나씩 분해하면 Character 타입
- 데이터 값 표현 시 큰따옴표 사용
- // Character 타입 저장 변수
var firstLetter : Character = "s"
// Character 타입 저장 상수
let lastLetter : Character = "t"
3.3.2 타입 추론과 타입 어노테이션
1. 타입 어노테이션(Type annotation)
- 변수나 상수를 선언할 때 그 타입을 명시적으로 선언해 줌으로써 어떤 타입의 값이 저장될 것인지를 컴파일러에 직접 알려주는 문법
- 변수나 상수명 뒤에 콜론(:)을 붙이고, 이어서 저장될 값의 타입 작성해주면 됨
- var year : Int // 명시적인 Int 타입
var name : String // 명시적인 String 타입
var firstChar : Character // 명시적인 Character 타입
var distance : Double // 명시적인 Double 타입
var pi : Float // 명시적인 Float 타입
var flag : Bool // 명시적인 Bool 타입
2. 타입 추론
- 설계에 의한 안정성(Safety by design) 중 하나
- 변수나 상수를 초기화할 때 입력된 값 분석해 변수에 적절한 타입을 컴파일러가 스스로 추론하는 기능
3. example
- // 타입을 명시한 변수 선언
var name : String = "홍길동"
var year : Int = 1999
- // 타입을 명시한 상수 선언
var firstName : String = "이"
var birthYear : Int = 1980
- // 타입을 명시하지 않은 변수 선언
var name = "홍길동"
var year = 1999
- // 타입을 명시하지 않은 상수 선언
let firstName = "미"
let birthYear = 1980
4. 반드시 타입을 명시적으로 선언해야 하는 경우
- 선언과 초기화를 분리할 경우
- 타입 추론으로 얻어지는 타입이 아닌 다른 타입을 직접 지정할 필요가 있을 때
- // 선언. + 타입 어노테이션
var year : Int
// 초기화
year = 1999
// Int 타입으로 정의
var temper1 = 3
// Float 타입으로 정의
var temper2 : Float = 3
var stringValue = "문자열" // String 타입
var charValue : Character = "문" // Character 타입
var cValue : Character = "C" ;// Character 타입
var sValue = "C" // String
3.3.3 타입이 다른 변수끼리의 결합
1. 결합 방법
- 서로 다른 변수나 상수의 결합
스위프트에서는 허용되지 않음
- 변수의 값 다른 타입으로 변경
- 바꾸고자 하는 타입의 새로운 객체(변수,상수) 명시적으로 생성
- 새로운 객체 만드는 방법?
괄호 안에 원하는 정수값 넣으면 문자열 만들어지는 형식으로 지원(새로운 문자열 인스턴스를 만드는 것)
- 기존 변수에 영향 없이 새로 생성
- 문자열을 정수형이나 실수형으로 바꾸는 경우
- Int() 구문 사용
- 새로운 정수 인스턴스 만드는 것
b. 문자열 템플릿
- 변수나 상수의 값을 문자열 속에 포함시키는 방법
- 문자열이 아닌 값(정수,실수 등)도 변환 과정 없이 사용 가능
- 사용 방식
문자열에서 원하는 위치에 백슬래시() 입력,
포함하려는 값이 들어있는 변수나 상수 괄호로 감싸기- ex)
- // 상수와 변수를 정의
let name = "꼼꼼한 재은씨"
let year = 2014
let month = 10
let day = 1
// 문자열 템플릿을 사용한 문자열 결합
let profile = "(name)는 (year)년 (month)월 (day)일에 출간되었습니다."
print(profile)
꼼꼼한 재은씨는 2014년 10월 1일에 출간되었습니다.- 괄호 내부 값 연산 가능
- // 상수 정의
let apple = 3
let banana = 2
let oragne = 4
// 출력할 구문을 문자열 템플릿으로 구성
let desc = "과일은 총 (apple+banana+oragne) 개입니다"
print(desc)
과일은 총 9 개입니다
3.3.4 스위프트 4에서의 문자열 처리
스위프트 4에서 추가된 새로운 쿼우팅 문법,
트리플 쿼우팅(Triple Quoting) 또는 멀티 라인 문자열(Multi-line String),
연속한 세 개의 따옴표를 이용하여 여러 줄에 걸친 긴 문자열을 쉽게 작성하는 문법
1. 쿼우팅(Quaoting)이란?
- 문자열을 따옴표로 묶어 표시하는 방법
- 프로그래밍 코드 및 쉘 커맨드에서 사용
- 프로그래밍 코드에서의 쿼우팅은 대부분 문자열 정의 및 표현에 사용
2. 멀티 라인 스트링
- 큰따옴표 세 개 연속으로 붙여 쿼우팅 영역의 시작과 끝 정의(””” ~ “””) 그 내부에서 자유롭게 작성된 문자열을 그대로 실제 내용으로 처리하는 방식
- 띄어쓰기, 줄바꿈 등이 작성된 그대로 반영
- 주의사항
- 시작 쿼우팅 다음에 반드시 줄바꿈 후 값을 작성
쿼우팅 시작 라인에서는 쿼우팅 이후 어떤 값도 들어가서는 안됨
- 멀티라인 스트링 입력 끝낼 때 반드시 줄바꿈 후 쿼우팅 처리
쿼우팅 종료 라인에서는 쿼우팅 앞에 어떤 값도 들어갈 수 없음
- 멀티라인 쿼우팅 내부에 특수문자(\n, \t 등)이 들어가면 문자 그대로 출력
- ex)
let poem = """
계절이 지나가는 하늘에는
가을로 가득 차 있습니다.
나는 아무 걱정도 없이 가슴 속의 별들을
다 헬 듯 합니다
"""
3.4 연산자
3.4.1 산술 연산자
1.사칙 연산에 대한 연산자들
2.스위프트에서는 산술 연산자 6개를 지원함
3.4.2 비교 연산자
1.연산의 결과가 항상 true 또는 false 두 가지 중 하나로 나타남
2.연산 결과가 항상 Bool 타입의 값으로 표시됨
3.4.3 논리 연산자
1.연산 결과를 ture나 false로 표시, 값의 논리 비교를 통해 연산 수행
2.연산 대상인 피연산자들은 모두 true 또는 false 값을 가지는 Bool 타입이어야 함
3.ex)
// && 연산자 테스트
true && true // = true
false && false // = false
true && false // = false
false && true // = false
// || 연산자 테스트
true || true // = true
false || false // = false
true || false // = true
false || true // = true
4.논리 연산자와 비교 연산자의 결합
// Int타입 상수 선언
let a = 10
let b = 5
let c = 2
// 비교 연산자와 함께 사용하는 경우
a > b && b > c // true && true = true
a == b && a > b // false && true = false
a == b || a > b // false || true = true
// 비교, 산술 연산자와 함께 사용하는 경우
a - b > b - c && b == 0 // true && false = false
a + b > c || c > 0 // true || true = true
3.4.4 범위 연산자
1.범위 연산자(range operator), 주어진 값 사이의 범위를 일정한 정수 간격으로 표현하는 연산자
2.닫힌 범위 연산자, 반 닫힌 연산자
3.닫힌 범위 연산자
- 주어진 피연산자 a,b를 포함하는 범위 나타내는 연산자
- 주어진 피연산자 사이를 세 개의 점으로 표현
- ex) 1 … 5
4.반 닫힌 범위 연산자
- ‘반’=절반, 절반만 닫힌 연산자
- 왼쪽 경계는 포함하되 오른쪽 경계는 포함하지 않는 연산자
- 점 두개와 비교 연산자 ‘<’ 사용해 표현
- ex) 1 .. < 5
5.범위 연산자의 활용
- 닫힌 범위 연산자
for ~ in 구문에서 일정 횟수만큼 반복할 때 사용되는 경우 많음
- 반 닫힌 연산자
배열을 순회할 때 많이 사용
3.4.5 대입 연산자
1.값을 변수에 대입하고자 할 때 사용하는 연산자
2.대입 연산자가 하나만 있어도 되는 경우
대입의 기본, 왼쪽의 객체에 오른쪽의 값을 대입하는 것
3.여러 대입 연산자들이 존재하는 이유
여러 행에 걸쳐 쓰거나 복잡하게 써서 읽기 어려운 소스를 간결하게 하기 위한 목적
이렇게 정리하며 쭉 훑어보는 시간을 가졌다.
꽤 많은 내용이라 코딩 언어 생초보인 나에게는 한 번에 익히기에 벅찬 양이긴하다.
앞으로 문제 해결에 적용하며 사용할 개념들이니 꾸준히 복습하며 익숙해질 수 있도록 하는 시간이 필요할 것 같다! 차근차근 잘 해나가보자 :)