본문 바로가기

수업 정리

88일차 수업정리(iOS - 자료형)

**자바 응용 프로그램(PC, 디바이스에 Embedding 되는 프로그램) 만들기

    => public static void main(String [] args) 메소드를 가진 클래스가 존재해야 함

 

1. eclipse 에서는 마우스 오른쪽을 클릭해서 [Export] - [Java] - [Runnable Jar files]로 내보냄

    =>윈도우 용 프로그램은 유저가 실행, 종료하므로 문제없지만, 콘솔 프로그램은 터미널이 바로 종료될 수 있으므로 입력받는 문장 추가

 

2. 명령어로 실행

    => java -jar 파일경로

 

3. WindowJava.jar 파일을 실행하는 쉘 프로그램을 작성

  1) 터미널에 touch WindowJava.sh : 쉘 파일 생성

 

  2) 터미널에 vi WindowJava.sh : 파일을 편집할 수 있는 vi 편집기로 열림

 

  3) i를 눌러서 삽입모드로 변경

 

  4) 코드를 작성

    - #!/bin/sh

    - java -jar /Users/a30400/Documents/WindowJava.jar

 

  5) 저장

    => esc를 눌러서 명령모드로 빠져 나감

    => :wq! 를 눌러서 저장하고 나감

 

  6) 실행

    => sh WindowJava.sh

 

  7) 파일을 더블클릭해서 실행하기 위해서 확장자 command를 추가

    => mv WindowJava.sh WindowJava.sh.command

 

  8) 파일의 허가모드 변경

    => chmod 777 파일경로

    => 파일을 모든 사용자가 실행하고 읽고, 수정할 수 있도록 변경

        - chmod rwx rwx rwx 파일 경로

        - 첫번째 블럭 - 소유자, 두번째 블럭 - 그룹 사용자, 세번째 블럭 - 기타 사용자

 

**웹 프로그램을 배포

    => war 파일로 압축

    => 프로젝트명이 배포할때 URL이 되고 프로젝트 구조는 무조건 WebContent 디렉토리가 루트 디렉토리

    => test 패키지에 있는 것은 전부 사라짐

    => 웹 호스팅하는 곳에 war 파일을 업로드 해주면 웹 애플리케이션이 실행

    => cafe24에 배포

1.배포할 프로젝트를 war 파일로 생성

 

2.저 파일을 웹 호스팅 업체의 포맷에 맞게 업로드를 해줘야 함

 

**Xcode

    => Mac 운영체제에서 사용하는  IDE

    => Mac 응용프로그램, Apple 모바일 응용 프로그램을 제작할 수 있는 IDE

1. 설치

    => 최신 버전은 AppStore에서 다운로드 받아서 설치

    => 최신 버전이 아닌 경우는 developer.apple.com에서 다운로드

 

2. 실행

    => [finder] - [응용프로그램] - [Xcode]

    => 처음 실행시 Component 업데이트 메시지가 출력

 

3. 설치된 버전 확인

    => [File] - [About Xcode]

    => 스마트폰 애플리케이션은 운영체제 버전이 자주 변경되기 때문에 IDE 버전과 지원하는 운영체제 버전을 확인해야 함

 

4. Xcode에 계정 등록

    => [Xcode] - [Preferences] - [Accounts]에 등록

 

**Swift

    => Apple의 Application 개발 공식 언어 중의 하나

        - Objective-C로도 개발 가능

    => 현재는 2개 언어를 같이 사용할 수 있어야 하는 경우가 많음

        - 이전에 Objective-C로 제작된 소스를 Swift로 변경하는 프로젝트가 많기 때문

    => 이제부터 새로 나오는 API는 Swift로만 제공

        - Objective-C로 작성한 것은 브릿징시 Swift에서 사용 가능

