안녕하세요. 포람페타는고3 입니다.

 

오늘은 맵을 사용하면서 혼동 될 수 있는

몇가지 헷갈리는 케이스를

확인해보려고 합니다.

 

java 자바에서 map 맵 사용시 null 체크 등

null과 관련되어 종종 혼동되는것들이

몇가지 있는데요,

 

직접 코딩을 해보면서 확인해보도록 하겠습니다.

 

 

💡오늘의 키워드
⭕️ Map에 정의하지않은 KEY의 VALUE값을 가져오는경우

⭕️ Map의 특정 KEY에 대한 VALUE값을 ("")으로 PUT 했을경우

⭕️ Map의 특정 KEY에 대한 VALUE값을 null로 PUT 했을경우

⭕️ 결론


⭕️ Map에 정의하지않은 KEY의 VALUE값을 가져오는경우

 

[코멘트]

map에 "car"라는 KEY는 정의되지않았습니다.

그렇다면, IF문에서 null pointer exception이 발생할까요?

 

 

[실행결과]

 

 

[설명]

null pointer exception은

발생하지않았습니다.

그럼 도대체 map.get("car")는

어떤 값과 비교를 해야할까요?

 


[코멘트]

null과 비교를 해보겠습니다.

 

[실행결과]

 

[코드해설]

null과 비교가 되는군요.

그럼 혹시 ("") 으로도 비교가 되는지 궁금합니다.


[코멘트]

("")과 map에 정의되지않은 key값의

get value와 비교해봅니다.

 

[실행결과]

 

[해석]

("")과 null은 엄연히 다른 것이기때문에

역시나 ("")과는 비교가 되지않음을

확인 할 수 있습니다.


⭕️ Map의 특정 KEY에 대한 VALUE값을 ("")으로 PUT 했을경우

[코멘트]

총 3개의 IF문이 있습니다.

어느 IF문이 실행될까요?

혹시, NPE(null pointer exception)이 발생하지는

않겠죠??

 

 

[실행결과]

 

[해설]

map에 ("")로 PUT을 했으면,

("")과 비교가 되는 것을 확인 하였습니다.

혹시나, null과도 비교 할 수 있지 않을까했지만

역시나 되지 않습니다.


⭕️ Map의 특정 KEY에 대한 VALUE값을 null로 PUT 했을경우

[코멘트]

이번엔 map의 "car"라는 KEY의 value를 null로 PUT하였습니다.

이번엔 몇번째 IF문이 실행될까요?

 

 

[실행결과]

 

[설명]

이번에도 역시 PUT한 VALUE의 값과 동일한

null과 비교되는것을 확인 할 수 있습니다.


⭕️ 결론

1.MAP에 PUT하지않은 KEY값의 VALUE를

GET할경우 NPE(null pointer exception)는

발생하지않는다.

 

2.("")값을 PUT 하였다면, null과 비교할게아니고

동일한 값인 ("")과 비교 가능하다.

(empty, 즉 비어있는 값은 비어있는 값으로 비교가능)

 

3.null 값을 map에 PUT 하였다면, null과 비교한다.

("")과 null은 다른 값이다.

 

-이렇게 하나씩 헷갈리는 것을 간단하게나마

직접 확인해가다보면 언젠간 더이상

혼동스러운것들은 없을 날이 올거라봅니다.

 

'Language > Java' 카테고리의 다른 글

Java-split 문자열 배열 변환, 문자열 한글자씩 배열 변환  (0) 2022.09.28
java-for문 break사용  (0) 2022.09.27

💡오늘의 키워드
⭕️ split()의 기본사용법

⭕️ split()의 주의사항

⭕️ split() 꿀팁

⭕️ split() 퀴즈

 

 

자바로 여러 기능을 구현 할 때 split() 은 자주 사용되는 API이다.

예를들어 전화번호 010-1111-1234 또는 주민등록번호 931123-1023582 등

