본문 바로가기
Programming/Java, Spring

[Java 기초문법] 텍스트 다루기 | concatenation, string length, indexOf, split, startsWith & endsWith, contentEquals

by Renechoi 2022. 10. 17.

 

[Java 기초문법] by Professional Java Developer Career Starter: Java Foundations @ Udemy

 


 

 

String Concatenation - concat 

 

 

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

        String text1 = "this is my text1";
        String text2 = "this is my text2";
        System.out.println(text1 + text2);


    }
}

return : this is my text1this is my text2

 

 

두 스트링이 붙어있는 상태로 출력된다.

text1 뒤에 빈칸을 주어서 하드코딩할 수도 있지만 해결책이 아님 

 

애초에 +를 사용하면 use of memory가 크고 여러개 변수를 사용해야 할 때 효율적이지 못하다 

 

 

 

두번째 방법은 String class의 concat 메서드를 이용하는 것이다. 

 

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

        String text1 = "this is my text1";
        String text2 = "this is my text2";
        System.out.println(text1 + text2);

        System.out.println(text1.concat(text2));
    }
}

 

리턴 : this is my text1this is my text2

 

 

그렇다면 플러스를 사용하지 않고 공백을 주면서 합칠 수 없을까? 

 

 

10000개 그 이상을 합쳐야 한다면 ? 

 

 

3번째 방법으로 StringBuilder()를 써볼 수 있다. 

 

String finalString = new StringBuilder().append(text1).append(text2).toString();
System.out.println(finalString);

 

리턴 : this is my text1this is my text2

 

String finalString = new StringBuilder()
        .append(text1)
        .append(" ")
        .append(text2)
        .toString();
System.out.println(finalString);

 

리턴 : this is my text1 this is my text2

 

훨씬 효율적이고 가용성이 높은 코드로 쓸 수 있다. 

 

 

StringBuilder를 사용할 때 

만약 메모리가 커진다면 공간을 미리 지정해줄 수 있다. = capacity를 지정 

 

by specifying this, i'll be exactly be like that. 

String finalString = new StringBuilder(text1.length() + text2.length() + 1)
        .append(text1)
        .append(" ")
        .append(text2)
        .toString();
System.out.println(finalString);

 

 

 

 

스트링버퍼 stringbuffer를 사용할 수도 있다. 

 

String otherFinalString = new StringBuffer()
        .append(text1)
        .append(" ")
        .append(text2)
        .toString();

System.out.println(otherFinalString);

리턴 : this is my text1 this is my text2

 

 

차이점은 ? 

 

stringbuffer가 more thread safe하다. 

= multile threads are able to interact with in instance of the stringbuffer safely.

 

하지만 그 대가로 성능적 저하가 올 수 있음 

 

 

 

아래와 같이 하는 방법도 있지만 only useful with a few strings provided 

 

System.out.format("%s %s", text1, text2);

 

String oneMoreFinalString = String.format("% %s", text1, text2);

 

 

 

 


 

 

Determining the Length of a Sting Length 

 

 

 

public class LearnStrings {
    public static void main(String[] args) {
        String myText = "for score and seven years ago";
        System.out.println(myText.length());    // 공백 포함 


    }
}


 

 

길이 관련해서 excution을 보호하는 방식 중에 하나는 if를 사용하는 것이다 

 

 

public class LearnStrings {
    public static void main(String[] args) {
        String myText = "for score and seven years ago";
        System.out.println(myText.length());   
        char[] chars = myText.toCharArray();

        int index = 100;

        if (index < myText.length()){
            System.out.println(chars[index]);
        }


    }
}


 

length가 활용되는 방식은 앞에서 살펴본 것처럼 다음과도 같다. 

 

tell the stringbuilder total number to fix.

 

 

public class LearnStrings {
    public static void main(String[] args) {
        String myText = "for";
        String secondText = "score";
        StringBuilder builder = new StringBuilder(myText.length() + secondText.length())
                .append(myText)
                .append(secondText);

        System.out.println(builder.toString());

    }
}


 

if capacity not initialized, what the string builder would do by default is it would have to jut guess 

what it considered to be a resonalbe amount of space. 

 

따라서 

메모리 할당에 있어서 훨씬 효율적인 방식을 제공한다. 

 

 

 


 

 

substring 

: getting parts of a string 

 

 

 

 

public class LearnStrings {
    public static void main(String[] args) {
        String myText = "apple";
        String myNewText = myText.substring(0);
        System.out.println(myNewText);

    }
}


 

return : apple

 

substring의 두번째 인자를 주지 않았기 때문에 그대로 출력 

 

public class LearnStrings {
    public static void main(String[] args) {
        String myText = "apple";
        String myNewText = myText.substring(1,4);
        System.out.println(myNewText);

    }
}


 

 

리턴 : ppl

 

 

첫글자를 cap으로 하는 string을 리턴하려면 어떻게 해야할까? 

 

public class LearnStrings {
    public static void main(String[] args) {
        String myText = "apple";
        String firstPart = myText.substring(0,1).toUpperCase();
        String secondPart = myText.substring(1);
        String myNewText = firstPart.concat(secondPart);
        System.out.println(myNewText);

    }
}


 

리팩토링의 과정은 계속 필요하고 지나치지 않다. 

 

좋은 개발자는 naming하고 생각하는데 많은 시간을 들임. 

 

아래와 같이 바꿀 수도 있다. 

 

