라즈베리파이 원격접속 방법


  • ssh를 사용가능하게 하여 putty로 연결해 원격접속 하는방법


  • xrdp를 설치해 원격데스크톱 연결로 접속하는 방법




1. putty로 ssh 접속하기 위해서 ssh를 사용하게 설정해줘야 한다.




2. putty 다운로드 및 접속





login id : pi / password : raspberry 로 접속가능하다.




sudo apt-get install xrdp 입력 설치 후 


ifconfig 입력




ip 192.168.0.12 확인 후


원격 데스크톱 연결로 들어가 ip를 입력하고 접속하면





xrdp 로그인 창이 뜨게 되고 username과 password(초기비밀번호: raspberry) 를 입력하면




실제 라즈베리파이 OS화면이 나타나게 된다.





'전체 > 라즈베리파이' 카테고리의 다른 글

라즈베리파이 준비 및 환경설정  (0) 2017.10.17


1.1 Jquery 사용한 클래스 변경 추가 제거 방법


1
2
3
4
5
6
7
8
9
// 클래스 변경 
$(this).attr('class','class_name');
 
// 클래스 추가 
$(this).addClass("class_name");
 
// 클래스 제거 
$(this).removeClass("class_name");
 
cs

1.2 사용 예시


1
2
3
4
5
6
// 사용 예시
$('#search-btn1').click(function() {
    $('#check-design').addClass("checkbox");
    $('#check-design').removeClass("check-checked");
    return false;
});
cs



2.1 Jquery attr(), prop(), is() 메소드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!doctype html>
 
<head>
  <meta charset="utf-8">
  <title>prop demo</title>
  <style>
  p {
    margin: 20px 0 0;
  }
  b {
    color: blue;
  }
  </style>
  <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
 
 
<input id="check1" type="checkbox" checked="checked">
<label for="check1">Check me</label>
<p></p>
 
<script>
$( "input" ).change(function() {
  var $input = $( this );
  $( "p" ).html(
    ".attr( \"checked\" ): <b>" + $input.attr( "checked" ) + "</b><br>" +
    ".prop( \"checked\" ): <b>" + $input.prop( "checked" ) + "</b><br>" +
    ".is( \":checked\" ): <b>" + $input.is( ":checked" ) + "</b>" );
}).change();
</script>
cs


속성에 대해 prop(), is()는 true, false 를 갖지만 attr()은 checked로 변하지 않는다.


.attr( "checked" ): checked

.prop( "checked" ): false

.is( ":checked" ): false


.attr( "checked" ): checked

.prop( "checked" ): true

.is( ":checked" ): true



2.2 사용 예시