특정포멧을 가지고 있는 데이터를 가공할때 유용하게 사용 할 수 있다.

실제 프로젝트에서는 다양한 형태의 문자열 데이터를 가공하는 일이

많기때문에 정확한 사용법을 알고있어야 한다.

사용시 주의사항 딱 한가지만 기억하면 된다. 

 

 

⭕️ split()의 기본사용법

class SplitDemo {

    public static void main(String[] args) {

        String str_sample = "010-1111-1234";

        String[] arrSample = str_sample.split("-");

        int index = 0;
        for(String item : arrSample)
        {
            System.out.println("item[" + index + "]" + "=" + item);
            index++;
        }
    }
}

 

 

[코드설명]

str_sample.split() 의 파라미터로 넘긴 "-" (대쉬기호)를 기준으로

문자열을 분리하여 각각을 배열에 순서대로 담는다.

 

[실행결과]

item[0]=010
item[1]=1111
item[2]=1234

 

 

⭕️ split()의 주의사항

[코드설명]

split()함수의 인자(파라미터)는, 문자(char)가 아니다.

정규표현식(regex)을 파라미터로 넣어야한다.

 

 

예를들어 "." (마침표) 를 split()의 파라미터로 넣고

문자열을 배열로 변환하는 코드를 작성해보았다.

class SplitDemo {

    public static void main(String[] args) {

        String strSample = "2022.09.28";

        String[] arrSample = strSample.split(".");

        int index = 0;
        for(String item : arrSample)
        {
            System.out.println("item[" + index + "]" + "=" + item);
            index++;
        }

        System.out.println("arrSample.length = " + arrSample.length);
        System.out.println("arrSample[0] = "     + arrSample[0]);
    }
}

[코드설명]

for문의 System.out.println()이 실행되지않기때문에,

그 바로 아래에 System.out.println()문을 2개 추가하였다.

 

 

[실행결과]

arrSample.length = 0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at SplitDemo.main(Main.java:22)

 

[추가설명]

split()의 파라미터로 "."(마침표)를 넣어서 문자열이 3덩어리로 

잘라져 배열에 순서대로 담기길 원했지만,

예상대로 작동하지않는것을 확인 할 수 있다.

 

그 이유는,

정규표현식에서 "." (마침표) 는 와일드카드로 모든문자를 의미하며

우리눈에 보이는 "."마침표를 "." 마침표 그대로 인식하지 않는다.

 

자바 split() 함수에서 마침표를 사용하기위해선

마침표를 대괄호로 감싸서 정규표현식으로 바꿔 넣어주어야한다.

"[.]" 로 사용해야한다.

"//." 이것은 동작하지않는다.

class SplitDemo {

    public static void main(String[] args) {

        String strSample = "2022.09.28";

        String[] arrSample = strSample.split("[.]");

        int index = 0;
        for(String item : arrSample)
        {
            System.out.println("item[" + index + "]" + "=" + item);
            index++;
        }

        System.out.println("arrSample.length = " + arrSample.length);
        System.out.println("arrSample[0] = "     + arrSample[0]);
    }
}

[실행결과]

item[0]=2022
item[1]=09
item[2]=28
arrSample.length = 3
arrSample[0] = 2022

 

[추가설명]

굳이 정규표현식 변환 문자를 암기 할 필요는 없으며

필요시 검색해서 사용해도 충분하지만,

자주쓰이는 정규표현식 문자 4개 5개 정도는 암기해두는것도

좋다고 생각한다.

 

⭕️ split() 꿀팁

자르는 구분 기호 없이 모든 문자열의 한글자 한글자를

각각 다 배열로 치환하고 싶을때

class SplitDemo {

    public static void main(String[] args) {

        String strSample = "abcdefghijklmnop";
        String[] arrSample = strSample.split("");
        for(String str : arrSample)
        {
            System.out.println("srt = " + str);
        }
    }
}

[코드설명]

