카테고리 없음

89 Swift 자료형이어서

이즈라핀 2020. 8. 11. 14:28

** 문자열 관련 자료형

1. 문자열 : 0개 이상의 문자의 모임

문자를 순서대로 저장하고 마지막에 null을 저장

=> 한줄의 문자열 상수는 " " 안에 작성

=> 여러줄의 문자열 상수를 만들고자 할 때는 """ 문자열 """

=> 문자열 보간법(문자열 템플릿) : 문자열 안에 다른 변수의 데이터를 문자열로 삽입

"문자열 상수\(변수 및 상수)..."

변수나 상수가 저장하고 있는 내용을 문자열로 치환해서 삽입

다른 언어에서는 String 클래스의 format이라는 메소드가 이 역할을 수행

=> String 클래스에 한해서는 아직도 Objective-C의 클래스인 NSString을 조금 더 많이 활용한다.

 

2. 문자 : 1개의 문자 - Character

=> Swift에서는 변수를 만들 때 자료형을 Character로 명시하면 문자

var 또는 let 변수명 = "A"   //String

var 또는 let 변수명:Character = "A"   //Character

 

3. 제어문자(Escape Sequence)

=> 거의 모든 프로그래밍언어에서 사용하는 것으로 \다음에 하나의 문자를 추가해서 의미를 부여한 것

\0 : null - nil(자료구조에서)

\n : line feed(줄 바꿈)

\r : garage return(커서를 맨 앞으로 보내는 것)

=> GUI Programming에서 줄바꿈을 하기 위해서 \n 을 입력했는데 줄바꿈이 안되면 \r\n으로 입력

 

\t : 탭

\\, \', \". \:

=> 정규식을 입력할 때 \를 포함시키려면 \\\\ 해야 한다.

콤마나 공백의 경우도 언어에 따라서는 반드시 \와 함께 해야하는 경우가있다.

\u{16진수 2자리}, \u{16진수 4자리}, \u{16진수 8자리}

=> 16진수 1개는 4비트 : 한글이나 특수문자를 바이트 코드로 직접 입력할 때 사용 

직접 입력해야 하는 경우는 인코딩 때문

 

import UIKit

//var는 변수를 만들 때 사용
//자료형 추론으로 변수를 생성
//자료형을 명시하지 않음
var str = "Hello, playground"

//자료형 명시를 이용해서 String 생성
var msg:String = "Swift"

//Character는 반드시 자료형을 명시
var ch:Character = "T"

//값을 변경할 수 없는 상수를 생성
let temp = "HI"

//var로 만든 것을 변경이 가능하지만
//let으로 만든 것은 변경이 불가능
str = "Hi Playground"
//temp = "Hello"

//상수와 변수 구분
//변수는 2개 이상의 스레드에서 동시에 사용하는 것이 위험하지만 상수는 상관없다.

//콘솔에 출력 - iOS에서는 NSLog 가 더 효율적
print(str)
debugPrint(msg)

 

 

** 형변환 과 자료형 검사

=> 스위프트는 서로 다른 타입의 변수나 상수끼리의 연산을 허용하지 않는다.

정수형이더라도 Int와 Int32는 연산이 되지 않는다.

 

1. 정수, 실수, Bool, String, Character 사이의 형변환

변환하고자 하는 자료형(데이터) 로 형변환

생성자를 호출해서 데이터의 자료형을 변환하는 것이다.

 

var n1:Int = 32

var n2:Int32 = 27

ni + n2 는 에러 - Swift는 자료형에 엄격해서 동일한 데이터 형태라도 자료형이 다르면 안된다.

 

n1 + Int(n2) 의 형태로 연산 - 한쪽 데이터를 다른쪽으로 형변환 해주어야 한다.

 

2. 그 이외 자료형의 형변환 : as 연산자 사용

=> 상속받은 관계인 경우 형변환 가능 - 상위 클래스 자료형으로 만든 것을 하위 클래스 자료형으로 변환할 때 사용

 

UIView view = Button();

view.멤버 -> UIView의 멤버만 호출할 수 있다.

(view as Button).멤버 -> UIButton 의 멤버를 호출할 수 있다.

오버라이딩 된 멤버를 호출할 때는 형변환을 안해도 된다.

 

=> Optional(nil을 저장할 수 있는 자료형 - 원래 자료형을 wrapping)을 원래 자료형으로 되돌릴 때도 사용

 

