macOS 에서 리산테크 AVR FLASHER 10 사용하기

![img_1](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh_UQMMViB7Of1FnJHfsB5xeHz97bHSsjJk1JtteJCBYDswq109E_WFqRIsOuYLcGFQ2UXLdkERQHWFspN9JUUzCywiamd4JVcXVp3fPrjd0kMElJ2wlAC6fZlICVxuw6JV3bSRDRQBpITNEQgEWaCBStmQwkSV9yVxjOcZUX_XTVnxlxohNqYlUvRKls/s4000/KakaoTalk_Photo_2025-01-04-00-14-17.jpeg) AVR 프로그래밍에 주로 사용하는 리산테크의 AVR FLASHER 10 제품이다. 총 10개의 서로다른 펌웨어를 저장하여 PC 없이도 타겟 장치의 전원으로 펌웨어 다운로드가 가능하다. 펌웨어 다운로드가 고속으로 이루어지기 때문에 아주 편하다. 최근 윈도우 데스크탑 보다 맥북으로 작업을 하는 상황이 많아지면서 이 장비를 사용하는데에 소프트웨어 지원이 윈도우만 되기때문에 불편함을 격고 있었다. 이것때문에 윈도우 노트북을 장만하는건 말이 안되는거 같고 그렇다고 매번 데스크탑을 켜는것도 불편하고 고민만 하고 있었다. 예전에는 부트캠프를 사용해 윈도우 용 프로그램을 쉽게 사용할수 있었지만 맥북이 애플실리콘을 사용하면서 이런점은 살짝 불편해 졌다고 볼수도있다. 호환성이 많이 좋아졌다고 하지만 예전에 Whisky로 시도했다가 실패한 경험이 있었기 때문에 큰 기대는 하지 않으려고했다. 아직 가상화는 시도해보지 않았는데 UTM 은 좀 쓰기가 불편했고 Parallels 는 과금방식이 전부터 마음에 들지 않았다. 사실 개인 사용 목적으로는 VMWare가 무료이기 때문에 다른 선택지가 없다. ![img_2](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl6Piz058YvIQ1Wv-lqH-lgM7cpMD1KP4Qps0jIAQ2KPVy8mK51ecO-iCA4eH3teAte-Kk...

함수형 프로그래밍

## 함수형 프로그래밍(functional programming)
함수형 프로그래밍은 프로그래밍 방법론 중 하나로, 수학적 함수의 개념을 기반으로 한다. 상태와 가변 데이터를 최소화하고, 순수 함수를 조합하여 프로그램을 구성합니다. 이는 부수 효과를 줄이고, 코드의 예측 가능성과 재사용성을 높이는 데 중점을 둡니다.

---
## 순수 함수 예제 순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하며, 함수 외부의 상태를 변경하지 않는다. C 언어에서의 예는 다음과 같다. ```c int add(int a, int b) { return a + b; } ```
---
## 순수하지 않은 함수 예제 순수하지 않은 함수는 외부 상태를 변경하거나, 동일한 입력에 대해 다른 출력을 반환할 수 있다. C 언어에서의 예는 다음과 같다 ```c int counter = 0; void increment() { counter++; } ``` 이 함수는 전역 변수 counter의 값을 변경하므로, 외부 상태에 영향을 미치는 순수하지 않은 함수이다.
---
## 함수형 프로그래밍의 장점 - 가독성 향상: 순수 함수와 불변성을 강조하여 코드의 이해와 예측이 용이하다 - 디버깅 용이: 부수 효과가 없으므로, 함수 단위 테스트와 디버깅이 수월하다. - 병렬 처리 효율성: 상태 공유를 최소화하여 동시성 문제를 줄이고, 병렬 처리를 효율적으로 수행할 수 있다.
---
## 함수형 프로그래밍의 예 C 언어는 함수형 프로그래밍을 직접 지원하지 않지만, 함수 포인터와 고차 함수를 활용하여 일부 개념을 구현할 수 있다. 예를 들어, 배열의 각 요소에 함수를 적용하는 map 함수를 다음과 같이 정의할 수 있다. ```c void map(int* array, int length, int (*func)(int)) { for (int i = 0; i < length; i++) { array[i] = func(array[i]); } } int square(int x) { return x * x; } int main() { int numbers[] = {1, 2, 3, 4, 5}; int length = sizeof(numbers) / sizeof(numbers[0]); map(numbers, length, square); for (int i = 0; i < length; i++) { printf("%d ", numbers[i]); } return 0; } ``` 이 예제에서 map 함수는 배열의 각 요소에 square 함수를 적용하여, 함수형 프로그래밍의 일부 패턴을 구현하고 있다. 함수형 프로그래밍에서는 for나 while 같은 반복문 대신 map, filter, reduce 같은 고차 함수(Higher-Order Functions)를 사용하여 데이터를 변환하거나 처리할 수 있다. 이 방식은 코드의 가독성을 높이고, 반복문의 부수 효과를 줄여 함수형 프로그래밍의 장점을 살려준다.
---
## map의 개념 map 함수는 배열의 각 요소에 함수를 적용하여 새 배열을 반환하는 고차 함수이며, 원래의 배열은 변경되지 않는다. map을 사용하면 전통적인 반복문과 다르게 상태를 변경하지 않고 불변성을 유지할수 있다.
---
## map을 사용한 기본 예제 ### 전통적인 반복문 예제 ```c void square_array(int* input, int* output, int length) { for (int i = 0; i < length; i++) { output[i] = input[i] * input[i]; } } int main() { int input[] = {1, 2, 3, 4, 5}; int output[5]; int length = sizeof(input) / sizeof(input[0]); square_array(input, output, length); for (int i = 0; i < length; i++) { printf("%d ", output[i]); } return 0; } ``` ### map을 사용한 방식 ```c void map(int* input, int* output, int length, int (*func)(int)) { for (int i = 0; i < length; i++) { output[i] = func(input[i]); } } int square(int x) { return x * x; } int main() { int input[] = {1, 2, 3, 4, 5}; int output[5]; int length = sizeof(input) / sizeof(input[0]); // map을 사용해 배열의 각 요소에 square 함수 적용 map(input, output, length, square); for (int i = 0; i < length; i++) { printf("%d ", output[i]); } return 0; } ```
---
### 코드 동작 설명 - map 함수 - input 배열을 받아 각 요소에 대해 func 함수를 실행하고, 결과를 output 배열에 저장 - func는 고차 함수로, 매핑될 함수를 파라미터로 전달 - square 함수 - 주어진 숫자를 제곱하는 순수 함수 - map 내부에서 호출되며 배열의 각 요소에 적용 - 출력 결과 - input 배열 [1, 2, 3, 4, 5]의 각 요소가 square 함수에 의해 제곱되어 output 배열 [1, 4, 9, 16, 25]이 출력
---
### map 사용의 장점 - 코드 간결성: map은 반복문에 비해 더 간단하고 가독성이 높다 - 재사용 가능성: 다양한 변환 함수(square, increment 등)를 쉽게 교체하여 사용할 수 있다 - 불변성 유지: 원래 배열은 변경되지 않고, 결과를 새로운 배열에 저장 - 부수 효과 제거: 반복문처럼 전역 변수나 상태를 변경하지 않는다.
---

Comments

Popular posts from this blog

[POE] - 패스 오브 엑자일 획득키 F 의 사용법 (Path of Exile)

[Arduino] - HC-06를 이용해 PC 와 Arduino 블루투스 연결

[Python] - 블루투스 모듈 HC-06의 MAC 주소를 이용하여 통신 포트 찾기