split() 함수의 파라미터로 ""를 넣어주면

문자열의 모든 문자 하나씩을 각각 배열로 반환해준다.

 

 

[실행결과]

srt = a
srt = b
srt = c
srt = d
srt = e
srt = f
srt = g
srt = h
srt = i
srt = j
srt = k
srt = l
srt = m
srt = n
srt = o
srt = p

 

 

⭕️ split() 퀴즈

class SplitDemo {

    public static void main(String[] args) {

        String tmp1     = "123.456";
        String tmp2     = ".123456";
        String tmp3     = "123.";
        String tmp4     = "1234";
        String tmp5     = ".123";
        String tmp6     = "123.";
        String tmp7     = "123...";
        String tmp8     = "...123";
        String tmp9     = "123...1";
        String tmp10    = "123...1..";

        String[] arrTmp1    = tmp1.split("[.]");
        String[] arrTmp2    = tmp2.split("[.]");
        String[] arrTmp3    = tmp3.split("[.]");
        String[] arrTmp4    = tmp4.split("[.]");
        String[] arrTmp5    = tmp5.split("[.]");
        String[] arrTmp6    = tmp6.split("[.]");
        String[] arrTmp7    = tmp7.split("[.]");
        String[] arrTmp8    = tmp8.split("[.]");
        String[] arrTmp9    = tmp9.split("[.]");
        String[] arrTmp10   = tmp10.split("[.]");

        System.out.println("-----------------arrTmp1------------------------");
        for(String str : arrTmp1){ System.out.println("str = " + str); }
        System.out.println("-----------------arrTmp2-----------------------");
        for(String str : arrTmp2){ System.out.println("str = " + str); }
        System.out.println("-----------------arrTmp3------------------------");
        for(String str : arrTmp3){ System.out.println("str = " + str); }
        System.out.println("-----------------arrTmp4------------------------");
        for(String str : arrTmp4){ System.out.println("str = " + str); }
        System.out.println("-----------------arrTmp5------------------------");
        for(String str : arrTmp5){ System.out.println("str = " + str); }
        System.out.println("-----------------arrTmp6------------------------");
        for(String str : arrTmp6){ System.out.println("str = " + str); }
        System.out.println("-----------------arrTmp7------------------------");
        for(String str : arrTmp7){ System.out.println("str = " + str); }
        System.out.println("-----------------arrTmp8------------------------");
        for(String str : arrTmp8){ System.out.println("str = " + str); }
        System.out.println("-----------------arrTmp9------------------------");
        for(String str : arrTmp9){ System.out.println("str = " + str); }
        System.out.println("-----------------arrTmp10------------------------");
        for(String str : arrTmp10){ System.out.println("str = " + str); }
        System.out.println("------------------------------------------------");
    }
}

[코드설명]

분리의 기준이되는 split() 정규식 파라미터가, 

문자열의 가장 앞쪽 또는 가장 뒤쪽에 있는경우

혹은 연속으로 있는 경우

자바는 내부적으로 어떻게 처리하기로 약속되어있을까요?

 




 

 

[실행결과]

-----------------arrTmp1------------------------
str = 123
str = 456
-----------------arrTmp2-----------------------
str = 
str = 123456
-----------------arrTmp3------------------------
str = 123
-----------------arrTmp4------------------------
str = 1234
-----------------arrTmp5------------------------
str = 
str = 123
-----------------arrTmp6------------------------
str = 123
-----------------arrTmp7------------------------
str = 123
-----------------arrTmp8------------------------
str = 
str = 
str = 
str = 123
-----------------arrTmp9------------------------
str = 123
str = 
str = 
str = 1
-----------------arrTmp10------------------------
str = 123
str = 
str = 
str = 1
------------------------------------------------

 

 

[추가설명]

 

일부는 이해가 되고

또 일부는 이해가 가지 않는 결과 일 수도 있습니다.

 

하지만 걱정할 필요 없습니다.

 