public class LearnStrings {
    public static void main(String[] args) {
        String myText = "apple";
        String firstPart = myText.substring(0,1).toUpperCase();
        String secondPart = myText.substring(1);
        String myNewText = new StringBuilder(firstPart).append(secondPart).toString();
        System.out.println(myNewText);

    }
}


 

 


 

indexOf

: tell where inside of string, a substring index lies.

 

 

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

        String myText = "four score and seven years ago";
        System.out.println(myText.indexOf("seven"));


    }
}

 

15번째에서 찾을 수 있다는 것을 represent한다. 

 

 

 

아스키코드로 읽는 방식도 가능한데, 

 

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

        String myText = "ABCDEFGABCDEFG";
        System.out.println(myText.indexOf(65));


    }
}


 

리턴 : 0 

 

 

// 자바의 모든 글자는 NUMBER로 표현될 수 있도록 되어 있음 // 

=> default = unicode

 

 

그렇다면 이런 것을 왜 알아야 할까? 

 

TYPE하기 힘든 특정 character들에 대한 접근이 가능. 

 

 

없는 것을 = no match되는 것을 요구하면 -1을 리턴한다

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

        String myText = "ABCDEFGABCDEFG";
        System.out.println(myText.indexOf(122));


    }
}


return : -1 

 

 

 

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

        String myText = "ABCDEFGABCDEFG";
        System.out.println(myText.lastIndexOf("A"));


    }
}

 

리턴 7 

 

 

 

 

처음 A를 스킵하고 그 다음 나오는 것의 index를 리턴 

 

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

        String myText = "ABCDEFGABCDEFG";
        System.out.println(myText.lastIndexOf("A",2));


    }
}

 

 

리턴 7 

 

 

 

전화번호가 str으로 주어질때 이것을 각각 리턴하는 방식에 대해 생각해보자. 

 

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

        String phoneNumber = "(234) 333-5551";
        String areaCode = "";
        String exchange = "";
        String linenumber = "";

        System.out.println(areaCode);
        System.out.println(exchange);
        System.out.println(linenumber);

    }
}

 

 

indexof 함수와 

static method를 이용하기 

 

 

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

        String phoneNumber = "(234) 333-5551";
        String areaCode = parseAreaCode(phoneNumber);
        String exchange = parseExchange(phoneNumber);
        String linenumber = parseLineNumber(phoneNumber);

        System.out.println(areaCode);
        System.out.println(exchange);
        System.out.println(linenumber);
    }

        public static String parseAreaCode(String phoneNumber){
            int openParens = phoneNumber.indexOf("(");
            int closeParens = phoneNumber.indexOf(")");
            String areaCode = phoneNumber.substring(openParens+ 1, closeParens);

            return areaCode;
        }

        public static String parseExchange(String phoneNumber) {
            int spaceIdx = phoneNumber.indexOf(" ");
            int hyphenIdx = phoneNumber.indexOf("-");
            String exchange =phoneNumber.substring(spaceIdx + 1, hyphenIdx);
            return exchange;
        }

        public static String parseLineNumber(String phoneNumber){
            int hyphenIdx = phoneNumber.indexOf("-");
            // subsring을 하고 끝 숫자를 안주면 알아서 끝까지 가주므로 마지막 것은 생략해도 됨
            String linenumber = phoneNumber.substring(hyphenIdx + 1);
            return linenumber;
        }
}


 

하지만 이런 방식은 not concise 

 

만족스러운 코드가 아니다. 

 

예를 들어 

 

 

 

이와 같이 형식이 다른 입력이 들어왔을 때 

 

답이 달라져 버리는 fragility가 있음 

 

 

 

 


 

split 

 

csv 같은 정형 데이터를 읽어올 때 split이 유용하게 쓰일 수 있다. 

 

\n을 기준으로 쪼개는 array와 요소를 생성 

public class LearnStrings {
    public static void main(String[] args) {
            String text = """
                    Smith,Fred,1/1/79,1111 ABC St.,Apple,CA
                    McGuire,Jerry,2/2/70,2222 DEF St.,Orange,NV
                    """;

            String[] people = text.split("\n");
            System.out.println(people.length);


        }
}

리턴 2 

 

 

 

리밋을 정할 수도있다. 

 

 

 

 

 

 


startsWith & endsWith

 

boolean을 리턴한다 

 

public class LearnStrings {
    public static void main(String[] args) {
        String filename = "myfile.txt";
        System.out.println(filename.endsWith("txt"));



    }
}

 

리턴 true

 

 

 

만약 아래와 같은 상황에서 주어진 filename이 항상 true 리턴하게 하려면 어떻게해야 할까? 

 

public class LearnStrings {
    public static void main(String[] args) {
        String filename = "   file001.txt";
        System.out.println(filename.startsWith("file"));



    }
}


 

strip을 써서 가공해준다 

 

 

 

 


 

contentEquals 

 

return boolean whether or not element is equavalent 

 

 

public class LearnStrings {
    public static void main(String[] args) {
        String firstText = "Apple";
        String secondText = "Apple";

        System.out.println(firstText.contentEquals(secondText));


    }
}


 

리턴 true 

 

 

contetEquals와 equals의 차이는 ? 

 

 

contentEquals는 말그대로 content가 맞는지를 확인 / dont matter data type 

 

예를 들어 String A와 Stringbuilder A를 비교할 때 " " 안의 내용만 맞으면 true 리턴 

 

 

 

반면 

 

eqaul은 

 

타입과  character squence에 대한 검증을 포함 

 

 

 

 

 

 

 

반응형