안녕하세요. 포람페타는고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

 

 

+ Recent posts