Search

반응형

'분류 전체보기'에 해당되는 글 561건

  1. 2023.11.29 [자바스크립트]모던 JavaScript 팁 모음. 1
  2. 2023.11.06 [JAVA] 자바에서 XML 데이터 다루는 방법. 2탄 Node와 NodeList
반응형

안녕하세요. 신기한 연구소입니다.

모던 자바스크립트 공부하다 나름 특이하거나 알아두면 괜찮은 팁을 정리해 봤습니다.

같이 보시죠~



1. <script> 사용방법

 

예전에 사용하던 <script> 태그 속성입니다.
<script type="text/javascript">
<script language="javascript">
<scrtip type="text/javascript"><!--     //--></script>
이제 위 예시는 사용하지 말고 스크립트가 필요한 곳에 <script> </script> 태그만 사용하면 됩니다.

외부 js파일이나 링크는 src로 사용하면 됩니다.
주의점은 src를 사용한 아래 예시의 경우 <script>에 스크립트를 작성해도 인식되지 않습니다.

<script src="/js/module.js"></script>
<script src="https://js.mypage.com/libs/module.js"></script>
<script src="/js/module.js">
   console.log("hi~"); //인식 안됨!!
</script>

간단한 스크립트는 소스에 <script> 태그를 사용해도 되고 길고 복잡하거나 공통적인 소스라면 js파일을 별도로 만들면 좋습니다. 별도 파일로 만들면 호출 시 브라우저에서 한 번만 다운로드하여 캐시에 저장해서 사용하면 되기에 속도 개선에 도움이 됩니다.



2. null과 undefined


둘 다 자료형입니다.
하지만 둘은 다릅니다.

우선 둘의 특징을 보면
변수를 선언하고 할당하지 않으면 'undefined'로 자동할당됩니다.

let myAge;
console.log(myAge);

undefined가 출력되고 myAge에 값이 할당되지 않았다는 의미로 해석됩니다.

null의 경우는 개발자가 변수를 다룰 때 값이 비었다거나 알 수 없음을 임의로 지정하고 싶은 경우에  null을 사용합니다.

myAge = null;
console.log(myAge);

이제 myAge는 미할당이 아닌 빈값인 null이 되었습니다.

myAge = undefined;
console.log(myAge);

undefined는 위 소스처럼 임의 지정을 할 수 있지만 자동할당이라는 의미처럼 직접 할당하지 않는 게 좋습니다.

강력주의사항!!
가끔 기존 개발 소스를 보면 null과 undefined를 할당하면서 문자열처럼 하는 경우가 있습니다.

myAge = "null";
myAge = "Null";
myAge = "NULL";
myAge = "undefined";

이렇게 사용하지 마세요.
이런 경우로 인해 다음과 같은 조건문을 사용하게 됩니다.

if (myAge == null || myAge == "null")

null과 undefinded은 문자열 자료형이 아니고 순수하게 자체가 자료형이기에 그대로 사용하셔야 합니다.


typeof undefined -> undefined
typeof null -> object

undefined는 자신의 타입에 맞게 undefined를 출력하지만 null은 null타입임에도 object가 출력됩니다. 하지만 null은 객체가 아님을 명심하세요.

null과 undefined는 각각이 데이터형이기에 같지 않다고 했습니다.

console.log(null === undefined); -> false

그래서 일치 연산자를 사용한 위 결과는 서로 자료형이 다르기에  false가 출력됩니다.

console.log(null == undefined) -> true

동등 연산자는 null과 undefined를 같게 취급합니다. 자료형은 확인하지 않기도 하지만 같은 개념으로 취급해서 true가 출력됩니다.

그래서 위 예시를 보듯 일치연산자와 동등연산자를 잘 구분해서 사용해야 합니다.


비교연산자는 값을 숫자로 변경합니다.
null은 0이지만 undefined는 NaN을 반환한다고 했습니다.

console.log( null == 0 );
console.log( null >= 0 );

null은 숫자로 0으로 변환되지만 동등 연산자(==)는 null을 0으로 자동 변환해주진 않습니다. 그래서 false가 됩니다.
비교 연산자는 숫자로 변환해준다고 했기에 null >= 0은 null이 0으로 변환되기에  true가 됩니다.


3. 형변환


Number(undefined) -> NaN
Number(null) -> 0
Number(true) -> 1
Number(false) -> 0
Number("") -> 0
Number("0") -> 0
Number("3") -> 3