1.특징

    => 스크립트 언어이면서 성능은 C++ 과 거의 비슷

    => 스크립트 언어는 배우기가 쉬운 반면 성능이 떨어지고, C++ 이나 Java 와 같은 객체 지향 언어들은 진입장벽이 높지만 성능이 우수

    => 정적 바인딩 언어: 컴파일하기 전에 데이터의 자료형을 결정하는 것

        - 동적 바인딩 언어: 값이 대입될 때 자료형을 결정하는 것

        - 스위프트는 작성은 동적 바인딩 언어처럼 하지만 정적 바인딩

        - 동적 바인딩 언어는 하나의 변수에 여러 형태의 데이터 대입가능, 정적 바인딩 언어는 변수 생성시 동일한 자료형만 대입가능

    => 프로젝트 전체를 하나의 네임스페이스로 묶어 사용

        - 동일한 프로젝트 안의 내용을 사용할 때 import가 필요 없음

    => 함수형 프로그래밍 언어: 함수를 클래스나 객체 안에 만들지 않고 외부에 별도로 작성이 가능

        - 기능만 필요한 경우 굳이 클래스를 만들지 않고 함수만 만들어서 배포하는 것이 가능

    => 제너릭 사용 가능: 내부 자료형을 미리 지정하지 않고 인스턴스를 생성할 때 설정하는 것

        - 동일한 알고리즘을 사용하는 함수나 클래스를 만들 때 자료형 때문에 별도로 생성하지 않도록 하기 위해서 사용

    => 문자열 템플릿 가능: 문자열 상수 안에 문자열 이나 다른 종류의 변수의 값을 삽입하는 것

        - “I am a \(name)” : I am a name 변수의 값을 추가

    => 줄 단위 실행 - ;은 생략 가능, 하나의 줄에 2개 이상의 명령어를 작성할 때는 ;으로 구분

        - ;은 한 줄에서 하나의 명령을 구분하기 위한 기호(인터프리터 언어는 ;의 기능이 전부 유사 - python, kotlin, javascript, ruby 등)

    => 인터페이스 개념 대신에 protocol을 사용

    => 클래스의 확장 개념인 extension 이 존재

    => 여러 개의 데이터를 묶기 위한 자료형으로 tuple을 제공

    => 부호있는 정수와 부호없는 정수를 지원

        - 이 개념이 없는 언어들은 API에서 임의로 해석을 해서 부호있는 것과 없는 것을 구분

    => 메모리 정리에 ARC(Auto Reference Counting)을 이용

        - 데이터의 참조 횟수를 의미하는 retainCount가 존재

        - 처음 생성되면 retainCount가 1

        - 어떤 데이터를 다른 변수가 참조하면 retainCount가 1증가

        - 참조하는 변수가 없어지면 retainCount가 1감소

        - retainCount가 0이 되면 GarbageCollection이 메모리 정리를 수행

        - 이 개념이 불명확시 애플리케이션 개발에서 메모리 누수(leak) 발생, 메모리 누수가 많이 발생하면 애플리케이션이 자동 종료

    => 다른 언어의 람다와 유사한 Closure를 제공

    => 함수는 1급 객체 : 함수도 하나의 자료형

        - 함수를 변수로 만들거나 변수에 대입할 수 있음

        - 자바나 C#을 제외한 거의 모든 언어는 함수가 1급 객체

        - python, kotlin, swift, ruby등의 스크립트 언어는 문법이 유사

    => 문자와 문자열을 리터럴에서는 구분하지 않음

        - ' '나 " "의 기능이 같음

    => 멀티라인 문자열 지원 : 3번씩 입력 - """ 문자열 """

        - """을 주석으로 착각하면 안됨

    => 기존의 GCC 대신에 LLVM(Low Level Virtual Machine)을 이용하여 컴파일을 하므로 성능이 우수

 

2. Playground

    => 스위프트 문법을 학습하고 모듈 단위 개발을 위하여 Xcode에서 제공하는 프로젝트 종류

    => 실행 프로그램을 만드는 것이 실행프로그램 안에서 동작하는 모듈을 생성(문법 공부시 사용)

    => 프로젝트 생성 : [File] - [New] - [Playground]

 

3. 콘솔 출력

    => print(문자열 상수 또는 문자열 변수)

 

4. 실행 

    => 코드 창의 삼각형 클릭 :  이전에 실행한 내용은 제외하고 수정한 부분만 실행

    => 출력 창의 삼각형 클릭 : 전체를 다시 실행

 

5. 주석

    => 한줄 주석 : //

    => 여러줄 주석 : /* ~ */

    => 서식있는 텍스트 주석 : 문서화를 위해서 사용

        - //: -> 서식있는 한줄 주석  

        - /*: -> 서식 있는 여러줄 주석

    => # : 제목

    => 코드 작성

import UIKit

var str = "Hello, playground"

print(str)
/*:
 #Hello SWIFT
 
for idx in 1...5{
    let y = idx * 10
    
    print(y)
}*/

    => 서식있는 

    =>

 

**문법

1. 작성 규칙

    => main이 없어서 작성한 순서대로 실행

    => entry point(시작지점)를 만들고자 하는 경우 클래스명 위에 @UIApplicationMain이라는 어노테이션 추가

    => 변수 선언시 자료형 미기재시 자료형 추론을 통해 자료형 설정

    => 연산자 앞, 뒤에 공백을 몇개 삽입해도 상관없지만 앞과 뒤가 동일해야 함

    => try ~ catch 지원 : 대다수 클라이언트 프로그램을 만들기 때문에 잘 하지 않는데 최대한 하고, 개발 종료 후, 삭제하는 것이 좋음

    => import는 외부 라이브러리 참조용

 

2. 로그, 출력함수

  1) print

    => 첫번째 파라미터가 가변 파라미터인 경우 여러개 출력하고자 하는 경우 ,로 구분하여 계속 입력

    => terminator 옵션 이용시 구분자를 중간에 넣어서 출력 가능

    => terminator 옵션 이용시 출력 종료후 마지막에 Enter 대신 삽입

  2) NSLog

    => 출력시 날짜와 시간, 파일명 등을 같이 출력

    =>  iOS 앱 개발에서 사용 - Playground에서는 사용하지 않음

  3) debugPrint : 자료형을 구분하여 출력 - 문자열의 경우 따옴표를 하여 출력

  4) dump : 인스턴스의 내용을 출력하고자 할 때 유용

    => 세부 내용까지 같이 출력

  5) 주의

    => 앱 개발 도중 로그 출력 함수 사용시 개발 종료후 전부 삭제하는 것이 좋음

    => 로그 출력도 시스템 자원을 사용하기 때문

  6) 로그 출력 함수의 차이

let frame = CGRect(x: 10, y: 10, width: 100, height: 50)
let label = UILabel(frame: frame)
label.backgroundColor = UIColor.red
label.text = "UI Test"

let name = "steve"
let age = 50

//숫자 데이터는 동일하게 출력
print(age)
debugPrint(age)

//문자열은 print는 그냥 출력
//debugPrint는 자료형을 알수 있게 출력
print(name)
debugPrint(name)

let rect = CGRect(x: 100, y: 30, width: 100, height: 100)
//함수의 결과 출력
print(rect)
//객체의 내용을 출력
dump(rect)

 

3. 데이터 분류

  1) 변경 여부에 따른 분류

    => mutable data :  변경가능한 데이터 - 변수(Variable)

    => immutable data : 변경 불가능한 데이터 - 상수(Constant, Literal)

        - Constant : 개발자가 의도적으로 값을 변경할 수 없도록 만든 이름

        - Literal : 프로그램 작성시 개발자가 직접 입력하는 값

  2) 저장되는 형태에 따른 분류

    => value type : 1개의 값을 저장하는 자료형

    => reference type : 대표하는 값의 참조(위치)를 저장하는 자료형

  3) 저장하는 데이터의 개수에 따른 분류

    => scala Type : 1개의 데이터 저장

        - 보통은 Value Type : 이름이 데이터를 의미

    => Vector Type : 0개 이상의 데이터 저장

        - reference Type : 이름은 데이터의 모임의 참조

  4) 데이터의 모양에 따른 분류

    => 정형 데이터 : 데이터의 모양이 정해진 구조 - 테이블 구조의 데이터

    => 비정형 데이터 : 데이터의 모양이 일정하지 않은 구조 - 텍스트, 음성 등의 데이터

    => 반정형 데이터 : 비정형의 텍스트지만 정형의 영태로 변환가능한 데이터

        - json, xml 문자열

  5) 언어, 책마다 분류법이 다양

    => 최근에는 value type, reference type으로 구분은 거의 하지 않음

 

4. swift 의 데이터명 생성 방법

  1) 값의 변경 여부에 따라 var와 let으로 구분

    - var : 값을 변경 가능

    - let : 값을 변경하지 못함

    => var로 선언 후 값 미변경시 경고 발생(let으로 설정하도록)

  2) null 포함 여부에 따라 Optional과 Optional이 아닌 자료형으로 나눔

  3) 묵시적 자료형, 명시적 자료형

    => 묵시적 자료형 : 자료형을 기재하지 않는 방식으로 자료형이 자동으로 설정

    => 명시적 자료형 : 자료형을 기재하는 방식

  4) Swift는 정적 바인딩

    => 정적 바인딩은 데이터를 대입하기 전에 자료형을 결정

    => 자료형을 미리 설정하고 컴파일시 잘못된 데이터 입력시 실행하지 않음

  5) 변수 명명 규칙

    => 영문자, 숫자, 한글, 한자, 특문, 이미지용 바이너리 모두 가능

    => 예약어는 변수명으로 사용할 수 없으나, 대소문자를 변경하거나 작은따옴표로 감싸면 예약어도 변수명으로 가능

    => 연산자는 불가

    => 숫자로 시작할 수 없고, _외의 특수문자도 안됨

    => 중간에 공백은 안됨

  6) 변수 생성(var 이름 : 자료형 = 값)

    =>  자료형 생략시 자료형 추론으로 자료형 설정

    => 자료형 생략 상태에서 값 생략시 에러

    => 값을 생략하거나 null을 대입하려면 자료형이 Optional이어야 함

    => Swift에서는 null대신 nil이라고 함(자료구조와 동일)

    => 변수명은 하나의 영역에서는 한번만 생성

    => 변수에 값 대입시 변수명 = 값의 형태

    => 카멜 표기법

        - 클래스와 인터페이스(프로토콜)명은 대문자, 변수, 메소드명은 소문자로 시작, 상수는 모두 대문자로 표기

        - 2개 단어이상으로 만들어진 경우 2번째 단어의 첫글자는 대문자로 시작

    => 헝가리안 표기법

        - 변수 명 앞의 자료형과 범위를 표기하는 방식

        - boolean = b, int = n, float = f, char = c, String = str을 붙여서 생성

        - 지역변수 = _, 인스턴스변수 = m, 전역변수 = g

        - m_str : 인스턴스 변수이고 문자열 변수

    => iOS 11, swift 4 버전까지는 대부분 나열형 상수가 대문자로 만들어져있었으나 그 이후에는 대부분 소문자로 변경

  7) 자료형

    => int : 정수 기준형 

        - int8, int16, int32, int64 : 부호 있는 정수

        - Uint8, Uint16, Uint32, Uint64 : 부호 없는 정수

        - 부호 없는 정수가 부호 있는 정수보다 숫자의 표현범위가 2배 큼

    => var age : int = 50  //int 형 age라는 변수를 생성, 50이라는 값을 대입

    => ob : 2진수 - 기계가 숫자를 표현하는 방법

        - Oo : 8진수 - 파일의 허가 모드 설정

        - Ox : 16진수 - 색상값이나 메모리의 참조를 나타낼때 이용

    => Float - 32bit 실수이고, 소수는 7자리까지 정밀하게 표현

        - Double - 64bit 실수이고, 소수는 15자리까지 정밀하게 표현

        - 실수 상수는 Double

        - 이전에는 실수를 Float을 많이 사용했기 때문에 Api에서는 실수 자료형이 Float인 경우가 더 많음

    => Bool - true or false 표현

    => nil : 데이터를 저장하지 않는다는 참조형 리터럴

        - swift에서는 모든 자료형의 변수에 nil대입 가능 - Optional만 붙으면 됨

 

5. 타입 추론과 타입 명시

    => swift는 타입에 안전한 언어 : 정적 바인딩 언어

        - 선언할 때, 선언한 자료형의 데이터만 대입 가능

    => 선언시 선언한 것 외의 자료형 데이터 대입시 컴파일 에러 발생

    => swift는 변수 선언시 자료형 미기재시 반드시 초기값을 설정해야 함

        - 해당 초기값을 가지고 타입을 추론하여 사용

    ex) var n         //이 경우 n의 자료형 추론이 불가능하므로 에러

          var n = 10 //이 경우 10을 보고 자료형을 int로 간주

    => 타입을 반드시 명시 : nil을 저장, int 외의 정수 자료형, double외의 실수 자료형, string대신 character를 사용하고자 하는 경우

//예시
var x = 10		//자료형은 int
var y:Int32 = 10	//int32가 자료형

var d = 10.4		//d의 자료형은 Double
var f:Float = 10.4	//f의 자료형은 Float

var str = "T"		//str의 자료형은 String
var ch:Character = "K"	//ch의 자료형은 Chracter

 

    => 개발자들은 자료형 명시를 선호

    => var 대신 let을 붙이면 변수의 값 변경 불가 - 상수화

        - 이전 개발 방법론에서는 이름을 모두 대문자로 하는 것을 권장, swift에서는 별다른 제약이 없음

    => swift의 변수나 메소드 표기법은 클래스 다이어그램(UML)의 표기법

 

**Closure

    => javascript : 함수 안에서 함수를 리턴하여 함수 외부에서 함수 내부의 지역변수 값을 변경할 수 있도록 하는 것

    => swift, iOS : 자바릐 람다처럼 이름없는 함수를 만드는 것

    => jvm 언어의 하나 : 우리나라에서는 음원 사이트들에서 가끔 이용, 미국에서는 많이 사용