=> Swift의 자료형을 Objective-C의 자료형으로 변환하거나 Objective-C의 자료형을 Swift로 변환하고자 할 때도 사용

 

3. 자료형 확인

데이터 is 자료형

=> 데이터의 자료형과 뒤의 설정한 자료형이 같으면 true 그렇지 않으면 false

=> 자료형으로 변환이 가능하면 true

 

4. 소스를 작성할 때 nil 여부 확인과 자료형을 확인하는 작업은 중요

=> swift나 Kotlin이 nil 여부 확인의 번거로움을 줄이기 위해서 Optional을 추가했지만 실제 개발에서는 아직도 nil 검사나 자료형을 학인한 후 작업하는 것을 권장한다.

 

클라이언트 프로그램에서는 추천하지 않지만 서버 프로그래머들은 습관적으로 nil 검사 수행하는 코드와 자료형 검사하는 코드 그리고 예외처리 코드를 작성한다.

 

5. 숫자 데이터의 형변환

 

var x:Int = 43
var y:Int32 = 47
//print(x+y)  //2개의 자료형이 다르면 Swift는 연산할 수 없다.
print(x+Int(y))  //y를 Int로 변경하던가 x를 Int32로 변경해서 연산해야 한다.

 

6. API가 제공하는 데이터는 우리가 만드는 자료형과는 다를 수 있기 때문에 원하는 자료형으로 변환해서 사용할 수 있어야 한다.

 

 

 

 

** Operator(연산자)

=> 연산을 수행할 수 있도록 해주는 부호나 명령어

=> 산술연산과 논리연산으로 분로

산술연산은 숫자 데이터를 가지고 수행하는 연산

논리연산은 boolean 데이터를 가지고 수행하는 연산

=> swift는 연산자 좌우에 공백이 일치해야 한다.

왼쪽에 공백이 있으면 오른쪽에 공백이 있어야하고 왼쪽에 공백이 없으면 오른쪽도 공백이 없어야 한다

 

1. 기본 할당(assingnment) 연산자

=

=> 오른쪽의 데이터를 왼쪽의 변수에 대입해주는 연산자

=> 왼쪽에는 변수만 와야 하고 오른쪽은 표현식(값, 변수, 상수, 연산식, 메소드 호출 구문 등) 이 오면 된다.

 

2. 산술 연산자

=> %, *, /, +, -

=> %는 정수 데이터에만 사용

=> 실수의 나머지 연산은 truncatingRemainder라는 메소드를 이용

=> &+, &-, &*은 오버플로우를 허용하는 연산

1) Overflow

=> 크기가 정해진 데이터의 모임에서 크기를 벗어나는 데이터를 추가하고자 하는 경우 발생

정해진 stack의 크기를 넘어서는 것을 StackOverflow 라고 한다.

=> 저장할 수 있는 숫자의 표현범위를 위쪽으로 넘어선 것으로 보통은 예외를 발생시키지만 상황에 따라서는 가장 작은 수에서 부터 다시 시작하는 경우도 있다.

 

2) Underflow

=> 데이터의 모임에 데이터가 없는데 꺼낼 때

=> 숫자의 표현범위를 아래쪽으로 넘어선 것

 

//Int8은 음수를 포함해서 저장.   -128 ~ 127 까지 저장
var n1:Int8 = 120
var n2:Int8 = 8

//Overflow
//var result:Int8 = n1 + n2

//Overflow가 발생하더라도 연산을 수행
var result:Int8 = n1 &+ n2
print(result)

//실수의 나머지를 바로 구할 수 없다.
//var mod = 1.7 % 1.5

//실수의 나머지 구하기
var mod = 1.7.truncatingRemainder(dividingBy: 1.5)
print(mod)

 

 

4. 비교 연산자

>, >=, <, <=, ==, !=

=> 동일한 자료형의 데이터를 가지고 비교해서 결과를 bool로 리턴하는 연산자

=> 상수는 자동으로 형변환을 수행하지만 변수는 반드시 자료형을 일치시켜서 수행

=> 참조를 비교하는 ===, !== 연산자도 제공

동일한 데이터를 가지고 인스턴스를 생성해서 == 로 비교하면 true가 리턴되지만 ===로 비교하면 false가 리턴된다.

 

5. 불리언 논리 연산자

=> 불리언 데이터를 가지고 연산을 해서 불리언으로 결과를 리턴하는 연산자

