[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에 대한 검증을 포함