그냥 저렇게 하기로 약속되어있는것일뿐

반드시 이해해야만하는 이유는 없으며,

있다해도 몰라도 괜찮습니다.

 

우리가 집중해야 할 것은

저렇게 결과가 나온다 라는것만 알고있어도,

그것으로 충분합니다.

 

 

'Language > Java' 카테고리의 다른 글

java-Map null 체크 value put empty  (0) 2022.10.06
java-for문 break사용  (0) 2022.09.27

💡오늘의 키워드
⭕️ for문에서 break의 기본사용법

⭕️ for문에서 break의 응용사용법1

⭕️ for문에서 break의 응용사용법2

⭕️ for문에서 break의 고급예제1

 

보통 자바 for문에서 break를 사용하는 일은 거의 없지만,
불필요한 Loop 실행을 방지하고자할땐 꼭 사용해야한다.

 


⭕️ for문에서 break의 기본사용법

// 라벨링 하지않은 for문
public class Main {
    public static void main(String[] args) {

        for (int k = 0; k < 10; k++)
        {
            System.out.println("K FOR Loop k = " + k);

            if(k == 3)
            {
                break;
            }
        }
        
        System.out.println("all FOR Loop escape");
    }
}

[코드설명]

for문은 0~9까지 10번 반복되어 실행되어야 하지만,

0,1,2,3 까지 4회 반복 된 후 중간에 if( k == 3)을 만나 break 가 걸려

반복문을 중단하고 빠져나오게 된다.

 

[실행결과]

K FOR Loop k = 0
K FOR Loop k = 1
K FOR Loop k = 2
K FOR Loop k = 3
all FOR Loop escape

 

 


⭕️ for문에서 break의 응용사용법1

// 라벨링처리한 for문
public class Main {
    public static void main(String[] args) {

        subLoop:
        for(int j = 0; j < 5; j++)
        {
            lastLoop:
            for (int k = 0; k < 10; k++)
            {
                System.out.println("K FOR Loop k = " + k);

                if(k == 3)
                {
                    break lastLoop;
                }
            }
            System.out.println("j FOR Loop j = " + j);
        }
    System.out.println("all FOR Loop escape");
    }
}

[코드설명]

-중첩된(겹쳐있는) for Loop를 사용하는경우, break를 함께 사용해야 할 경우 

각 for Loop에 라벨(label) 이라는 것을 붙혀, 각 for Loop를 구별 할 수 있다.

(예시에선 - subLoop:와 lastLoop:로 사용하였다. )

(라벨이름은 자유롭게 사용 할 수 있지만, for문의 목적을 한번에

알아챌 수 있도록 작성하는게 좋으며, 라벨이름 뒤에 콜론(":")을 붙혀 사용한다.)

 

 

[실행결과]

K FOR Loop k = 0
K FOR Loop k = 1
K FOR Loop k = 2
K FOR Loop k = 3
j FOR Loop j = 0
K FOR Loop k = 0
K FOR Loop k = 1
K FOR Loop k = 2
K FOR Loop k = 3
j FOR Loop j = 1
K FOR Loop k = 0
K FOR Loop k = 1
K FOR Loop k = 2
K FOR Loop k = 3
j FOR Loop j = 2
K FOR Loop k = 0
K FOR Loop k = 1
K FOR Loop k = 2
K FOR Loop k = 3
j FOR Loop j = 3
K FOR Loop k = 0
K FOR Loop k = 1
K FOR Loop k = 2
K FOR Loop k = 3
j FOR Loop j = 4
all FOR Loop escape

 

 

 

⭕️ for문에서 break의 응용사용법2

public class Main {
    public static void main(String[] args) {

        subLoop:
        for(int j = 0; j < 5; j++)
        {
            lastLoop:
            for (int k = 0; k < 10; k++)
            {
                System.out.println("K FOR Loop k = " + k);

                if(k == 3)
                {
                    break subLoop;
                }
            }
            System.out.println("j FOR Loop j = " + j);
        }
    System.out.println("all FOR Loop escape");
    }
}

