Loading...

JAVA / / 2022. 1. 21. 15:58

자바 30강. JSON

반응형

자바 스크립트를 잠깐 언급하고 가자.

 

let : 변수를 초기화하거나 선언할 때 쓰는 키워드

(자바의 자료형과 다름)

let n = 10;

let s = "문자열";

let ss = '문자열';

문자열을 초기화할 때 홑 따옴표도 가능하다.

 

타입 자체가 없기 때문에 제네릭 같이 리턴 타입을 생각할 필요도 없고,

초보 개발자들이 사용하기에 좋은 언어이다.

 

이 언어가 오브젝트를 선언할 때

(커스텀 자료형)

let user = {	// 클래스 이름 모두 소문자
	name : "홍길동",
	age : 60
}

                        

new를 하지 않아도 모든 게 heap에 들어간다.

데이터의 사이즈를 모르고, 동적이기 때문이다.

user.name으로 변수를 찾을 수 있다.

 

 

자바의 오브젝트

(커스텀 자료형)

class User {    // 처음에 대문자
    String name = "홍길동";
    int age = 60;
}

자바는 heap에 띄우면 s.name으로 사용이 가능하다.

 

 

자바스크립트와 자바가 통신을 할 때

Byte Stream을 통해 문자열로 들어온다.

이걸 자바에서 user.name 하면 찾을 수 있을까?

 

이 문자열을 파싱을 해서 분석해준 뒤,

자바의 클래스(오브젝트)에 담아주는 게 제일 좋다.

통신 1. 자바 스크립트의 오브젝트를 프로토콜에 맞게 전송하고,

받는 자바는 사용하기 편하게 파싱 하여 자바 오브젝트로 받는다. 

 

자바가 오브젝트를 전송할 때도

자바 스크립트는 자바 스크립트 오브젝트로 받는다.

 

이것은 모든 언어가 동일하다.

파싱 하여 자신의 오브젝트로 바꾸는 것이다.

 

 

 

모든 언어가 오브젝트의 모양이 다 다르기 때문에

하나의 프로토콜을 정의해

하나의 메서드 만으로 파싱 하기 편하게 해주는 것이 있다.

 

JSON

 

자신의 언어로 던지는 것은 좋지 않은 통신이다.

 

원활한 통신을 위해서는 중간 언어가 필요하다.

우리 세계의 중간 언어가 영어인 것처럼 말이다.

프랑스와 독일, 중국이 일본과 통신을 하기 위해

영어로 번역을 우선 한 후에 일본에게 보낸다.

 

일본은 영어만 파싱 하면 해석할 수 있다.

영어를 번역하는 메서드만 있으면 되는 것이다.

 

이걸 프로그래밍 언어에 넣어보면

자바 스크립트가 중간 언어로 바꿔서 전송하면

자바는 중간 언어를 파싱 해서 자신의 오브젝트로 바꾼다.

반대의 상황에도 똑같다.

 

이때 이 중간 언어가 JSON이다.

 

JSON(JavaScript Object Notation; 자바 스크립트 객체 표기법)

 

모든 언어들의 오브젝트만 전용으로 통신하는 언어

 

json은 자바 스크립트의 객체 표기법이니까

자바스크립트와 아주 비슷하게 생겼다.

 

json으로 전송하는 방법을 보자.

중괄호 앞에 이름과 클래스 타입 다 떼고

중괄호부터 내용만 보낸다.

 

{"name" : "홍길동", "age" : 60}

 

이걸 기반으로 자바 자료형을 만들 수 있다.

 

생긴 건 json으로 생겼지만

통신은 결국은 String 타입이다.

 

이때 ":" 기준

앞에 있는 것을 키, 뒤에 있는 것이 값이다.

"키" : 값

키에는 반드시 큰따옴표를 붙여줘야 한다.

값이 숫자라면 따옴표는 필요 없고,

배열이나 컬렉션도 [ ] 안에 넣어줄 수 있다.

 

{
    "name": "홍길동",
    "age": 25,
    "hobby": ["농구", "도술"],
    "family": {"id": 2, "father": "홍판서", "mother": "춘섬"}
 }

이 json 표기법을 보고 자바 오브젝트로 만들 수 있을까?

 

package jsonex01;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Family {
    private int id;
    private String father;
    private String mother;

    public Family(int id, String father, String mother) {
        this.id = id;
        this.father = father;
        this.mother = mother;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFather() {
        return father;
    }

    public void setFather(String father) {
        this.father = father;
    }

    public String getMother() {
        return mother;
    }

    public void setMother(String mother) {
        this.mother = mother;
    }
}  // end of Family

class User {
    private String name;
    private int age;
    private List<String> hobby;
    private Family family;  // 컴포지션

    public User(String name, int age, List<String> hobby, Family family) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
        this.family = family;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<String> getHobby() {
        return hobby;
    }

    public void setHobby(List<String> hobby) {
        this.hobby = hobby;
    }

    public Family getFamily() {
        return family;
    }

    public void setFamily(Family family) {
        this.family = family;
    }
} // end of User

public class ddd {
    public static void main(String[] args) {
        Family family = new Family(2, "홍판서", "춘섬");
        List<String> hobby = Arrays.asList("농구", "도술");
        
        User user = new User("홍길동", 25, hobby, family);

        //json 변경(개념 : json은 생긴게 json처럼 생긴것이지 타입은 문자열이다.)
        System.out.println(user);
    }
}

라고 하면 user의 주소 값만 뜰 것이다.

 

이때 User 클래스명에서 Alt + 엔터키를 누르고

Generate toString( )을 눌러준다.

모든 상태를 체크해준다.

그러면 출력을 해줄 수 있는 toString( ) 메서드가 자동 생성된다.

Family 클래스에서도 Alt + 엔터키를 눌러서 toString( ) 메서드를 만들어준다.

User 클래스에 담긴 데이터들이 다 잘 보이는 것을 확인할 수 있다.

 

 

json 표기법으로 받았을 때 파싱 하는 법은 했는데

반대로 전송할 때는 어떻게 보내야 할까?

 

원래는 json 표기법으로 변환해주는 라이브러리가 있지만,

{"":""} json 형식으로 만들어보자.

 

Family 클래스

public String toJson() {
        return "{\"id\":" + id + ",\"father\":\"" + father + "\",\"mother\":\"" + mother +"\"}";
}

User 클래스

public String toJson() {
        return "{\"name\":\"" + name + "\",\"age\":" + age + ",\"hobby\":" + hobby + ",\"family\":" + family.toJson() + "\"}";
}

 

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형