!(NOT), &&(AND), ||(OR)

=> ! 은 하나의 데이터를 받아서 결과를 반대로 리턴하는 연산자(true->false, false-> true)

=> &&는 둘다 true 일 때만 true를 리턴하는 연산자, 첫번째 데이터의결과가 false 이면 뒤 데이터는 확인하지 않는다.

=> || 는 둘 다 false일 때만 false를 리턴하는 연산자, 첫번째 데이터의 결과가 true이면 뒤 데이터는 확인하지 않는다

=> ! > && > ||

 

 

6. 비트 논리 연산

=> 정수 데이터를 이진수로 변환해서 연산을 수행하고 결과를 10진 정수 데이터로 리턴하는 연산자

- (2의 보수 연산자)

~ (1의 보수 연산자) : 0->1, 1->0 결과는 부호를 변경하고 절대값을 1더하거나 빼면 된다.

& (and) : 둘 다 1일 때만 1이고 나머지 경우는 0

| (or) : 둘 다 0일 때만 0이고 나머지 경우는 1

^ (xor) : 같으면 0, 다르면 1

 

var n1:Int8 = 11   //0000 1011

var n2:Int8 = 12 //0000 1100

print(n1 & n2)    //8

print(n1 | n2)     //15

print(n1 ^ n2)    //7

 

7. shift 연산자

=> 정수 데이터를 이진수로 변환해서 연산을 수행한 후 정수 데이터로 리턴

<< : 왼쪽으로 밀기 - 1번 밀 때마다 2배씩 증가

>> : 오른쪽으로 밀기 -번 밀 때마다 1/2로 감소

 

8. 삼항 연산자

조건 ? true일 때 표현식 : false일 때 표현식

 

9. 복합 할당 연산자

연산자=

=> +=은 왼쪽 변수의 데이터에 오른쪽의 값을 더해서 왼쪽의 변수에 대입

 

10. swift 3부터는 ++, -- 가 없어졌다.

 

11. nil 연산자

표현식1 ?? 표현식2

=> 표현식1이 nil 이면 표현식2를 수행

=> default를 만들어주는 기능

변수 = 표현식1 ?? 표현식2

표현식1이 nil 일 때 표현식2를 사용

=> 센서의 값을 가져올 때 센서가 없다면 뒤의 표현식의 값을 대입

 

12. 범위 연산자

start...end : start 부터 end 까지의 순서열

start..<end : start 부터 end 전까지 

=> start를 생략하면 0

=> end를 생략할 수 있지만 순서열에서는 생략하지 않고 list에서 범위를 나타낼 때 생략하면 맨 마지막 인덱스가 된다.

=> 무조건 왼쪽에서 오른쪽으로 수행되기 때문에 왼쪽의 숫자가 작아야 한다.

=> 반대로 수행할 때는 reversed()를 호출

 

** Control Statement(제어문)

=> 명령의 흐름을 변경할 수 이슨 명령어

1. 분류

1) 분기

=> 값에 의한 분기 : switch

=> 조건에 의한 분기 : if

 

2) 반복 - loop, iteration, cursor

=> iteration, cursor(데이터의 모임을 순서대로 순회) : for ~ in

=> loop : while, repeat ~ while

 

3) 기타 제어문

=> break : 반복문 중단

=> continue : 다음 반복으로 이동

=> return : 함수의 수행을 종료하고 함수를 호출한 곳으로 제어권을 이동

 

4) guard

=> if와 반대 형태로 동작하는 제어문인데 조건에 맞지 않으면 return

=> if는 조건에 맞지 않을 때 무엇인가를 수행하는 용도로 사용하지만 guard는 종료한다는 의미로 사용

 

2. if

1) 단순 if

if 표현식{

    표현식의 결과가 true 일 때 수행할 내용

}

=> 표현식의 괄호는 필요 없다.

관습적으로 표현식의 괄호는 하는 것일 뿐

 

2) if ~ else

if 표현식{

    표현식의 결과가 true 일 때 수행할 내용

}else{

    표현식의 결과가 false 일 때 수행할 내용

}

 

3)if ~ else if ~ else

=> else if는 개수에 제한 없다.

if 표현식{

    표현식의 결과가 true 일 때 수행할 내용

}else if 표현식{

    위의 표현식의 결과가 false 이고 이 표현식의 결과가 true 일 때 수행할 내용

}else{

    표현식의 결과가 false일 때 수행할 내용

}

 

