안녕하세요!
어느덧 클래스와 구조체를 배우기 전
함수에 대해서 알아보고자 합니다
함수는 독립적으로 처리될 수 있는 부분을 분리하여
구조화한 객체를 의미합니다
외부에 의존하는 부분이 없고 캡슐처럼 포장해 놓은것 입니다
그래서 여러 번 호출하여 사용할 수 있어서 재사용하기
좋답니다
함수란?
함수란 입력값을 받아서
내부 처리과정을 거치고 결과값을 주는 형태를 기본으로 자리잡고 있답니다
입력값(44)
인자값 or 파라미터(parameter)
라고 부르며
결과값(53 - 그림에서는 ????)을
결과값 or 리턴값(return값)
이라고 부릅니다
인자값은
하나도 없을 수도 있고 여러개 일 수도 있습니다
반환값 역시 없을 수도 있고 반환할 수도 있습니다
하지만 반환값이 존재한다면 일반적으로 하나의 값만 만환합니다
만약 둘 이상을 반환하고 싶다면
집합 자료형(collection)에 담아서 반환합니다
실질적으로 반환하는 값이 여러개지만
객체 자체는 하나여야한다는 말 입니다
말로 설명하니 어려울 수도 있으니
코드를 보면서 설명하고자 합니다
함수 정의
함수를 정의하기 위해서 반드시 앞에 func 키워드를 사용해야합니다
그리고 반드시 실행내용은
순서대로 실행이 된다!
여기서 유의할 점은
첫 번째
함수명에 영어, 숫자, 특수문자 등 다양한 문자들을 사용할 수 있지만
첫 글자는 반드시 영어 or _(언더바)로 시작해야합니다
두 번째 글자부터는 제약이 없기 때문에 원하는 이름으로 함수를 정의할 수 있습니다
함수 호출
이런식으로 여러번 호출 하게된다면
개발자는 함수명만 호출하면 끝!
그러니 코드 길이가 긴 것을 여러번 사용하게된다면
반드시 함수로 만들어 놓아야겠죠??
함수인지 아닌지 알아보는법?
()
소괄호를 보면 알 수 있답니다
소괄호가 있다면 함수의 실행이라고 할 수 있습니다
함수에 인자값(input) / 리턴값(ouput)에 관하여
우리는 인자값과 리턴값에 대해서 배웠습니다
둘 다 없는 경우가 있을 수 있고
인자값만 있을수 있고
리턴값만 있을 수 있는 경우가 있습니다
이런 경우에 대해서 알아보고자 합니다
우선 둘 다 없는 경우는
void Type
이라고 부릅니다
결과적으로 아무것도 하지않고 만약
함수안에서 하는 실행이 있을 수 있지만 외부에 영향을 주지 않습니다
void == 값을 반환하지 않음
라는 의미라고 생각하시면 됩니다
함수를 호출하고 싶다면?
void type 이기때문에
함수명() 호출하면 됩니다
다음으로 함수에 인자(input / paramter) 및 매개변수가 있고
return값이 없는 경우에 대해서 설명하고자 합니다
그리고 마지막 hometown매개 변수 앞에 언더바(_)를 붙이면
와일드 카드 패턴이 되어서
아규먼트의 변수가 보이지 않고 바로 리터럴을 넣을 수 있게 되어있습니다
매개변수의 특징에 대해서 알아보고자 합니다
이렇게 매개변수 값이 세팅되어 있다면
함수를 호출 할 때 () (아규먼트)이렇게 두가지로 사용이 가능하며
매개변수가 늘어날 수록 사용할 수 있는 가지수가 더 늘어난답니다
그리고 다른 값을 호출하게 되면 기본 default매개변수의 값에서 변경된답니다
내부에서 매개변수를 활용하는 경우에 대해서 좀 더 알아보고자 합니다
매개변수를 변경하려고 하면 오류가 나는것을 볼 수 있습니다
그래서 지역변수 n을 하나 만들어주고 num값을 넣어준 후
지역변수 n 가지고 연산을 하면
위의 오류를 해결할 수 있습니다
다음으로 함수가 리턴이 있는 경우에 대해서 알아보고자 합니다
return value가 있는 경우
return 이라는 키워드를 사용해야합니다
여기 이미지에서도 알 수 있듯이
return value가 있는 함수는
반드시 반환 타입을 기재하고
{} 닫기전
return + 반환 타입과 동일한 타입 데이터를 넣어주어야 합니다
마지막으로 매개변수와 return value 두개 모두 있는
경우에 대해서 알아보고자 합니다
보통 사칙연산을 많이 사용하게 되는데요
이렇게 사칙연산을 만들어볼 수 있습니다
여기서 매개변수를 num1: Double, num2:Double, operation: Character이라고 할 수 있으며
argument 함수 호출 할 때 실제 값을 의미합니다
여기서 사칙연산 operation값에 따라서 switch 조건에 맞는 케이스에 들어가고 return 하는걸 볼 수 있습니다
만약 if문으로 했을 때 4가지의 if 와 if else 조건문이 나오는걸 알 수 있고 return을 만나자말자
함수가 종료되는걸 알 수 있습니다
여러개 갯수가 정해지지않은 파라미터를 사용할 수 있을까??
사웅 가능합니다
사용이 가능하며
여기서 헷갈릴 수 있는점은
파라미터에...이 들어갔으니
아규먼트에도 범위 연산자를 사용해도 괜찮지 않을까?..라는 생각을 가질 수 있습니다
Double 형이나 Int형 둘 다 불가한것으로 나타납니다
그래서 유의해서 사용하세요~~
Swift 함수에서 신기한 점들이 많은데용
매개변수에 대해 외부에서 사용되는 이름과 함수 내부에서 사용되는 이름을 분리하여 사용할 수가 있습니다
이렇게 이름을 분리해서 사용하는 기능을
아규먼트 레이블
라고 합니다
아규먼트 레이블을 사용하는 이유는 매개변수를 명확하게 식별하도록 이름을 지을 수 있으며
함수의 사용성과 가독성을 높일 수 있습니다
코드를 통해서 알아봅시다!
함수안에 함수를 넣을 수가 있다!!?
네 넣을 수 있답니다 :)
한 번만 호출 할 수도 있겠지만
계속 호출 하게 한다면??
함수 재귀함수 라고 생각하면 됩니다
예시로 이렇게 코드를 작성해 볼 수 있답니다
무한 루프에 빠지게 되므로 실제로 실행하게되면 런타임 에러가 발생하게 됩니다
무한 루프에 빠지지 않게 하려면 반드시 조건을 추가해야한다는점!
그리고 지역변수가 아닌 외부변수를 가지고 와서 함수 내에서 사용하려면
변수 정의를 함수 실행전에 미리 초기화를 반드시 해야한다
그렇지 않으면 이렇게 오류가 발생하게 된다
오류를 방지하기 위해서 반드시 함수 실행전에 변수의 초기화를 끝내야한다
그래서 보통 변수명을 최상단에 올리고 함수 실행전에 초기화를 끝내는 코드가
알맞다
이렇게 수정된 변수가 초기화
완료 후 제대로 출력되는걸 확인할 수 있다
함수 내에서 변수를 직접 수정하도록 하는 키워드
inout
swift 언어에서는 inout으로 사용하고 있어요
타언어를 배우시면 알겠지만
함수같은경우 직접적으로 값을 변경할 수 없기에
변경하려면 키워드를 사용하여
메모리 주소까지 (즉 집 안에 있는 물건을) 접근해서
값을 변경하도록 한다
라는 의미입니다
우선 입출력 파라미터는 내부적으로
copy-in, copy-out 메모리 모델을 사용하지만
실제 원본이 전달된다고 생각하면 되고
그래서 값을 복사해서 함수 바디 내부로 전달하여
함수가 종료될 때 아규먼트로 전달한 변수에 복사하게 됩니다
(함수 바디 내부에서 외부로 복사되어 전달)
일반적인 함수는
즉 그냥 메모리 안에 있던 값이 직접 움직이는게 아니라
한 번 복사된다 라는 점입니다
let / Literal을 전달하는것은 불가능 합니다
그리고 함수에서 배웠을 때 기본값 선언을 허용한다지만
inout 키워드가 사용되면 허용하지 않습니다
그리고 가변파라미터를 선언하는것은 불가능합니다
즉 다시 말해
inout키워드가 쓰이지 않으면 매개변수의 값이 변경되더라도
호출하는 쪽의 변수는 영향을 주지 않는답니다
위에서 볼 수 있듯이
inout을 사용하게되면
함수 내부에서 let으로 알고있던 파라미터 a와 b가 서로 수정을
할 수 있는 상태로 변경되는걸 확인할 수 있습니다
그리고 함수를 실행할 때
아규먼트앞에 &가 붙는걸 확인할 수 있습니다
함수 정리는 클래스와 구조체를 배운 후 2탄으로 찾아보겠습니다
읽어주셔서 감사합니다
혹여나 잘못된 부분이 있으면 꼭 댓글로 남겨주세요!
'Swift' 카테고리의 다른 글
Swift | class(클래스)와 struct(구조체)에 관하여 - 2 property (저장 프로퍼티 / 계산 프로퍼티) (0) | 2024.05.14 |
---|---|
Swift | class(클래스)와 struct(구조체)에 관하여 - 1 (0) | 2024.05.14 |
Swift | Optional에 관하여 (0) | 2024.05.13 |
Swift | Collection (컬렉션)에 관하여 4 - Tuple (0) | 2024.05.11 |
Swift | Collection (컬렉션)에 관하여 3 - Dictionary (0) | 2024.05.11 |