null은 숫자로 0이 됩니다.
문자열 빈값인 ""도 0이 됩니다.
undefined는 0이 아닌 NaN으로 null과 다른 부분입니다.


4. falsy란?


형변환 중 Boolean인 경우 자바스크립트는 true/false를 비슷한 성향인 경우 변환되는 경우가 있습니다.

Boolean(1) -> true
Boolean(2) -> true
Boolean(0) -> false
Boolean("0") -> true
Boolean(Number("0")) -> false
Boolean("") -> false
Boolean(" ") -> true
Boolean(null) -> false
Boolean(undefined) -> false
Boolean(NaN) -> false
Boolean("hi") -> true

숫자 1은 true입니다.
숫자 0은  false이지만 문자 "0"은 빈값도 아니고 형변환도 안되기에 true입니다. 하지만 Number로 형변환 하면 false입니다.
문자열 빈값 ""은 false이지만 공백 " "은 스페이스가 있기에 true입니다. 하지만 Number(" ")는 0입니다.

위 false가 나오는 값들을 잘 이해하면 코딩 시 다양하게 활용할 수 있습니다.

예)
0이 false이므로 다음 while문에서 활용할 수 있습니다.

let cnt = 10;
while(cnt) {
   cnt--;
}

cnt 값이 10부터 1까지 --로 줄어드는 경우는 true를 반환해서 while문이 계속 처리지만 cnt값이 0이 되면 false가 돼서 while문을 빠져나가게 됩니다.

희한하네요.


5. +연산자


+는 숫자는 더하기로 문자는 연결로 작동합니다.

console.log(2 + 2); -> 4
console.log(2 +"2"); -> 22

이렇게 + 앞 뒤로 숫자나 문자가 있을 경우 +는 이항 연산자라고 합니다.

let minusNum = -5;
console.log (+minusNum); ->  -5

console.log(null);
console.log(+null);

부호처럼 앞에 +를 붙이면 단항연산자라고 하는데요.
음수 -5에 +5를 해도 변화가 없습니다.
하지만 null에 +를 붙이니 갑자기 숫자로 변경되었습니다.
단항 연산자는 숫자를 제외한 어떤 값을 숫자형으로 변환하는 능력이 있습니다. 물론 숫자로 변환이 안 되는 값은 NaN을 반환합니다. 마치 Number()를 사용하는 기분이 듭니다.

이 기능도 잘 활용하면 유용해 보입니다.

 

6. 쉼표 연산자

 

다음 결과는 어떤 값이 출력될까요?

let a = 1, b = 2, c = 3;

let k = (b=10, b+c);

console.log(k);

쉼표 연산자의 특징은 , 앞의 b=10을 실행만 하고 , 뒤의 b+c를 실행한 뒤 k에 할당합니다.
그래서 값은 5가 아닌 13이 됩니다. b가 10으로 재 할당되었기 때문입니다.

1차로 정리를 해봤는데 모던 자바스크립트만의 특징을 활용하면 개발할 때 편하게 사용할 수 있을 거 같습니다.

즐 코딩하세요.

반응형
반응형

이제 XML을 불러오는 방법을 알게 되었으니 파싱을 해서 원하는 Node의 엘리멘트, 속성값 그리고 텍스트 값을 추출하는 방법을 알아보도록 하겠습니다.

 

XML 정보를 가져오는 방법은 3가지가 있다고 했습니다.

1. URL 사이트 정보를 이용하는 방법

2. XML 파일을 읽는 방법

3. String으로 만들어 사용하는 방법

 

이전 포스팅을 보면 위 3가지로 파싱하는 방법을 쉽게 알 수 있습니다.

 

2023.10.14 - [Software/Java] - [JAVA] 자바에서 XML 데이터 다루는 방법. 1탄

 

[JAVA] 자바에서 XML 데이터 다루는 방법. 1탄

안녕하세요. 신기한 연구소입니다. 최근 새로운 개발 요청을 받았답니다. 우후~ 기존 통신 방식을 변경해서 재 구축해야 하는데요. 기존 방식은 자바에서 JSON과 XML을 혼합해서 요청과 응답을 하

tiboy.tistory.com

 

이제 파일을 파싱했다면 원하는 값을 추출해서 사용하는 방법을 알아야겠지요?

아래는 샘플 xml입니다. (sample.xml로 저장하기)

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<sample id="idSample">
    <people>
        <name>홍돌이</name>
        <age>25</age>
        <address value="korea">한국</address>
    </people>