1
2
3
4
5
6
7
8
9
10
11
$('#check-all-1').click(function() {
    if($('#check-all-1').is(':checked'== true) {
        $('#ui-col-cont input[name=check]').each(function(){
            $(this).prop('checked'true);
        });
    } else {
        $('#ui-col-cont input[name=check]').each(function(){
            $(this).prop('checked'false);
        });
    }
});
cs


prop() 를 통해 check 속성의 값을 true, false로 변경하는 것을 확인할 수 있다.






1. 라즈베리파이 3 모델 B ( Raspberry Pi 3 Model B ) 제품과 Micro sdhc 32gb 메모리 구입


2. 메모리 카드에 라즈베리파이3 OS를 설치한다.


https://www.raspberrypi.org/downloads/ 이동 



Raspbian > RASPBIAN STRETCH WITH DESKTOP > download zip 클릭


다운받은 zip 파일을 Win32DiskImager를 이용해 메모리카드 디스크 안에 데이터를 넣는다.


3. 메모리카드를 라즈베리파이 본체 뒷면에 장착한다.


4. 라즈베리파이에 핸드폰 충전기를 연결해 전원을 연결하고 모니터를 연결해 본다.


5. 라즈베리파이 OS가 잘 켜지면 콘솔 창을 킨다.


6. 초기 설정


sudo raspi-config


메모리카드 파티션 크기 조정

Expand Filesystem


비밀번호 재설정

Change User Password


Raspbian 최신버전 업데이트

sudo apt-get update


패키지 업그레이드

sudo apt-get upgrade


한글 설치

sudo apt-get install ibus

sudo apt-get install ibus-hangul

sudo apt-get install ttf-unfonts-core


기본 셋팅을 마친다.


P.S

만약 셋팅 후 문제가 생겨 초기화 하고 싶다면 Micro SD카드를 포맷해야 하는데

sd card formatter 프로그램을 사용하면 쉽게 sd카드를 포맷할 수 있다.



'전체 > 라즈베리파이' 카테고리의 다른 글

라즈베리파이 원격접속 설정  (0) 2017.10.19



1. Visual Studio Code를 설치한다.


2. Visual Studio Code 실행 > 메뉴 > 파일 > 기본설정 > 설정 (control + , (콤마)) > 개인설정 확인 및 변경한다.


3. mtest.ts 작성 



1
2
3
4
5
let mValue : String = "이상현";
let mValue2 : Number = 28;
 
console.log(mValue+" "+mValue2);
 
cs


4. > 보기 > 명령어 팔레트(ctrl shift p) > configure task runner 검색 > others 선택 > 


.vscode 생성 및 tasks.json 생성됨. > 생성된 파일 내용 tasks.json을 다음 내용과 같이 변경 후 저장



1
2
3
4
5
6
7
8
{
    "version""0.1.0",
    "command""tsc",
    "isShellCommand"true,
    "args": ["-p""."],
    "showOutput""silent",
    "problemMatcher""$tsc"
}
cs


tsconfig.json 파일 생성 및 작성하면 ts파일을 자동으로 컴파일해준다.


5. cmd창에서 테스트


javac 는 java를 컴파일하는것, tsc는 ts를 컴파일하는 것




tsc mtest.ts 는 ts파일을 js파일로 컴파일 시키는것이다.




node mtest.js 는 노드는 기본적으로 js파일을 읽을수 있으므로 실행된다.



6. GUI에서 테스트


test.ts // ctrl + shift + b를 눌러 컴파일 하자.

ts파일에서 f5 누르면 nodejs 선택한다.> launch.json 생성된다. > 다시 f5 눌러서 실행시킨다.



다음과 같이 출력결과를 확인할 수 있다.



7. Visual Studio Code로 Git 연동 및 소스파일 커밋 방법


터미널을 켜고 명령어를 입력한다.


7.1. git init


git 시작한다.




7.2. git remote add origin https://github.com/shlee0882/typescript.git


Clone or download 를 눌러 자신의 Github 레파지토리 주소를 적는다.


7.3. 목록에서 변경 내용 스테이징 확인




7.4. git commit -m "커멘트남기기"


7.5. git push origin master


커밋 완료

'전체 > TypeScript' 카테고리의 다른 글

타입스크립트(TypeScript)란?  (0) 2017.10.15


1. 타입스크립트 정의


TypeScript 는 Microsoft에서 개발 및 유지 관리 하며 오픈 소스 프로그래밍 언어이다. 


JavaScript 의 모든 구문과 의미를 지원 하는 동시에 정적 유형 지정 및 ECMAScript의 상위 집합 인 더 풍부한 구문과 같은 몇 가지 추가 기능을 제공한다.


다음 다이어그램은 TypeScript와 ES5, ES2015, ES2016 간의 관계를 보여준다.





Angular 2에서는 JavaScript 와 함께 Angular 1.x와 같은 방식으로 작성할 수 있다. 

그러나 자바스크립트에서 런타임 오류가 발생했을 때 객체 또는 메서드 이름의 철자 오류와 같은 실수에 대해서만 알 수 있다. 


코드를 프로덕션에 배포하기 전에이를 방지하기 위해 많은 단위 테스트를 작성하지만 

웹에서 수많은 오류가 발생해도 웹에서는 그 오류를 내부에서 처리해 잘 구동하게 하여 사용자에게 알리지 않고 넘어가는 경우가 많아

스크립트로 작성시 많은 오류를 알 수 없는데


TypeScript 는 컴파일러에 의한 코드 오타를 처리하는 정적 유형 지정의 이점을 통해  컴파일 타임에 모든 유형 오류를 알린다.


또한 TypeScript의 기본 기능 중 하나인 주석을 사용하면 텍스트 편집기와 IDE가 코드에 대해 더 나은 정적 분석을 수행 할 수 있다. 

이는 더 나은 리팩토링 도구 및 자동 완료 기능을 사용하여 코드를 작성하는 동안 실수를 줄임으로써 생산성을 높일 수 있음을 의미한다.


그러므로 Angular 2 에서는 JavaScript보다 TypeScript를 주력으로 삼고 있고 TypeScript를 사용하면 많은 이점이 있다.


2. 타입스크립트 방식



컴퓨터가 이해하는 방식으로 컴파일 방식과 인터프리터 방식이 있는데


프로그래밍이란 인간과 컴퓨터의 대화인데 컴퓨터는 0과1로만 처리해 알 수 있다.

인간이 소스를 작성하면 그 소스를 컴퓨터가 알아들을 수 있게 번역(컴파일) 해서 처리해야 하는데 이 방식이 컴파일 방식이다.


반면

스크립트에서는 인터프리터 방식을 사용하는데 인간이 작성한 코드를 컴퓨터가 번역(컴파일) 없이 바로 처리하는 것이 인터프리터 방식이다.


그럼 스크립트에서 스크립트로 변환할 수 있을까?


타입스크립트에서 자바스크립트로 컴파일 할 수 있다.


타입스크립트로 작성한 소스내용은 자바스크립트의 소스내용과 동일하게 변하는데


타입스크립트만의 문법이 있다.



3. 타입스크립트 문법


타입스크립트는 변수 선언 시 let 을 사용한고 변수 함수 모두 들어갈 데이터 타입을 Generic처럼 지정해줘야한다.

그 중 자바스크립트에서 보지 못한 추가된 데이터 타입이 있다.


tuple - 복수의 자료형이 가능하다. OR의 의미와 같고 파이프를 사용해 String | Number 등 들어올수 있는 데이터 타입을 지정해줄수 있다.

enum - 열거형 또는 데이터 타입에 사용 - 데이터 타입을 위한 데이터이다.

any - 모든 데이터 타입이 가능하다.

void - 리턴 타입이 없는 함수이다.

never - 특정 값이 절대로 발생 할 수 없을 때 사용한다.


3.1 타입스크립트의 변수



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// test1.ts
let myNum1 : number = 3;
let myNum2 : number = 5;
 
let myStr1: string = "myString";
let myStr2: string = "test";
 
let numArr:Array<number> = [3,5,6];
let numArr2:number[] = [3,4,5];
let numArr3:String[] = ["a","b","c"];
 
let tp : [string, number];
tp = ["1",2];
 
let anyTest : any = "any";
anyTest = 3;
anyTest = true;
anyTest = new Number(3);
// 어떤 데이터가 들어가든 상관없다.
 
let anyArr : any[]  = [1,2,3];
cs


3.2 타입스크립트의 함수



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function setUser():void{
}
// void 넘기지 않겠다.
 
function setUser2():string{
    return "test";
}
 
function testObject(){
    return "abc";
}
 
var strTest = testObject();
// new 예약어 사용 안함. 객체가 아님.
 
var strTest2 = "abc";
console.log(typeof strTest); // string
console.log(strTest === strTest2); // true
 
function testFunc(str:string, num:number):void{
    console.log("str = " + str); // str = 문자열
    console.log("num = "+ num); // num = 330
}
 
testFunc("문자열",330);
cs


3.3 타입스크립트의 인터페이스



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface testIter{
    str : string;
    num : number;
}
 
let AjaxUtil = function(ti:testIter){
    this.print = function(): void{
        console.log(ti.str);
        console.log(ti.num);
    }
}
 
var test1 = {str:"이상현",num:28}
var au = new AjaxUtil(test1);
 
au.print(); // 이상현, 28
cs


3.4 타입스크립트의 클래스와 생성자



1
2
3
4
5
6
7
8
9
10
11
12
13
class Car{
    carName : string;
    constructor(public pCarName:string){ 
        this.carName = pCarName; 
    }
}
 
// 기본생성자는 타입스크립트에서 필수가 아님.
 
let hyundai = new Car("sonata");
let pStr:string = "자동차 이름: ";
pStr += hyundai.carName;
console.log(pStr); // 자동차 이름: sonata
cs


3.5 타입스크립트 파일 > 자바스크립트 파일로 변환


위에 작성되어 있는 코드는 모두 ts파일이다. ts파일을 js로 컴파일하면 다음과 같은 소스가 된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// test1.ts
var myNum1 = 3;
var myNum2 = 5;
var myStr1 = "myString";
var myStr2 = "test";
var numArr = [356];
var numArr2 = [345];
var numArr3 = ["a""b""c"];
var tp;
 
tp = ["1"2];
var anyTest = "any";
anyTest = 3;
anyTest = true;
anyTest = new Number(3);
 
// 어떤 데이터가 들어가든 상관없다.
var anyArr = [123];
function setUser() {
}
 
// void 넘기지 않겠다.
function setUser2() {
    return "test";
}
function testObject() {
    return "abc";
}
var strTest = testObject();
 
// new 예약어 사용 안함. 객체가 아님.
var strTest2 = "abc";
console.log(typeof strTest); // string
console.log(strTest === strTest2); // true
function testFunc(str, num) {
    console.log("str = " + str); // str = 문자열
    console.log("num = " + num); // num = 330
}
 
testFunc("문자열"330);
var AjaxUtil = function (ti) {
    this.print = function () {
        console.log(ti.str);
        console.log(ti.num);
    };
};
 
var test1 = { str: "이상현", num: 28 };
var au = new AjaxUtil(test1);
au.print(); // 이상현, 28
var Car = /** @class */ (function () {
    function Car(pCarName) {
        this.pCarName = pCarName;
        this.carName = pCarName;
    }
    return Car;
}());
 
// 기본생성자는 타입스크립트에서 필수가 아님.
var hyundai = new Car("sonata");
var pStr = "자동차 이름: ";
pStr += hyundai.carName;
console.log(pStr); // 자동차 이름: sonata
//# sourceMappingURL=blogtest.js.map
cs


ts파일을 모두 js형식의 문법형태로 컴파일 하는 것을 볼 수 있다.

ts에는 객체지향이 들어갔으므로 이것을 js로 컴파일하면 js는 인터프리터 방식이므로 바로바로 읽을 수 있다.



인터페이스란 무엇인가? 


인터페이스 예제를 들어 설명하겠다.


1. 유저는 게임을 한다.

2. 유저는 게임들 중의 하나인 오버워치를 플레이 한다.

3. 유저는 게임들 중의 하나인 스타크래프트를 플레이 한다.

4. 오버워치와 스타크래프트는 게임이다.


다음과 같이 정의된 내용을 만들어 보려고 한다.


먼저 OverWatch, StarCraft, User 라는 java파일의 클래스를 만들자.


1
2
3
4
// OverWatch.java
public class OverWatch extends User{
    
}
cs


1
2
3
4
// StarCraft.java
public class StarCraft extends User{
 
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// User.java
public class User {
    
    public static void main(String[] args) {
        
        User user = new User();
        OverWatch overwatch = new OverWatch();
        StarCraft starcraft = new StarCraft();
        
        user.play(overwatch);
        user.play(starcraft);
        
    }
    
    public void play(OverWatch overwatch){
        System.out.println("Game is overwatch / FPS");
    }
    
    public void play(StarCraft starCraft){
        System.out.println("Game is starcraft / Strategy Simulation");
    }
}
cs





User클래스에서 객체를 생성하고

play라는 메소드로 생성한 객체를 argument로 넣는다.


현재는 오버워치와 스타크래프트 딱 2가지만 게임을 추가했지만,


배틀그라운드, 리그오브레전드 등등 여러가지 게임을 추가한다고 해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void play(OverWatch overwatch){
    System.out.println("Game is overwatch / FPS");
}
 
public void play(StarCraft starCraft){
    System.out.println("Game is starcraft / Strategy Simulation");
}
 
public void play(BattleGround battleground){
    System.out.println("Game is battleground / FPS");
}
 
public void play(LOL lol){
    System.out.println("Game is lol / AOS");
}
cs



그러면 다음과 같이 메소드에 대한 인자값이 바뀌어 들어간다는 것을 확인할 수 있다.


게임이라는 객체가 하나하나 추가될때 마다 argument를 계속해서 바꿔주며 메소드에 추가해야하는 문제점이 발생한다.


어떤 게임이 추가되던 argument를 Game이라는 인자로 넣어서 메소드 인자를 다음과 같이 공통으로 빼버리자.


1
2
3
public void play(Game game){
    System.out.println(game.getGame()+" / "+game.getGameType());
}
cs


Game을 공통 인자로 빼기위해선 인터페이스를 생성하여 사용하면 된다.


1
2
3
4
public interface Game {
    public String getGame();
    public String getGameType();
}
cs


인터페이스는 다음과 같이 선언으로 사용할 수 있고

인터페이스 안에 메소드는 body가 없는 선언형태이다.


그럼 이 메소드의 내용은 어디서 알 수 있을까?


이 메소드의 내용은 인터페이스를 상속받는 java파일( OverWatch.java, StarCraft.java )에서 선언하여 채워주면 되는것이다.


인터페이스를 상속받는 모든 java파일은 인터페이스 안의 메소드를 상속받는다.


현재 인터페이스의 메소드는 getGame(), getGameType() 이다.


이 메소드를 인터페이스를 상속받는 OverWatch.java, StarCraft.java 에서 메소드에 대한 내용을 채워줘야 한다는 것이다.


각 java파일에서 인터페이스를 상속받는 방법은 implements이다. implements Game을 선언하면 Game 인터페이스를 상속받는 다는 뜻이다.


그럼 이 파일에 메소드의 내용을 넣어보자.



1
2
3
4
5
6
7
8
9
10
11
// OverWatch.java
public class OverWatch extends User implements Game{
    
    public String getGame(){
        return "Game is OverWatch";
    }
 
    public String getGameType() {
        return "FPS";
    }   
}
cs



1
2
3
4
5
6
7
8
9
10
11
// StarCraft.java
public class StarCraft extends User implements Game{
 
    public String getGame() {
        return "Game is StarCraft";
    }
 
    public String getGameType() {
        return "Strategy Simulation";
    }   
}
cs


그 다음 User.java 의 play 메소드에 인터페이스 인자와 메소드를 넣는다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class User {
    
    public static void main(String[] args) {
        
        User user = new User();
        OverWatch overwatch = new OverWatch();
        StarCraft starcraft = new StarCraft();
        
        user.play(overwatch);
        user.play(starcraft);
        
    }
    
    public void play(Game game){
        System.out.println(game.getGame()+" / "+game.getGameType());
    }
}
cs


어떤 인자를 받느냐에 따라 그 인자가 선언된 java파일의 메소드 내용이 출력하게 된다.


출력 결과


Game is OverWatch / FPS

Game is StarCraft / Strategy Simulation





1. 사전작업


JSON을 사용하기 위해선 json-simple-1.1.1.jar 라는 라이브러리 파일이 필요하다.


maven이나 구글링을 통해 json사용에 필요한 jar 파일을 다운받고 프로젝트 속성 > java build path > Libraries > Add jars를 통해 라이브러리를 추가한다.



2. JSONObject, JSONArray 데이터 입출력 만들기



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.ArrayList;
import java.util.HashMap;
 
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
 
public class JsonTest {
 
    public static void main(String[] args) {
        
        JSONObject jsonObject1 = new JSONObject(); // 중괄호에 들어갈 속성 정의 { "a" : "1", "b" : "2" }
        JSONArray jsonArray1 = new JSONArray(); // 대괄호 정의 [{ "a" : "1", "b" : "2" }]
        JSONObject finalJsonObject1 = new JSONObject(); // 중괄호로 감싸 대괄호의 이름을 정의함 { "c" : [{  "a" : "1", "b" : "2" }] }
 
        jsonObject1.put("이름""잠자리");
        jsonObject1.put("다리갯수""6");
        jsonArray1.add(jsonObject1);
 
        jsonObject1 = new JSONObject();
        jsonObject1.put("이름""사슴벌레");
        jsonObject1.put("다리갯수""6");
        jsonArray1.add(jsonObject1);
        
        finalJsonObject1.put("곤충", jsonArray1);
 
        finalJsonObject1.put("동물""코끼리");
        finalJsonObject1.put("식물""무궁화");
        
        System.out.println(finalJsonObject1);
 
        /* finalJsonObject1 출력값
          
         {  
               "식물":"무궁화",
               "곤충":[  
                          {  
                             "이름":"잠자리",
                             "다리갯수":"6"
                          },
                          {  
                             "이름":"사슴벌레",
                             "다리갯수":"6"
                          }
                       ],
               "동물":"코끼리"
          }
          
         */
        
    }
}
 
cs


다음과 같이 만들수는 있는데 작성하고 보면 


Type safety: The method put(Object, Object) belongs to the raw type HashMap. References to generic type HashMap<K,V> should be parameterized

Type safety: The method add(Object) belongs to the raw type ArrayList. References to generic type ArrayList<E> should be parameterized


노란색경고가 뜨며 Generic을 통해 타입을 지정해 safety하게 데이터입력을 넣어라고 말해주고 있다.


json 형태의 데이터를 DB나 웹서버에서 가져올때는 json데이터를 넣어주지않고 적절하게 가공만 하면 되므로 문제되지 않지만 다음과 같이 직접적으로 Generic 타입 선언 없이 put으로만 일방적으로 넣었을때 경고가 나타난것이다.



3. HashMap을 통해 Generic 데이터를 넣고 JSONObject로 형변환한 데이터 넣기



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.util.ArrayList;
import java.util.HashMap;
 
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
 
public class JsonTest2 {
 
    public static void main(String[] args) {
        
        HashMap<String, Object> myHashMap1 = new HashMap<String, Object>();
        JSONObject jsonObject1 = new JSONObject(); // 중괄호에 들어갈 속성 정의 { "a" : "1", "b" : "2" }
        JSONArray jsonArray1 = new JSONArray(); // 대괄호 정의 [{ "a" : "1", "b" : "2" }]
        JSONObject finalJsonObject1 = new JSONObject(); // 중괄호로 감싸 대괄호의 이름을 정의함 { "c" : [{  "a" : "1", "b" : "2" }] }
        
        myHashMap1.put("이름""잠자리");
        myHashMap1.put("다리갯수""6");
        
        jsonObject1 = new JSONObject(myHashMap1); 
        jsonArray1.add(jsonObject1);
        
        myHashMap1 = new HashMap<String, Object>();
        myHashMap1.put("이름""사슴벌레");
        myHashMap1.put("다리갯수""6");
        
        jsonObject1 = new JSONObject(myHashMap1);
        jsonArray1.add(jsonObject1);
        
        finalJsonObject1.put("곤충", jsonArray1);
        finalJsonObject1.put("동물""코끼리");
        finalJsonObject1.put("식물""무궁화");
        
        System.out.println(finalJsonObject1);
        
        /*
          
         {  
               "식물":"무궁화",
               "곤충":[  
                          {  
                             "이름":"잠자리",
                             "다리갯수":"6"
                          },
                          {  
                             "이름":"사슴벌레",
                             "다리갯수":"6"
                          }
                       ],
               "동물":"코끼리"
          }
          
         */
 
    }
}
cs


다음은 HashMap을 사용해 들어갈 데이터 형식을 Generic <String, Object>로 선언해주어 2번의 노란색 경고를 없앤 코드이다.


출력값은 2번과 3번 모두 동일하다. 



4. String형식의 JSON 데이터를 JSON형식으로 바꾸어 파싱하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
 
public class StringToJson {
 
    public static void main(String[] args) {
        String jsonString1 = "{\"식물\":\"무궁화\",\"곤충\":[{\"이름\":\"잠자리\",\"다리갯수\":\"6\"},{\"이름\":\"사슴벌레\",\"다리갯수\":\"6\"}],\"동물\":\"코끼리\"}";
        JSONParser jsonParser1 = new JSONParser();
        JSONObject jsonObject1;
 
        try {
            
            jsonObject1 = (JSONObject) jsonParser1.parse(jsonString1);
            JSONArray jsonArray1 = (JSONArray) jsonObject1.get("곤충");
      
            for(int i=0; i<jsonArray1.size(); i++){
                System.out.println("곤충"+ i +" : " +jsonArray1.get(i));            
                JSONObject objectInArray = (JSONObject) jsonArray1.get(i);
                System.out.println("Key값은 "+objectInArray.get("이름"));
                System.out.println("Value값은 "+objectInArray.get("다리갯수"));
            }
            /*
             
                곤충0 : {"이름":"잠자리","다리갯수":"6"}
                Key값은 잠자리
                Value값은 6
                
                곤충1 : {"이름":"사슴벌레","다리갯수":"6"}
                Key값은 사슴벌레
                Value값은 6
             
             */
            
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
cs


String 형의 JSON 값을 JSON형으로 바꾸어 파싱을 해 출력하는 코드이다.

파싱을 위해 JSONParser를 사용했고 단계적으로 Array, Object에 접근해 값을 찾아가고 있다.

소스코드 첨부파일

workspace.zip



Iterator를 학습하는 도중


Enumeration과 Iterator를 비교하는 글을 보게 되어 정리하게 되었다.




1. Enumeration이란?


Enumeration은 객체들의 집합(Vector)에서 각각의 객체들을 한순간에 하나씩 처리할 수 있는 메소드를 제공하는 컬렉션이다.


Enumeration 객체는 new 연산자로 생성할 수 없으며, Vector를 이용하여 생성할 수 있다.


Vector 클래스의 elements() 라는 메소드는 객체의 모든 요소들을 Enumeration 객체로 반환한다.



 Enumeration 메소드

 설명

 boolean hasMoreElements()

 Vector로 부터 생성된 Enumeration의 요소가 있으면 true, 아니면 false 반환

 Object nextElement()

 Enumeration 내의 다음 요소를 반환한다. 





2. Iterator란?


Iterator는 Enumeration 클래스와 매우 유사하며 자바의 컬렉션 프레임웍에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 방법이다.




 Iterator 메소드

 설명

 boolean hasNext()

 읽어 올 요소가 남아있는지 확인하는 메소드이다. 있으면 true, 없으면 false를 반환한다.

 Object next()

 Iterator 내의 다음 요소를 반환한다. 




3. Enumeration과 Iterator 의 차이점


Enumeration과 Iterator 의 가장 큰 차이점은 fail-fast 방식 개념이다.


콜렉션 클래스들은 저장된 객체들에 대한 순차적 접근을 제공한다.


Enumeration은 순차적 접근 시 콜렉션 객체에 변경이 일어나도 이를 무시하고, 끝까지 동작한다.


Iterator는 순차적 접근이 모두 끝나기 전에 콜렉션 객체에 변경이 일어날 경우 순차적 접근이 실패되면서 예외를 return하게 되는데 이를 fail-fast 방식이라고 부른다.



다음은 Junit을 이용해 fail-fast 동작에 대한 테스트 코드이다.



3.1 Iterator Junit 테스트



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
 
 
public class FailFastTest {
 
    private List<Integer> myList;
 
    @Before
    public void init() {
        myList = new ArrayList<Integer>();
 
        for (int i = 0; i < 1000; i++) {
            myList.add(i);
        }
    }
 
    @Test
    public void iteratorTest() throws InterruptedException {
 
        new MyThread().start();
 
        Iterator<Integer> it = myList.iterator();
        while (it.hasNext()) {
            Thread.sleep(10);
            System.out.println(it.next());
        }
    }
 
 
    class MyThread extends Thread {
 
        @Override
        public void run() {
            System.out.println("MyThread Start :");
            try {
                Thread.sleep(1000); // 1초 동안 sleep
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
 
            myList.remove(1); // iterator collection 객체 변경 
            
            System.out.println(myList);
            
            // iterator로 받아 반복을 돌린 객체는 객체가 변경되면 멈춘다.
            // 출력값 : 1이 remove된 순간 객체 변경을 알고 반복을 멈춤 0~99, {0,2,3 ... 999} 출력됨.
        }
    }
}
cs



3.2 Enumeration Junit 테스트



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
 
import org.junit.Before;
import org.junit.Test;
 
 
public class FailFastTest {
 
    private Vector<Integer> vecList;
 
    @Before
    public void init() {
        vecList = new Vector<Integer>();
 
        for (int i = 0; i < 1000; i++) {
            vecList.add(i);
        }
    }
 
  @Test
  public void enumerationTest() throws InterruptedException {
      new MyThread().start();
 
      Enumeration<Integer> en = vecList.elements();  
      while (en.hasMoreElements()) {
          Thread.sleep(10);
          System.out.println(en.nextElement());
      }
  }
 
 
    class MyThread extends Thread {
 
        @Override
        public void run() {
            System.out.println("MyThread Start :");
            try {
                Thread.sleep(1000); // 1초 동안 sleep
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
 
            vecList.remove(1); // Enumeration collection 객체 변경 
            
            System.out.println(vecList);
            
            // Enumeration으로 받아 반복을 돌린 객체는 객체가 변경되어도 멈추지않는다.
            // 출력값 : 0 ~ 999 출력이 되고 반복문으로 숫자가 찍히는 중간에 {0,2,3 ... 999} 출력됨.
        }
    }
}
cs


자바 콜렉션 프레임워크에 포함되어 있는 List, Vector, HashTable 등은 모두 fail-fast 방식으로 동작하지만

Enumeration 인터페이스만 fail-fast 방식이 아니다.




+ Recent posts