2022.05.31 - [JAVA] - [Snack Java] 1. 자바의 타입(Type of JAVA)
원시 타입에 대해 알아봤다면 의문이 생길 것이다.
"하나의 문자만 원시타입으로 지원하는 자바는 문자열은 어떻게 처리하는거지?"
파이썬을 먼저 배워본 사람 입장에서는 자바의 이 문자열 개념이 약간 피곤했다. 문자열은 원시타입이 아닌 하나의 클래스로 다루기 때문이다.
자바에서 제공하는 String Class를 타입처럼 사용하며 클래스에서 제공하는 메서드를 가지고 문자열을 조작할 수 있다.
String 클래스 선언 방법은 두 가지가 있다.
// 1. 문자열 리터럴 대입 방식
String var1;
var1 = "abcde";
String var2 = "abcde";
// 2. 객체 생성하여 문자열을 대입하는 방식
String var3 = new String("abcde");
// new 연산자는 클래스를 생성할 때 사용하는 키워드.
1. 문자열 리터럴 대입 방식: String 변수 = "문자열_값";
2. 객체 생성 후 대입 방식: String 변수 = new String("문자열_값");
둘 다 공통적인 선언 순서가 있다.
순서1: 둘 다 String이라는 타입을 선언해 준 후 해당 타입을 취할 변수의 이름를 선언한다. (String var)
순서2: 할당자로 데이터를 연결해준다. (=)
순서3: 문자열 값을 넣어준다. 문자열 리터럴(문자열 그 자체라는 뜻이다)을 쌍따옴표로 감싸 선언하거나 new라는 객체 생성 키워드를 활용해 String("문자열_값") 형태로 담아준다.
이전에 타입에서 설명했듯 원시타입을 제외한 나머지는 참조타입에 속한다. 따라서 문자열 데이터도 데이터 자체를 변수에 저장하는 것이 아니라 데이터가 저장된 주솟값만 변수에 저장하게 된다. 앞서 본 2가지 방식 모두 참조형태이지만, 각각 가리키는 데이터의 주솟값이 달라진다.
String name1 = "Yunjuniverse";
String name2 = "Yunjuniverse";
String name3 = new String("Yunjuniverse");
//case 1
System.out.println(name1 == name2); // -> true
//case 2
System.out.println(name1 == name3); // -> false
문자열 리터럴 저장 방식으로 저장한 "Yunjuniverse"라는 두 변수는 같은 주솟값을 가지고 있지만, 새로운 객체로 문자열을 생성한 경우에는 데이터가 따로 저장이 되기 때문에 다른 주솟값을 가지고 있어 비교 연산자(==)로 비교 시 'false거짓'을 반환한다.
중요한건 문자열이라는 데이터의 성질이다. 기본적으로 문자열은 문자의 조합이기 때문에 조합되어 있는 문자를 필요에 맞게 조작할 수 있어야 한다.
아까 String은 클래스로 구현되었다고 했다. 따라서 기본적으로 String클래스에 마련된 메소드로 문자열을 쉽게 조작할 수 있다.
예를 들어, "Yunjuniverse"라는 문자열에서 7번째 문자는 뭐지? 라고 컴퓨터에 물어보기 위해서는 String클래스에서 제공하는 charAt(index번호) 메소드를 이용해 물어보면 된다. 이 메소드로 char 형태의 값을 반환할 수 있다. (참고로 답은 'i'가 아닌 'v'이다. 인덱스는 0부터 시작하기 때문이다.)
이외에도 수많은 메소드가 존재한다. 해당 반환값과 사용방법을 모아놓은 오라클의 공식 문서를 참고하자.
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html
String (Java Platform SE 7 )
Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. The character sequence represented by this String object is compared lexicographically to the character sequence represented by the argum
docs.oracle.com
자주 사용하는 메서드는 밑의 코드에 활용 방법과 출력 값을 모두 적어 놓았으니 확인하자.
public class main
{
public static void main(String[] args){
//문자열 선언
String name = "Yunjuniverse";
String nameUpper = new String("YUNJUNIVERSE");
String nameLower = "yunjuniverse";
String nameSpaced = " Y U N J UN IVER SE";
String nameEmpty = new String();
//1. charAt(int index): 해당 문자열의 특정 인덱스에 해당하는 문자를 반환함. 반환타입: char
System.out.println(name.charAt(7)); // 출력: v
//2. compareTo(String str): 해당 문자열을 인수로 전달된 문자열과 사전 순으로 비교. 반환타입: int
System.out.println(name.compareTo("sugarman")); // 출력: -26, 비교 값이 사전 순으로 앞이면 음수, 뒤면 양수, 같으면 0이다.
//3. compareToIgnoreCase(String str): 해당 문자열을 인수로 전달된 문자열과 대소문자 구분 없이 사전 순으로 비교. 반환타입: int
System.out.println(name.compareToIgnoreCase(nameUpper)); // 출력: 0, 동일한 순서를 가진다고 판단
//4. concat(String str): 문자열 뒤에 인수로 전달된 문자열을 추가함 반환타입: String
System.out.println(name.concat(nameUpper)); // 출력: YunjuniverseYUNJUNIVERSE
//5. substring(int beginIndex): 해당 문자열의 전달된 인덱스부터 끝까지를 새로운 문자열로 반환함. 반환타입: String
System.out.println(name.substring(3)); // 출력: juniverse -> YUN이 날아갔다
//6. substring(int beginIndex, int endIndex): 해당 문자열의 전달된 인덱스부터 마지막 인덱스까지 잘라내 새로운 문자열로 반환함. 반환타입: String
System.out.println(name.substring(3, 6)); // 출력: jun
//7. toLowerCase(): 해당 문자열을 모두 소문자로 변환 반환타입: String
System.out.println(nameUpper.toLowerCase()); // 출력: yunjuniverse -> 대문자가 소문자로 변환되었다.
//8. toUpperCase(): 해당 문자열을 모두 대문자로 변환 반환타입: String
System.out.println(nameLower.toUpperCase()); // 출력: YUNJUNIVERSE -> 소문자가 대문자로 변환되었다.
//9. split(String regex): 해당 문자열을 전달된 정규 표현식(regular expression)에 따라 나눠서 반환. 반환타입: String
System.out.println(nameSpaced.split("\\s")); // 출력: [Ljava.lang.String;@30f39991 -> 배열의 주솟값 출력
//10. trim():해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자를 제거함.. 반환타입: String
System.out.println(nameSpaced.trim()); // 출력: Y U N J UN IVER SE
//11. length():해당 문자열의 길이를 반환함. 반환타입: int
System.out.println(name.length()); // 출력: 12
//12. isEmpty():해당 문자열의 길이가 0이면 true를 반환하고, 아니면 false를 반환함. 반환타입: boolean
System.out.println(nameEmpty.isEmpty()); // 출력: true
}
}
'JAVA' 카테고리의 다른 글
[Snack Java] 4. 자바의 변수(variable), 상수(constant), 리터럴(literal), 형 변환(type casting) (0) | 2022.06.02 |
---|---|
[Snack Java] 3. 자바의 문자열 클래스: 심화(StringTokenizer, StringBuilder, StringBuffer) (0) | 2022.05.31 |
[Snack Java] 1. 자바의 타입(Type of JAVA) (0) | 2022.05.31 |
객체지향을 위한 자바 언어의 구조와 원칙 (0) | 2022.05.30 |
자바(JAVA)란 무엇인가? What is JAVA? (0) | 2022.05.23 |