3. switch

=> 값의 의한 분기인데 범위 연산자 가능

=> case에 where를 추가할 수 있다.

=> default가 필수

=> 기본적으로 break가 없어도 fallthrough(아래 구문으로 내려가는 것)가 안된다.

아래로 내려가고자 할 때 fallthrough를 입력해줘야 한다.

=> 비교할 때 튜플(Tuple - 여러 개의 값의 모임) 사용이 가능

 

//점수
var score = 98
//A, B, C, D, F 와 같은 학점 판별
//기본적으로 fallthrough가 되지 않는다
//default가 필수
//
switch score {
    case 90...100:
        print("A")
    case 80..<90:
        print("B")
    case 70..<80 where score % 2 == 0:
        print("C이면서 짝수")
    case 70..<80 where score % 2 == 1:
        print("C이면서 홀수")
    case 60..<70:
        print("D")
    default:
        print("F")
}

//튜플 생성
var data = ("이승범", 90)
switch data {
case (data.0, 0..<60):
    print("\(data.0)은 불합격입니다.")
default:
    print("\(data.0)은 합격입니다.")
}

 

 

5. while

=> 어떤 조건이 false가 될 때까지 수행하도록 하고자 할 때 사용

=> 반복해야할 횟수는 알지 못하지만 조건은 알고 있을 때 사용

=> 목적은 repeat  ~ while 과 동일하미잔 의미상 repeat ~ while은 반드시 한번은 한다라는 내용이 포함되어 있다.

 

 

while 표현식{

    표현식이 false가 아닐 때 수행할 내용

}

 

6. repeat ~ while

=> while과 사용법은 유사

repeat{

    표현식이 false가 아닐 때 수행할 내용

}while 표현식

=> 반드시 1번은 수행해야 하는 경우를 이 표현법으로 작성하면 가독성이 높은 프로그램으로 간주

 

7. for ~ in

=> 횟수를 알고 잇는 반복이나 데이터의 모임을 수서대로 사용하고자 할 때 사용 : for~each

=> Array, Dictionary, Set, String, 순서열 등에서 사용

for 임시변수 in 데이터의모임{

     데이터모임을 순서대로 임시변수에 대입하고 수행할 내용

}

=> 임시변수를 사용하지 않을 것 같으면 생략하는 것은 안되고 _ 라고 입력하면 된다.

 

//swift에서는 for의 용도가 이전의 for~each : 빠른 열거
var str:String = "Swift"

//문자열도 문자의 모임으로 간주 - for 사용 가능
for ch in str{
    print(ch)
}

 

 

8. 제어문은 중첩 가능

=> 제어문 안에 제어문 사용이 가능

 

9. break

=> 반복문 안에서 분기문과 같이사용해서 반복문을 종료하는 명령어

 

10. continue

=> 반복문 안에서 분기문과 같이사용해서 다음 반복으로 넘어가는 명령어

 

11. 반복문의 중첩

=> 반복문 앞에 레이블을 추가하는 것이 가능

=> break나 continue 할 때 레이블 이름 같이 작성하면 레이블에 해당하는 반복문을 종료하거나 패스

 

OUTER : for i in 0...3{

   for j in 0...10{

       //break  //j에 해당하는 반복문을 종료

       break OUTER //OUTER의 반복문을 종료

    }

}

 

 

12. guard

guard 표현식 else{

    표현식이 false 일 때 수행할 내용

}

=> else가 필수

 

if !(표현식){

    내용

}

와 구문 해석상 동일

 

=> if는 무엇인가 작업을 수행하지만 guard는 종료하는 역할을 수행하는 경우가 많다

=> 대부분의 경우 { } 안에 들어가는 문장은 return

 

** Swift 운영체제 버전 확인

=> UIDevice.current.systemVersion 으로 운영체제 버전을 가져올 수 있다.

플랫폼이름.버전 의 형태의 문자열로 리턴된다.

이 방법을 사용하는 경우에는 버전에 해당하는 숫자가 존재하는지 확인해서 사용

11 버전 이상을 확일할려면 11, 12, 13 있는지 확인해야한다.

 

=> 제어문을 이용해서 확인할 수 있는 방법을 제공

if #available(플랫폼종류 버전, *){

    버전이상일 때만 동작

}

 

//11 버전 이상일 때

