Posted by 세상을 살아가는 사람
,

'자바' 카테고리의 다른 글

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
Posted by 세상을 살아가는 사람
,

다음과 같이 구구단을 출력하는 프로그램을 작성하여야 한다.

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
Posted by 세상을 살아가는 사람
,
protected 접근 제어자는 클래스에서는 사용을 하지않고, 멤버변수와 매소드에서 사용을 한다. protected를 선언한 클래스를 상속을 받은 클래스에게는 public으로 동작을 하고, 그외 클래스에게는 private로 동작을 한다.

Posted by 세상을 살아가는 사람
,

자바 라벨 제어문

자바 2017. 5. 12. 19:22
자바의 라벨 제어문은 continue와 break와 같이 연계하여 사용이 된다.
이중 반복문에서, 어떤 조건에서 이중 반복문을 벗어나거나 바깥쪽 반복문으로 벗어나도록 하기 위하여 라벨을 사용한다.

// Label을 이용한 continue문 프로그램 예제

public class LabelContinue {
    public static void main(String[] args) {
        jump: for(int x = 1;x <= 7;x++) {
            System.out.println("x 값 = " + x);
            for(int y = 1;y <= 5;y++) {
                System.out.println("y 값 = " + y);
                if(x <= 2)
                    continue jump;
                else if(x <= 4)
                    break jump;
                System.out.println("x = " + x + " : y = " + y);
            }
            System.out.println("x 값 = " + x);
        }
        System.out.println("프로그램 종료");
    }
}

실행 결과는 다음과 같다.

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
Posted by 세상을 살아가는 사람
,
메모장으로 Java 프로그래밍을 할 때 한글처리에 대한 어려움이 있다.
다음과 같은 프로그램을 메모장으로 작성하고

// 한글 주석을 가진 자바 프로그램
/* 주석 */

public class HelloJava {
  public static void main(String args[]) {
    System.out.println("첫 번째 자바 프로그램");
  }
}

메모장 저장 방법은 
파일 형식으로 "모든 파일"을 선택하고, 인코딩을 "UTF-8"로 선택한 후
파일이름을 "HelloJava.java"로 저장합니다.

그리고 나서 다음과 같이 compile을 하면

C:> javac -encoding utf-8 HelloJava.java

FirstJava.java:1: error: illegal character: '\ufeff'
?// 첫번째 자자 프로그램
^
1 error

와 같은 error가 발생한다.

그래서 다른 블로그 http://pk09.tistory.com/entry/Android-Studio-102-error-illegal-character-ufeff-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0를 참조하니

유니코드 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
Posted by 세상을 살아가는 사람
,
객체를 상속한 자식 클래스는 부모로부터 상속을 받은 매소드가 있다. 자식 클래스는 이 매소드를 사용할 수도 있지만 자식의 고유 기능을 재정의 할수도 있다. 이와 같이 부모로부터 상속을 받은 매소드를 재정의하여 사용하는 것을 매소드 오버라이딩(override)라고 한다.
인자로 정의된 것과 반환 유형은 변하지 않아야 한다.

'자바' 카테고리의 다른 글

자바 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
Posted by 세상을 살아가는 사람
,

자바 접근 제어자

자바 2017. 4. 5. 12:15
- 클래스, 멤버변수, 매소드에 대한 접근 권한 설정
- 종류 : public, protected, default, private
- public : 어디서든지 접근이 가능
- protected : 외부 클래스에서는 접근이 허용되지 않으며, 상속받은 클래스에서 접근 가능. 멤버변수와 매소드에서 지원.
- private : 상속받은 클래스에서도 접근이 허용되지 않음. 선언된 클래스내에서만 접근 가능.
- default : 접근 제어자를 사용하지 않을 경우 적용되는 접근 권한. 같은 패키지내에서는 접근이 가능하나 외부 클래스에서는 접근이 허용되지 않음.

private으로 선언하면 외부 클래스에서 접근이 허용되지 않으므로, "정보 은닉"과 같은 객체지향의 하나의 특성을 가진다. 보통 멤버는 private로 선언하여, 외부에서 직접 접근하지 못하게 은닉하고, 멤버를 변경하기 위한 매소드를 public으로 선언하여 간접적으로 값을 변경할 수 있다. 또한 매소드를 통한 접근은 다양한 부가 기능을 추가할수 있어 효과적이다.

'자바' 카테고리의 다른 글

자바 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
Posted by 세상을 살아가는 사람
,

한 학원에서 교재로 쓰고 있어서 어떤 책인지 찾아보았다. 괜찮은 것 같은데, 지은지가 오래되어 고민이다.

내가 가지고 있는 책과 비슷한 연도에 나온 것이라 최신 기술을 반영하지 못하고 있는 것 같아...



Posted by 세상을 살아가는 사람
,

나는 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에 대한 처리 함수와 입력 파라미터 파싱을 완료하였다. 이후 실제 라즈베리파이에 적용하여 기능을 개발하는 것이 필요하다.

Posted by 세상을 살아가는 사람
,