'자바' 카테고리의 다른 글
자바의 정석 4-12 구구단의 일부분 출력 (0) | 2022.07.13 |
---|---|
PC 환경변수란? (0) | 2022.07.13 |
디자인 패턴 -전략 패턴 (0) | 2022.07.10 |
자바의 정석 연습문제 chap04-12 문제풀이 (0) | 2022.07.08 |
자바의 정석 연습문제 풀이 3-1 중 (0) | 2022.06.29 |
자바의 정석 4-12 구구단의 일부분 출력 (0) | 2022.07.13 |
---|---|
PC 환경변수란? (0) | 2022.07.13 |
디자인 패턴 -전략 패턴 (0) | 2022.07.10 |
자바의 정석 연습문제 chap04-12 문제풀이 (0) | 2022.07.08 |
자바의 정석 연습문제 풀이 3-1 중 (0) | 2022.06.29 |
PC 환경변수란? (0) | 2022.07.13 |
---|---|
디자인 패턴 - 옵저버 패턴 (0) | 2022.07.11 |
자바의 정석 연습문제 chap04-12 문제풀이 (0) | 2022.07.08 |
자바의 정석 연습문제 풀이 3-1 중 (0) | 2022.06.29 |
자바 protected 접근 제어자 (0) | 2017.05.18 |
다음과 같이 구구단을 출력하는 프로그램을 작성하여야 한다.
2*1=2 3*1=3 4*1=4
2*2=4 3*2=6 4*2=8
2*3=6 3*3=9 4*3=12
5*1=5 6*1=6 7*1=7
5*2=10 6*2=12 7*2=14
5*3=15 6*3=18 7*3=21
8*1=8 9*1=9
8*2=16 9*2=18
8*3=24 9*3=27
이를 위해서는 다음과 같은 반복문을 만족하도록 x와 y의 규칙을 정하여야 한다.
package chap04.verify;
public class Exercise4_12 {
public static void main(String[] args) {
for(int i = 1; i < 10;i++) {
for(int j = 1;j <= 3;j++) {
int x = ?;
int y = ?;
if(x == 10) { // 10단은 제외
break;
}
System.out.print(x + "*" + y + "=" + x * y + "\t");
}
System.out.println();
if(i % 3 == 0) {
System.out.println();
}
}
}
}
이를 위해 i, j와 x, y의 관계표를 작성하면 다음과 같다.
i, j와 x, y의 연관관계를 분석해 보면 위와 같은 관계식이 도출된다.
이를 코드로 나타내면 다음과 같다.
package chap04.verify;
public class Exercise4_12 {
public static void main(String[] args) {
for(int i = 1; i < 10;i++) {
for(int j = 1;j <= 3;j++) {
int x = 3*((i-1)/3)+j+1;
int y = (i % 3 == 0)? 3 : i % 3;
if(x == 10) {
break;
}
System.out.print(x + "*" + y + "=" + x * y + "\t");
}
System.out.println();
if(i % 3 == 0) {
System.out.println();
}
}
}
}
실행결과는 다음과 같다.
디자인 패턴 - 옵저버 패턴 (0) | 2022.07.11 |
---|---|
디자인 패턴 -전략 패턴 (0) | 2022.07.10 |
자바의 정석 연습문제 풀이 3-1 중 (0) | 2022.06.29 |
자바 protected 접근 제어자 (0) | 2017.05.18 |
자바 라벨 제어문 (0) | 2017.05.12 |
자바의 정석 연습문제 chap04-12 문제풀이 (0) | 2022.07.08 |
---|---|
자바의 정석 연습문제 풀이 3-1 중 (0) | 2022.06.29 |
자바 라벨 제어문 (0) | 2017.05.12 |
utf-8로 저장된 자바 파일 에러 방지 (0) | 2017.05.10 |
자바 super와 this (0) | 2017.04.06 |
실행 결과는 다음과 같다.
x 값 = 1
y 값 = 1
x 값 = 2
y 값 = 1
x 값 = 3
y 값 = 1
프로그램 종료
x 값이 2보다 작거나 같으면 바깥쪽 while 문으로 continue가 수행이 되고
x 값이 3일 경우 바깥쪽 while 문으로 break가 수행이 되어 while 문이 종료되고 프로그램 종료가 출력됨을 확인할 수 있다.
자바의 정석 연습문제 풀이 3-1 중 (0) | 2022.06.29 |
---|---|
자바 protected 접근 제어자 (0) | 2017.05.18 |
utf-8로 저장된 자바 파일 에러 방지 (0) | 2017.05.10 |
자바 super와 this (0) | 2017.04.06 |
자바 매소드 오버라이딩 (0) | 2017.04.05 |
유니코드 BOM이라는 것을 파일 맨앞에 표시를 해주는데, 그것을 javac compiler가 인식하지 못해서 발생하는 것이라고 합니다.
그리고 해결방법은 다른 텍스트 에디터를 사용하라고 해서
wordpad로 작업을 해 보았습니다.
같은 문장을 작성한 후 저장을
파일 형식은 "유니코드 택스트 형식"으로 하고, 파일 이름을 "Hello.java"로 하여 저장한 후
C:> javac HelloJava.java로 compile을 하고
C:> java HelloJava로 실행하면 정상 수행된다.
자바 protected 접근 제어자 (0) | 2017.05.18 |
---|---|
자바 라벨 제어문 (0) | 2017.05.12 |
자바 super와 this (0) | 2017.04.06 |
자바 매소드 오버라이딩 (0) | 2017.04.05 |
자바 접근 제어자 (0) | 2017.04.05 |
자바 protected 접근 제어자 (0) | 2017.05.18 |
---|---|
자바 라벨 제어문 (0) | 2017.05.12 |
utf-8로 저장된 자바 파일 에러 방지 (0) | 2017.05.10 |
자바 super와 this (0) | 2017.04.06 |
자바 접근 제어자 (0) | 2017.04.05 |
자바 protected 접근 제어자 (0) | 2017.05.18 |
---|---|
자바 라벨 제어문 (0) | 2017.05.12 |
utf-8로 저장된 자바 파일 에러 방지 (0) | 2017.05.10 |
자바 super와 this (0) | 2017.04.06 |
자바 매소드 오버라이딩 (0) | 2017.04.05 |
한 학원에서 교재로 쓰고 있어서 어떤 책인지 찾아보았다. 괜찮은 것 같은데, 지은지가 오래되어 고민이다.
내가 가지고 있는 책과 비슷한 연도에 나온 것이라 최신 기술을 반영하지 못하고 있는 것 같아...
아이오닉 인 액션, MANNING (0) | 2017.03.16 |
---|---|
열혈강의 서블릿/JSP 웹프로그래밍 with HTML+CSS+XML+JavaScript, 김승현저, 프리렉 (0) | 2017.03.16 |
한권으로 끝내는 정규표현식, 김지원역, 한빛미디어 (0) | 2017.03.16 |
열혈강의 C++ 언어본색, 김역지음, 프리렉 (0) | 2017.03.16 |
이것이 C++이다, 최호성지음, 한빛미디어 (0) | 2017.03.16 |
나는 webiopi라는 라즈베리파이 상에서 web으로 GPIO를 제어하는 프로그램을 참조하여
자바 스프링으로 유사한 기능을 제어하려고 하고 있다.
webiopi는 REST API를 사용하여 GPIO를 제어하고 있어서 자바 스프링에서 REST API를 어떻게 처리하는지 파악하고 있다.
이 글에서는 webiopi에서 제공하는 REST API 기능에 대하여 자바 스프링으로 처리하기 위한 전 단계로 REST API 처리를 위한 Controller, Method 및 입력 파라미터 파싱에 대하여 알아본다.
1. Get GPIO function
- HTTP GET /GPIO/(gpioNumber)/function
package com.talanton.rest.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/GPIO")
public class GpioController {
@RequestMapping(value="/{gpioNumber}/function", method=RequestMethod.GET)
public ResponseEntity<String> getFunction(@PathVariable("gpioNumber") Integer gpioNumber) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : in";
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
}
2. Set GPIO function
- HTTP POST /GPIO/(gpioNumber)/function/("in" or "out" or "pwm")
@RequestMapping(value="/{gpioNumber}/function/{value}", method=RequestMethod.POST)
public ResponseEntity<String> postFunction(@PathVariable("gpioNumber") Integer gpioNumber, @PathVariable("value") String value) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : " + value;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
3. Get GPIO value
- HTTP GET /GPIO/(gpioNumber)/value
@RequestMapping(value="/{gpioNumber}/value", method=RequestMethod.GET)
public ResponseEntity<String> getValue(@PathVariable("gpioNumber") Integer gpioNumber) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : 0";
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
4. Set GPIO value
- HTTP POST /GPIO/(gpioNumber)/value/(0 or 1)
@RequestMapping(value="/{gpioNumber}/value/{value}", method=RequestMethod.POST)
public ResponseEntity<String> postValue(@PathVariable("gpioNumber") Integer gpioNumber, @PathVariable("value") Integer value) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : " + value;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
5. Output a single pulse
- HTTP POST /GPIO/(gpioNumber)/pulse/
@RequestMapping(value="/{gpioNumber}/pulse", method=RequestMethod.POST)
public ResponseEntity<String> postPulse(@PathVariable("gpioNumber") Integer gpioNumber) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : " + "pulse";
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
6. Output bit sequence
- HTTP POST /GPIO/(gpioNumber)/sequence/(delay),(sequence)
@RequestMapping(value="/{gpioNumber}/sequence/{delay},{sequence}", method=RequestMethod.POST)
public ResponseEntity<String> postSequence(@PathVariable("gpioNumber") Integer gpioNumber,
@PathVariable("delay") Integer delay, @PathVariable("sequence") String sequence) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : " + "sequence : " + delay + " : " + sequence;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
7. Output PWM with a duty cycle ratio
- HTTP POST /GPIO/(gpioNumber)/pulseRatio/(ratio)
// 소수점 데이터를 입력받기 위한 방법 {variable:.+}
// 참고 : http://stackoverflow.com/questions/16332092/spring-mvc-pathvariable-with-dot-is-getting-truncated
@RequestMapping(value="/{gpioNumber}/pulseRatio/{ratio:.+}", method=RequestMethod.POST)
public ResponseEntity<String> postPulseRatio(@PathVariable("gpioNumber") Integer gpioNumber,
@PathVariable("ratio") Float ratio) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : pulseRatio : " + ratio;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
8. Output PWM with an angle for servos
- HTTP POST /GPIO/(gpioNumber)/pulseAngle/(angle)
@RequestMapping(value="/{gpioNumber}/pulseAngle/{angle}", method=RequestMethod.POST)
public ResponseEntity<String> postPulseAngle(@PathVariable("gpioNumber") Integer gpioNumber,
@PathVariable("angle") Integer angle) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : pulseAngle : " + angle;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
9. Call a macro on the server
- HTTP POST /macros/(macro)/(args)
왜냐하면 URL이 /macros로 시작하기 때문이다. 기존의 GpioController는 REST API URL이 /GPIO로 시작하였기 때문에 사용할 수 없고, 새로운 MacroController를 사용한다.
package com.talanton.rest.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/macros")
public class MacroController {
@RequestMapping(value="/{macro}/{args}", method=RequestMethod.POST)
public ResponseEntity<String> macroFunction(@PathVariable("macro") String macro, @PathVariable("args") String args) {
ResponseEntity<String> entity = null;
String result = "macroFunction : " + macro + ", " + args;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
}
10. Get full GPIO state/configuration
- HTTP GET /*
/* 라는 URL을 처리하기 위하여 새로운 RestController StateController를 정의한다.
package com.talanton.rest.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("")
public class StateController {
@RequestMapping(value="*", method=RequestMethod.GET)
public ResponseEntity<String> gpioState() {
ResponseEntity<String> entity = null;
String result = "getState";
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
}
이제는 Webiopi에서 제공하는 REST API에 대한 처리 함수와 입력 파라미터 파싱을 완료하였다. 이후 실제 라즈베리파이에 적용하여 기능을 개발하는 것이 필요하다.
Spring 개발 환경 설정(2022-07-23) (0) | 2022.07.23 |
---|---|
자바 웹 서비스 개발 포트폴리오 발표(2022.06.16) (0) | 2022.07.16 |
트위터 REST Open API 목록 (0) | 2017.03.10 |
스프링에서 REST API 제공방법 (1/2) (0) | 2017.03.10 |
정규 표현식에 대한 공부 (0) | 2017.03.09 |