f #available(iOS 11.0, *){

    버전이상일 때만 동작

}

=> 스마트폰은 API가 자주 변경이 되기 때문에 코드를 작성하다보면 운영체제 버전에 따라 다른 API를 사용하는 경우가 많기 때문에 위 구문은 중요하다.

 

//운영체제 버전 확인
print("운영체제 버전:", UIDevice.current.systemVersion) //결과 : 운영체제 버전: 13.6
//운영체제 버전이 12 이상일 때 와 그렇지 않을 때 작업
if #available(OSX 12.0, *){
    print("운영체제가 12.0 이상 일 때 수행할 구문")
}else{
    print("운영체제가 12.0 미만 일 때  수행할 구문")
}

 

** Optional

=> Optional은 자료형이름이 아니고 일반 자료형을 nil을 저장할 수 있도록 래핑할 때 사용하는 이름

=> swift의 자료형들은 기본적으로 nil을 저장할 수 없다.

이러한 swift의 자료형에 nil을 저장할 수 있도록 만드는 것을 Optional Wrapping이라고 한다.

반대로 Optional Wrapping 된 데이터를 swift의 자료형으로 변경하는 것을 Optional Unwrapping이라고 한다.

=> Optional Wrapping을 하고자 할 때는 자료형 이름 뒤에 ?를 붙이면 된다.

Optional Wrapping 된 데이터는 다른 데이터와 연산을 할 수 없다.

Optional Wrapping 된 변수에만 nil을 저장할 수 있다.

 

//var str = nil // 이 구문은 에러
//swift에서는 일반 자료형 변수에 nil을 대입할 수 없다.

var str:String?  //Optional로 생성해서 nil 대입 가능
str = nil

var n:Int?
n=30
print(n)  //출력의 결과가 30은 아니지만 에러는 아님
//Optional 데이터는 다른 데이터와 연산할 수 없다.
//print(n + 20)

 

 

1. 옵셔널 해제

=> 명시적 해제

강제 해제와 비강제 해제

 

=> 묵시적 해제

컴파일러에 의해서 해제되는 것이 있고 변수를 선언할 때 ? 대신에 !를 이용해서 해제

 

2. 강제 해제

옵셔널 데이터 뒤에 ! 를 추가해서 강제로 옵셔널을 해제하는 것

여기에 대한 책임은 개발자가 진다.

잘못될 가능성이 있기 때문에 개발자가 확인하고 사용해야 한다는 것이다.

권장하는 형태는 nil인지 확인하고 nil이 아니면 그 경우에만 강제해제하도록 한다.

 

var n:Int?
n=30
print(n)  //출력의 결과가 30은 아니지만 에러는 아님
//Optional 데이터는 다른 데이터와 연산할 수 없다.
//print(n + 20)

//강제 해제를 해서 연산을 수행
print(n! + 20)

n = nil
//nil은 강제로 해제가 되지 않기 때문에 확인하고 해제
if n != nil{
    print(n! + 20)
}

 

 

3. 비강제 해제

=> apple이 제공하는 샘플 코드에서 많이 등장

=> if 나 guard 구문에서 변수나 상수를 생성하고 값을 대입하면 값이 nil이면 false를 리턴하고 그렇지 않으면 true를 리턴

 

if var 또는 let 이름 = 데이터{

    //데이터가 nil이 아닐 때 수행하는 구문

}else{

    //데이터가 nil 일 때 수행하는 구문

}

=> nil일 가능성이 있는 메소드 호출을 할 때 많이 이용

 

4. 컴파일러에 의한 자동 해제

=> Optional 타입에 ==, != 를 이용해서 비교하면 자동해제되서 비교가 된다.

 

5. 묵시적 해제

=> 옵서녈 변수를 선언할 때 ? 대신에 ! 를 사용하면 변수를 사용할 때 자동으로 ! 가 해제된다.

=> iOS Framework에서 인터페이스 빌더(IB - 스토리보드)에서 디자인 한 뷰를 뷰 컨드롤러 클래스에 드래그해서 변수를 생성하면 !를 붙여서 생성하기 때문에 Optional을 해제하지 않고 사용이 가능하다.

=> 이 경우도 일종의 강제 해제이기 때문에 nil 인지 확인하고 사용하는 것을 권장

=> 인터페이스 빌더에서 다지안 한 뷰를 연결한 변수는 반드시 생성했다는 보장이 있기 대문에 확인하지 않고 사용 - IBOutlet이라는 단어가 앞에 붙어 있다.

 

