** 자바 응용 프로그램 만들기 (PC, 디바이스에 Embedding 되는 프로그램)
=> piblic 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) 파일을 더블클릭해서 실행하기 위해서 확장자 commmand를 추가
mv WindowJava.sh WindowJava.sh.command
8) 파일의 허가모드 변경
chmod 777 파일경로
=> 파일을 모든 사용자가 실행하고 읽고 수정할 수 있도록 변경
chmod rwx rwx rwx 파일경로
첫번째 블럭 : 소유자
두번째 블럭 : 그룹 사용자
세번째 블럭 : 기타 사용자
** 웹 프로그램을 배포
=> war 파일로 압축
=> 프로젝트 이름이 배포할 때 URL이 되고 프로젝트 구조는 무조건 WebContent 디렉토리가 루트 디렉토리
=> test 패키지에 있는 것들은 전부 사라진다.
=>웹 호스팅하는 곳에 war 파일을 업로드 해주면 웹 애플리케이션이 실행
=>cafe24에 배포
1.배포할 프로젝트를 war 파일로 생성
2.저 파일을 웹 호스팅 업체의 포맷에 맞게 업로드를 해줘야 한다.
앱아이콘은 makeappicon.com에서 굳이 직접만들지 말고 여기서 받아쓰자.
** Xcode
=> Mac 운영체제에서 사용하는 IDE
=> Mac 응용프로그램, Apple 모바일 응용 프로그램을 제작할 수 있는 IDE
1. 설치
=> 최신 버전은 App Store에서 다운로드 받아서 설치
=> 최신 버전이 아닌 경우는 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이 되면 GarvageCollection이 메모리 정리를 수행
이 개념을 명확하게 해두지 않으면 애플리케이션 개발에서 메모리 누수(leak)가 발생할 수 있고 메모리 누수가 많이 발생하면 애플리케이션이 자동 종료될 수 있다.
=> 다른 언어의 람다와 유사한 Closure 를 제공
Closure => javascript : 함수 안에서 함수를 리턴해서 함수 외부에서 함수 내부의 지역변수의 값을 변경할 수 있도록 하는 것
=> Swift, iOS : 자바의 람다처럼 이름없는 함수를 만드는 것
=> jvm 언어의 하나 : 우리나라에서는 음원 사이트들에서 가끔 이용하고 미국에서는 많이 사용하는 언어. |
=> 함수는 1급 객체 : 함수도 하나의 자료형이다.
함수를 변수로 만들 수 잇고 함수를 변수에 대입할 수 있다.
자바나 C#을 제외한 거의 모든 언어는 함수가 1급 객체
Python, kotlin, swift, ruby 등의 스크립트 언어는 문법이 유사
=> 문자와 문자열을 리터럴에서는 구분하지 않는다.
' ' 나 " "의 기능이 같다.
=> 멀티 라인 문자열 지원 : 3번씩 입력 - """ 문자열 """
"""을 주석으로 착각하지 말자.
=> 기존의 GCC(GNU Compile Collection - 리눅스 C 컴파일러) 대신에 LLVM(Low Level Virtual Machine)을 이용해서 컴파일을 하기 때문에 성능이 우수
2. PlayGround
=> 스위프트 문법을 학습하고 모듈 단위 개발을 위해서 Xcode에서 제공하는 프로젝트 종류
=> 실행 프로그램을 만드는 것이 실행 프로그램안에서 동작하는 모듈을 생성한다거나 문법 공부를 할 때 사용하는 프로젝트
=> 프로젝트 생성 : [File] - [New] - [PlayGround]
3. 콘솔 출력
print(문자열 상수 또는 문자열 변수)
4. 실행
=> 코드 창의 실행버튼 클릭 : 이전에 실행한 내용은 제외하고 수정한 부분만 실행
=> 출력 창의 실행버튼 클릭 : 전체 실행
5. 주석
=> 한줄 주석 : //
=> 여러줄 주석 : /* ~ */
=> 서식있는 텍스트 주석 : 문서화를 위해서 사용
// : 서식있는 텍스트 주석
/* : */ : 서식있는 여러 줄 주석
#을 붙이면 제목
=> 서식있는 텍스트 주석 확인 : [Editor] - [Show Rendered Markup]
** 문법
1. 작성 규칙
=> main이 없어서 작성한 순서대로 실행
=> entry point(시작지점)를 만들고자 하는 경우에는 클래스이름 위에 UIApplicationMain 이라는 어노테이션을 추가해주면 된다.
=> 변수를 선언할 때 자료형을 기재하지 않으면 자료형 추론을 해서 자료형을 설정
=> 연산자 앞 뒤에 공백을 몇개를 삽입해도 상관없지만 앞에 공백이 있으면 뒤에도 있어야 하고 앞에 공백이 없으면 뒤에도 없어야 한다.
=> try ~ catch 지원 : 대다수 클라이언트 프로그램을 만들기 때문에 잘 하지 않는데 되도록이면 해주고 개발이 끝나고 난 후 삭제하는 것이 좋다.
=> import는 외부 라이브러리 참조용 이다.
2. 로그. 출력 함수
1) print
=> 첫번째 파라미터가 가변 파라미터로 되어 있기 때문에 여러 개 출력하고자 할 때는 ,로 구분해서 계속 입력
=> separator 옵션을 이용하면 구분자를 주간에 넣어서 출력이 가능
=> terminator 옵션을 이용하면 출력이 끝나고 마지막에 Enter 대신에 삽입
2) NSLog
=> 출력할 때 날짜와 시간 그리고 파일이름 등을 같이 출력(iOS 앱개발에서만 사용가능 - PlayGround에서는 사용하지 않는다.)
3) debugPrint : 자료형을 구분해서 출력 - 문자열의 경우는 따옴표를 해서 출력
4) dump : 인스턴스의 내용을 출력하고자 할 때 유용
=> 세부 내용까지 같이 출력
5) 주의
=> 앱 개발 도중에 로그 출력 함수를 사용했다면 개발이 끝나고 나면 전부 삭제하는 것이 좋다.
=> 로그를 출력하는 것도 시스템 자원을 사용하는 것이기 때문이다.
import UIKit
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 : 프로그램 작성 시 개발자가 직접 입력하는 값)
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로 선언했는데 값을 1번도 변경하지 않으면 경고가 발생 -> let으로 설정하도록
2) null 포함 여부에 따라 Optional과 Optional이 아닌 자료형으로 나뉨
3) 묵시적 자료형과 명시적 자료형
=> 묵시적 자료형은 자료형을 기재하지 않는 방식으로 자동으로 자료형이 설정된다.
=> 명시적 자료형은 자료형을 기재하는 방식
4. Swift는 정적 바인딩
=> 정적 바인딩은 데이터를 대입하기 전에 자료형을 결정하는 것이다.
=> 자료형을 미리 설정하고 컴파일 할 때 잘못된 데이터가 입력이되면 실행하지 않는다.
5) 변수 명명 규칙
=> 영문자, 숫자, 한글, 한자, 특수문자, 이미지 용 바이너리 모두 가능
=> 예약어는 변수명으로 사용할 수 없지만 대소문자를 변경하거나 작은 따옴표로 감싸면 예약어도 변수 이름으로 사용 가능하다.
=> 연산자는 안된다.
=> 숫자로 시작할 수 없고 _ 이외의 특수문자도 안된다.
=> 중간에 공백도 안된다.
6) 변수 생성
var 이름 : 자료형 = 값
=> 자료형을 생략하면 자료형 추론으로 자료형 설정
=> 자료형을 생략한 상태에서 값을 생략하면 에러
=> 값을 생략하거나 nil 을 대입할려면 자료형이 Optional이어야 한다.
=> swift에서는 null 대신에 nil이라고 한다.
자료구조에서는 null 대신에 nil이라고 한다.
=> 변수 이름은 하나의 영역에서는 한번만 생성되어야 한다.
=> 변수에 값을 대입할 때는 변수 이름 = 값 의 형태
=> 카멜 표기법 : 클래스와 인터페이스(프로토콜) 이름은 대문자로 시작하고 변수와 메소드 이름은 소문자로 시작그리고 상수는 모두 대문자로 표기
2개 단어 이상으로 만들어진 경우 두번째 단어의 첫글자는 대문자로 시작
=> 헝가리언 표기법 : 변수 이름 앞에 자료형과 범위를 표기하는 방식
불린은 b, 정수는 n, 실수는 f, 문자는 c, 문자열은 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 이라는 값을 대입
=> 0b: 2진수, 0o : 8진수, 0x : 16진수 - 색상값을 나타내거나 메모리의 참조를 나타낼 때 이용
Float - 32bit 실수이고 소수는 7자지까지 정밀하게 표현
Double - 64bit 실수이고 소수는 15자리까지 정밀하게 표현
실수 상수는 Double
이전에는 실수를 Float을 많이 사용했기 때문에 API에서는 실수 자료형이 Float인 경우가 더 많다.
Bool - true 또는 false 저장
nil : 데이터를 저장하지 않는다는 참조형 리터럴
swift에서는 모든 자료형의 변수에 nil 대입이 가능 - Optional만 붙으면
5. 타입 추론과 타입 명시
=> swift는 타입에 안전한 언어 : 정적 바인딩 언어
선언할 때 선언한 자료형의 데이터만 대입이 가능
=> 선언할 때 선언한 자료형 이외의 데이터를 대입하면 컴파일 할 때 에러가 발생
=> swift는 변수를 선언할 때 자료형을 기재하지 않으면 반드시 초기값을 설정해야 한다.
이 초기값을 가지고 타입을 추론해서 사용
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 //자료형은 Double
var f:float = 10.4 //자료형은 float
var str = "T" //자료형은 String
var ch:Character = "K" //ch의 자료형은 Character
=> 개발자들은 자료형 명시를 선호
=> var 대신에 let을 붙이면 변수의 값을 변경 못함 - 상수화
이전 개발 방법론에서는 이름을 모두 대문자로 하는 것을 권장했지만 swift에서는 별다른 제약이 없다.
=> swift의 변수나 메소드 표기법은 클래스 다이어그램(UML)의 표기법