1. C:/Program Files (x86)/Arduino/libraries/DHT11 폴더를 생성 2. 다운로드한 dht11.h, dht11.cpp 파일 새로 생성한 폴더로 복사 3. 아두이노 개발환경에서 새로 설치한 라이브러리를 인식시키기 위해서는 아두이노 개발환경 프로그램을 종료하고 다시 시작함
만약 다음과 같이 Bean으로 만들 클래스 내부에 로깅, 트랜잭션, 실제 코드인 비즈니스 로직이 함께 있다고 생각해보자. 로깅, 트랜잭션, 비즈니스 로직 순서대로 작동하겠지만 이는 좋은 코드라고 할 수 없다. 따라서 로깅, 트랜잭션과 비즈니스 로직을 분리하기 위해 AOP가 존재한다
AOP는 다음 그림처럼 선처리, 후처리(런타임시 짜집기함)를 가능하게 지원하기 때문에 메인 Bean을 만드는 클래스를 따로 두고 로깅, 트랜잭션을 선처리 후처리로 다음과 같은 구조를 만드는 것이다.
다음 그림처럼 a.f()가 실직적인 타겟이되는 joinpoint가 되고 그림 앞에 보라색, 주황색이 선처리 후처리를 담당하는 어드바이스가 된다. 어드바이스는 joinpoint는 Pointcut이 가리키게 된다
다음 그림을 보면 조금더 이해하기 쉽다
2. AOP실습
#1) spring-aspect를 이용한 실습
1. pom.xml dependency추가
다음과 같은 디펜던시를 추가하면, Maven Dependencies에 spring-aspects라이브러리가 추가된 것을 확인할 수 있다.
public class Logger{
public void aboutToSound() {
System.out.println("Before: about to sound");
}
}
3. animal.xml Namespaces 수정 및 aop추가
다음과 같이 Namespaces에 aop를 추가한다
aop추가를 완료하였다면 다음과 같은 코드를 추가한다 <aop:aspect ref="Logger">를 통해 Logger클래스를 Aspect로 이용하겠다는 의미이며, <aop:pointcut expression="execution(void kr.ac.hansung.helloDI.*.sound())" id="selectSound" />를 통해 helloDI패키지의 sound() 함수를 joinpoint로 지정하겠다는 의미이다. 이때 *은 와일드카드로서 어떤 클래스든 상관없다는 의미를 가진다. <aop:before method="aboutToSound" pointcut-ref="selectSound" />는 before어드바이스를 추가하겠다는 의미로 aboutToSound라는 메서드를 이용하며 ref로는 위에 선언한 pointcut의 id를 가진다. 따라서 pointcut은 jointpoint를 가르키고 advice는 그 pointcut을 가리킨다
다음과 같이 Logger 클래스를 수정한다 @Aspect로 클래스가 Aspect라는 걸 명시하고 @Pointcut을 통해 sound() 메서드를 joinpoint로 지정하겠다는 것을 명시하고 @Before로 이전 어드바이스를 추가한다.
@Aspect
public class Logger{
@Pointcut("execution(void kr.ac.hansung.helloDI.*.sound()")
private void selectSound() {}
@Before("selectSound()")
public void aboutToSound() {
System.out.println("Before: about to sound");
}
}
평상시는 NC와 COM단자가 연결되어 있고, SIG핀으로 전류가 흐를 시 NO와 COM단자가 연결된다.
2. 릴레이 사용법
고 전압을 사용할 시 전원을 모두 제거하고 사용해야 하고 되도록 사용방법만 익히고 실제로 해보지 않는 걸 추천합니다.
만약 다음 그림과 같이 연결되어있다면 평상시에는 NC와 COM이 연결되어있기 때문에 현재 NO, COM이 연결된 아래 그림은 전구에 불이 켜지지 않을 것이다 하지만 7번 핀에 전류가 흐를 경우 NO와 COM이 연결되므로 전구에 불이 켜질 것이다. 이처럼 낮은 전류로 높은 전류를 컨트롤하기 위해 릴레이를 사용한다
최장, 최단 자주 사용했던 dfs를 이용하여 해결하면 될것이라고 생각했으나 기존 2차원 배열을 활용하던 방법과 달리 그래프를 어떤 방식으로 해결해야하는지에 대한 에러사항이 생김. 공부를 통해 방법을 찾았고 첫번째 방법은 기존 방법과 비슷하게 이차원 배열에, 두번째 방법은 vector를 활용하여 연결리스트 형태로 구현하는 방식이다. 문제의 그래프는 무방향 그래프 이므로 다음과 같이 구현했다
2. 코드
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
int T;
int N;
int M;
int MAX;
bool check[20];
void dfs(int now, int length, vector<int> *value) {
if (length > MAX) {
MAX = length;
}
check[now] = true;
for (int i = 0; i < value[now].size(); i++) {
int next = value[now][i];
if (check[next]) continue;
else {
dfs(next, length + 1, value);
}
}
check[now] = false;
}
int main(int argc, char** argv)
{
cin >> T;
for (int i = 0; i < T; i++) {
cin >> N >> M;
vector<int> v[20];
for (int j = 0; j < M; j++) {
int x;
int y;
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
MAX = 0;
for (int k = 1; k <= N; k++) {
memset(check, false, sizeof(check));
dfs(k, 1, v);
}
cout << "#" << i+1 <<" " <<MAX << endl;
}
}
Analog Digital Converter로서 연속적인 신호인 아날로그 신호를 부호화된 디지털 신호로 변환하는 장치를 의미한다. A\DC는 온도, 압력, 음성, 영상신호, 전압 등을 실생활에서 연속적인 아날로그 신호를 측정하여 그 신호를 컴퓨터로 입력하고 디지털로 변환하는 것을 의미한다. 여기서 우리가 사용할 가변저항이 ADC역할을 한다.
2. 가변저항 실습하기
가변저항과 LED를 사용하여 Analog Input / Output 실습을 진항한다. 실습에 필요한 사전 준비물은 다음과 같다.
가변저항이란 : 저항의 값이 고정되어있지 않고 회전 스위치를 이용하여 임의의 저항값으로 변경이 가능한 저항
가변저항은 다음과 같이 GND, A0, 5V로 구성되어있다
준비가 끝났다면 다음과 같이 회로를 구성한다 5V GND를 가변저항과, LED에 가변저항 A0은 아두이노 A0부분에, LED의 + 부분은 9번핀에 연결한다
회로를 구성하였다면 다음과 같이 코드를 작성한다. 이때 sensorValue를 보면 sensorPin/4를 하는데 4로 나눠주는 이유는 0~1024 까지나 오는 결과 값을 analogRead에 맞게 0~255로 바꾸기 위해 4로 나눠주는 것이다
int sensorPin = A0;
int led = 9;
void setup()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop()
{
int sensorValue = 0;
sensorValue = analogRead(sensorPin)/4;
analogWrite(led, sensorValue);
Serial.println(sensorValue);
delay(10);
}