** 특수 자료형 : Swift의 자료형이 아니고 Objective-C의 자료형

=> Objective-C의 자료형의 이름은 NS가 붙는다.

Swift:String, Objective-C:NSString

Objective-C는 Mutable과 없는 것으로 구분

NSString(수정 불가능), NSMutableString(수정 가능)

 

=> Any: C언어의 void* - 모든 자료형의 데이터를 저장할 수 있는 자료형

저장을 할 때는 어떤 종류의 데이터이건 저장할 수 있지만 사용할 때는 반드시 강제 형변환을 해서 사용해야 한다.

 

=> AnyObject : Java의 Object - 모든 인스턴스의 참조를 저장할 수 있는 자료형

저장을 할 때는 어떤 종류의 인스턴스이건 저장할 수 있지만 사용할 때는 반드시 강제 형변환을 해서 사용해야 한다.

 

=> selector : swift에서는 함수가 일급 객체(함수도 하나의 자료형)

함수 단위로 대입하는 것이 가능하지만 Objective-C는 함수가 일급 객체가 아니라서 함수를 아무곳애네 대입할 수 없어서 C언어의 함수 포인터처럼 사용할 수 있는 개념을 도입

#selector(함수 나 메소드)

 

=> 자바를 완전한 객체 지향 언어(모든 존재하는 것들은 전부 객체 안에 또는 클래스 안에 존재)

대입의 단위도 무조건 객체 또는 클래스만 가능

모든 클래스는 Object클래스로 부터 상속을 받아야 한다.

Swing이나 Java F/X 또는 안드로이드에서 이벤트 핸들링을 할 때 실제로 보면 이벤트가 발생하면 호촐되는 것은 함수이다.

자바에서는 함수라는 개념이 존재하지 않아서 클래스를 만들어서 함수를 메소드로 선언하고 다시 객체(Listener)를 만들어서 대입한다.

사용할 것은 메소드 1개임에도 불구하고 다른 메소드를 같이 대입해야 한다.

 

var x:Int?
//x가 nil 이기 때문에 다른 변수에 할당하면 false
//변수 생성 구문이 성공하면 이 변수는 if 외부에서도 사용 가능
//apple 의 샘플 코드는 특별한 경우가 아니면 nil을 확인하는 구문을 사용하지 않고 아래처럼 사용
if var y = x{
    print("성공")
}else{
    print("실패")
}

x = 100
if var k = x{
    print("성공")
}else{
    print("실패")
}

//컴파일러에 의한 해제 : == 나 != 연산자 사용 시
var z:Int = 70
if z == 70{
    print("일치")
}else{
    print("불일치")
}

//사용할 때 강제 해제 - 비추천
var temp:Int! = 30
//특별한 경우가 아니면 Optional은 var로 선언
//Optional을 사용하는 이유 중 하나가 nil을 대입해서 메모리 해제를 하기 위해서이다.

var any:Any = 123 //모든 자료형의 데이터를 저장할 수 있는 변수 선언
print(any) //출력

//출력이 되었지만 사용은 반드시 강제 형변환을 해야한다.
//print(any + 234)
print((any as! Int) + 234)

 

 

** Function(함수)

=> 독립적으로 실행할 수 있는 코드 블럭

=> 함수를 실행(call)하면 독립적인 메모리 공간이 하나가 할당되고 그 안에서 필요한 데이터들을 저장하고 수행이 끝나면 할당된 메모리 공간을 소멸시키고 호출한 곳으로 돌아갑니다.

돌아가는 것을 return 한다고 합니다.

이 때 사용되는 메모리 공간의 자료구조가 Stack 이라서 보통 함수가 할당받은 메모리를 Stack 이라고 합니다.

기본적으로는 Stack의 크기가 한정되어 있고 이 크기를 넘어서서 데이터를 저장하면 Stack Overflow가 발생합니다.

예전에는 시스템의 메모리 크기가 1MB 여서 Stack 의 크기도 1MB 라고 했습니다.

수정이 안되었습니다.

지금의 시스템은 메모리 크기가 훨씬 크기 때문에 Stack의 크기도 조정이 가능합니다.

IDE에 이 Stack의 크기를 조절하는 옵션이 있습니다.

=> 스택의 크기가 한전되어 있기 때문에 하나의 함수에 너무 많은 코드를 작성하는 것은 바람직하지 않다.