</sample>
cs

 

1. 가장 상위 element 가져오기.

 

xml의 가장 최 상위 엘리먼트를 가져오는 방법입니다.

가장 상위를 받아야 그다음 단계의 Node를 받을 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public static void main(String[] args)  throws Exception {
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
        DocumentBuilder builder = factory.newDocumentBuilder();        
 
        Document document = builder.parse("./src/sample.xml");
 
       Element element = document.getDocumentElement();  
 
        System.out.println(element.getAttribute("id"));
 
        System.out.println(element.getNodeName());
        
        Node firstNode = element.getFirstChild();
        
        System.out.println("1::" + firstNode.getNodeName());
   }
cs

위 예제를 실행하면 element의 속성 "id"값과 node name을 출력합니다.

idSample
sample
1::#text

마지막 출력값은 #text가 나옵니다.

Element 타입으로 element를 document를 통해 받습니다.

여기서 element는 최 상위 요소인 <sample></sample>을 의미합니다.

element.getNodeName()을 통해 받은 값이 sample임을 알 수 있습니다.

element.getAttribute("id")로 element 내 속성값을 가져올 수 있습니다.위 예제를 보면 "idSample"값을 가져왔습니다.

 

2. 첫 번째 Node 가져오기

 

14라인을 보면 Node 타입을 사용하고 있습니다. element를 시작으로 첫 번째 node를 받습니다. 바로 <people>인데요. getNodeName()를 사용해서 값을 가져왔는데 people 아닌 #text 가 출력됩니다. 그 이유는 xml 태그 사이의 공백 때문입니다. <sample>   <people>... 왼쪽을 보면 두 태그 사이에 공백이 있습니다.

공백을 없애도 되지만 Node 타입을 if문으로 비교해서 필터링할 수도 있습니다.

 

3. NodeList로 xml 정보 가져오기

 

그렇다면 첫 번째 node를 가져오고 리스트를 활용해서 xml 정보를 가져오는 소스를 이어서 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
        NodeList nList = firstNode.getNextSibling().getChildNodes();
 
        for(int i = 0; i < nList.getLength(); i++){
            Node item = nList.item(i);
            System.out.println("TYpe>>" + item.getChildNodes().getLength());
            if(item.getNodeType() == Node.ELEMENT_NODE){
                System.out.println(item.getNodeName());
                System.out.println(item.getTextContent());
                if (item.getAttributes().getLength() > 0){
                    System.out.println(item.getAttributes().getNamedItem("value").getNodeValue());
                }
             } 
        }
cs

위 소스를 보면 NodeList 타입을 가져오는데 firstNode에서 ChildNodes를  통해 NodeList 타입을 받아야 하지만 firstNode는 공백(#text)이라서 그 하위의 태그가 없습니다. 그래서 NextSibling을 통해서 다음 태그로 이동한 뒤 NodeList를 가져옵니다. 

4번 라인을 보면 for 문을 통해 nList(NodeList)의 Node 타입의 item(i)를 받습니다.

5번 라인의 의미는 해당 Node 하위에 몇 개의 Node 가 있는지 확인할 때 사용합니다.6번 라인에서 해당 Node 가 공백(#text)인 경우가 있었기에 Node.ELEMENT_NODE를 사용해서 거를 수 있습니다.7번 라인의 if 문 내부는 이제 공백이 아닌 정상적인 element의 정보를 활용할 수 있습니다.item.getNodeName() 은 현재 item의 태그명을 보여줍니다.item.getTextContent()는 현재 item에 싸여있는 <a> b </a> 이렇게 a에 싸여있는 b를 보여줍니다.이 값은 item.getFirstChild().getNodeValue() 로도 가져올 수 있습니다.

 

<address value="korea">

 

여기서 value는 address의 속성(attribute)라고 합니다.9번 라인으로 체크를 한 뒤 10번 라인으로 getNameItem("value")에 속성명을 넣고 getNodeValue()로 address의 value 속성값을 가져올 수 있습니다.

 

4. 마무리

 

이렇게 xml의 최상위 element와 속성값 받기,하위 Node와 NodeList 받아서 그 값들을 활용하는 방법에 대해 알아봤습니다.이 정도면 xml에서 값을 받고 활용하는데 충분해 보입니다.

 

다음 포스팅은 동적으로 xml과 내부 element를 생성하는 방법에 대해 알아보겠습니다.

반응형