[코드설명]

lastLoop: 에서 break가 없다면 k가 0~9 까지 반복되어야 하지만, 

k가 3이되었을때, lastLoop: 가 아니라, 부모인 subLoop: 를 break시켜버리면서( j = 0 )

그 즉시, 전체 for Loop가 종료되었다.

for Loop의 라벨(label)은 break 명령어와 함께 사용하여 for Loop를 자유롭게 종료 시킬 수 있다.

 

 

[실행결과]

K FOR Loop k = 0
K FOR Loop k = 1
K FOR Loop k = 2
K FOR Loop k = 3
all FOR Loop escape

 

 

 

 

 

⭕️ for문에서 break의 고급예제1

class BreakWithLabelDemo {
    public static void main(String[] args) {

        int[][] arrayOfInts = {
                { 32, 87, 3, 589 },
                { 12, 1076, 2000, 8 },
                { 622, 127, 77, 955 }
        };
        int searchfor = 12;

        int i;
        int j = 0;
        boolean foundIt = false;

        search:
        for (i = 0; i < arrayOfInts.length; i++) {
            for (j = 0; j < arrayOfInts[i].length;
                 j++) {
                if (arrayOfInts[i][j] == searchfor) {
                    foundIt = true;
                    break search;
                }
            }
        }

        if (foundIt) {
            System.out.println("Found " + searchfor + " at " + i + ", " + j);
        } else {
            System.out.println(searchfor + " not in the array");
        }
    }
}

 

[실행결과]

Found 12 at 1, 0

 

 

자바스크립트를 실행해보려면 자바스크립트 인터프리터가 필요하다.

 

다행히 모든 웹브라우저에는 자바스크립트 인터프리터가 내장되어있다.

 

또한 웹브라우저는 모두 간단한 Console API를 가지고있다.

 

console.log( ) 함수를 사용하면 콘솔에 텍스트를 출력할 수 있는데, 이는 코드를 디버깅 할 때 유용하다.

 

또한 조금 터프한 방법이지만, 출력의 결과나 디버깅 메시지를 표시하기위해 alert( ) 함수를 사용할 수도 있다.

 

이 함수에 문자열을 넘기면 모달 다이얼로그 박스(Modal Dialog Box)로 출력한다.

 

 

*모달 다이얼로그 박스(Modal Dialog Box)

일단 출력 되면, 종료 시키기 전까지 원래의 화면으로 돌아갈 수 없는 대화상자를 말한다.

(반대) 모달리스 다이얼로그 박스(Modaless Dialog Box).

'Language > JavaScript' 카테고리의 다른 글

자바스크립트: 다양한 이름과 버전  (0) 2022.01.02

자바스크립트는 웹 초창기에 넷스케이프사에서 만들었다.

 

자바스크립트는 '썬마이크로시스템즈(=현 오라클)에서 상표권 라이선스를 가지고 있고,

 

언어 자체 구현은 넷스케이프(=모질라)에서 담당했다.

 

넷스케이프는 이 언어를 표준화하기 위해서 ECMA(European Computer Manufacturer's Association)에 제출했는데,

 

상표권 문제로 언어의 이름을 ECMAScript라고 정했다.

 

같은 이유로 마이크로소프트가 제작한 언어의 이름은 JScript가 되었다.

 

하지만 사람들은 그냥 모두 자바스크립트라고 부른다.

 

자바스크립드 언어 자체만 볼 때, 실질적인 버전은 ECMAScript 3과 5뿐이다.

(ECMAScript4는 수년간 개발되어 왔지만, 기존의 자바스크립트와는 너무 달라서 결국 세상에 나오지못했다.)

 


 

'Language > JavaScript' 카테고리의 다른 글

자바스크립트 실행해보기  (0) 2022.01.02

+ Recent posts