=> 함수는 클래스나 인스턴스에 소속되지 않을 것을 의미하고 클래스나 인스턴스에 소속된 함수는 메소드라고 한다.

 

=> 메시지는 오면 리시버가 설렉터를 호출한다.

메시지는 이벤트가 되고 리시버를 메소드를 호출하는 대상(클래스, 인스턴스) 이고 셀렉트가 호출되는 함수이다.

다형성(Polymorphism) : 동일한 메시지에 대하여 다르게 반응하는 성질

                                      동일한 코드가 상황에 따라 다른 메소드(함수X)를 호출하는 것

=> 요즘 프로그래밍 언어의 뷴류

함수형 프로그래밍 언어 : Java를 제외한 거의 모든 프로그래밍 언어 - C언어를 제외하고는 전부 객체 지향의 개념을 전부 포함하고 있다.

함수가 클래스나 인스턴스 안에 없고 외부에 존재할 수 있는 언어

함수를 만들 수 는 있지만 빅데이터 처리나 GUI 이벤트 처리가 아니면 대부분은 객체 지향의 개념을 사용을 한다.

 

완전한 객체 지향 언어 : Java

 

1. 함수를 사용하는 이유 - 클래스를 사용하는 이유, 디자인 패턴을 적용하는 이유

=> 재사용성 증가

=> 코드를 분리하면 가독성이 높아지고 유지보수가 편리

 

2. 함수의 종류

=> Maker Function : 프로그래밍언어나 프레임워크가 제공하는 함수

=> User Define Function : 개발자가 필요에 의해 만든 함수

=> 3rd Party Function : 다른 개발자가 만들어 준 함수

 

3. 함수를 생성(선언)

func 함수이름(매개변수이름:자료형 ...) -> 자료형

     함수의 내용

}

=> ( ) 안의 데이터를 argument(매개변수) 내가 주는것, 상황에 따라 아무것도 없을 수 있다.

=> 자료형을 return type 이라고 하는데 함수가 리턴할 때 가지고 가는 데이터의 자료형으로 데이터를 가지고 가지 않는다면 Void 라고 기재해야 한다.

=> 함수이름(매개변수이름:자료형 ...) -> 자료형   부분을 함수의 원형 이라고 한다.

API Document를 보면 원형 부분만 부여주고 설멍을 한다

API 에서는 함수의 내용은 보여주지 않고 원형만 보여주고 설명을 한다.

=> 함수를 공부할 때는 원형을 보고 함수를 호출하는 것을 먼저 공부해야 한다.

작업을 하고자 하면 그 작업을 가지고 함수의 원형을 만들 수 있어야 한다.

 

=> 함수를 만들 때는 이름은 다른 것과 구분만 되면 되고 어떤 데이터를 받아서 어떤 결과를 만들 것인지를 생갹해야 한다.

내가 받아야하는 데이터가 argument가 되는 것이고 결과가 리턴 타입이 된다.

함수 이름을 보면 이 함수가 어떤 일을 할 것 인지 예측이 되도록 만들면 좋다.

함수의 코드가 너무 길면 함수의 코드를 분리해서 별도의 함수를 만들고 호출하는 방식으로 구현하면 좋다.

파일을 업로드 하는 로직이 있는 ServiceImpl의 메소드를 보면 코드가 굉장히 길어진다.

이런 경우에는 업로드 하는 부분만 별도로 만들어서 호출하도록 하면 메인 함수의 길이가 짧아 진다.

 

4. 함수를 호출

=> 리턴이 없는 경우는 : 함수이름(매개변수이름:데이터...)

=> 리턴이 있는 경우는 : 변수나 상수이름 = 함수이름(매개변수이름:데이터...) 리턴되는 데이터를 저장하고 사용

=> swift는 매개변수를 대입할 때 매개변수 이름을 기재를 해야 한다.

갇고성을 높이기 위해서 매개변수 이름을 입력한다.

안드로이드 스튜디오(인텔리 J)가 java의 문법이 아닌데도 이 기능을 사용을 한다.

=> iOS SDK의 매개변수 이름은 길기 때문에 외워서 사용하는 것은 거의 불가능하다

이름이 매개변수에 대한 설명이기 때문에 이름을 잘 살펴보면 이 함수가 어떤일을 하고 어떤 데이터 가지고 작업을 하는지 알 수 있다.