* java.lang의 Class라는 class는 추후에 데이터베이스에서 중요!!
Math
Process,Runtime 계산기 등을 띄울 때
*utf8(조합형 한글) 검색해보기, euc-kr(완성형 한글) 검색해보기, kac5601 ---------------- 웹에서 사용
(1) String VS new String()
String str1 = "java"; (리터럴 방식)
String str3 = new String("java"); (참조형 데이터 타입 사용 방식)
Q. 문자열 리터럴은 메모리에서 어떻게 존재하는가??
> 리터럴 방식은 문자열 저장소(String Pool)인 별도의 공간이 따로 있다!!
> 문자열 리터럴은 변하지 않는다. (상수의 한 종류)
* ~At : 항상 인덱스 사용 (0부터 시작)
* ~Of : 문자가 몇 번째 있는지, 리턴타입이 보통 int
ⓐ 같은 값인지 비교 (equals / equalsIgnoreCase)
object 타입을 비교할 때는 equals 쓰기!!!!
주소값을 비교할 경우가 있을 때는 비교연산자(==) 사용하기!!!!
ⓑ 인덱스 위치로 출력
1. indexOf(int ch) : 찾을 문자의 첫번째 위치를 숫자로 반환
2. lastIndexOf(int ch) : 뒤에서부터의 위치를 반환
ⓒ boolean값으로 반환
1. contains(CharSequence s) - 문자열 안에 해당 문자열이 포함되어 있는지
2. startsWith(String prefix) - 이걸로 시작하는지
3. endsWith(String suffix) - 이걸로 끝나는지
ⓓ 대소문자 변경
1. toUpperCase(), toLowerCase() - 대소문자 구분
2. equalsIgnoreCase(String anotherString) - 대소문자 구분 x
public class StringTest1 {
public static void main(String[] args) {
//String(String original)
String s1 = null;
String s2 = new String(); //비어있는 문자열, new를 하는 순간 null은 없어진다. null이 아님!!!!
//String s2 = new String(""); 위에랑 같은 비어있는 문자열이지만, 위에와 같은 것을 만들 필요가 없기 때문에 이렇게 사용하지 x
if (s1 == null){
System.out.println("s1은 null입니다.");
}
if (s2 == null){
System.out.println("s2은 null입니다.");
}
//System.out.println("s1의 길이 :" + s1.length()); //error - NullPointerException 문자열의 길이는 메소드()!!!!!
System.out.println("s2의 길이 :" + s2.length()); // 0
//String s3 = new String(""); //String의 객체를 생성하는 방식에는 2가지가 있다. new 또는 ""(리터럴방식)
String str1 = "java";
String str2 = "java";
String str3 = new String("java");
String str4 = new String("java");
//str2에 문자열을 저장할 때? 같은 문자열이 있는지 str1을 검사하고 문자열이 같다면 str1의 주소값 자체를 str2로 가져와서 같은 문자열이 저장되는 것!!
if (str1==str2) //기본DT처럼 인식함
System.out.println("str1와 str2는 주소값이 같다.");//str1와 str2은 주소값이 같다.
if (str1==str3)
System.out.println("str1와 str3는 주소값이 같다.");//x
if (str1==str4)
System.out.println("str1와 str4는 주소값이 같다.");//x
if (str2==str3)
System.out.println("str2와 str3는 주소값이 같다.");//x
if (str2==str4)
System.out.println("str2와 str4는 주소값이 같다.");//x
if (str3==str4)
System.out.println("str3와 str4는 주소값이 같다.");//x
System.out.println("--------------------------------");
//eauals는 문자열 자체를 비교한다.
if (str1.equals(str2))
System.out.println("str1와 str2는 문자열이 같다.");//o
if (str1.equals(str3))
System.out.println("str1와 str3는 문자열이 같다.");//o
if (str1.equals(str4))
System.out.println("str1와 str4는 문자열이 같다.");//o
if (str2.equals(str3))
System.out.println("str2와 str3는 문자열이 같다.");//o
if (str2.equals(str4))
System.out.println("str2와 str4는 문자열이 같다.");//o
if (str3.equals(str4))
System.out.println("str3와 str4는 문자열이 같다.");//o
}
}
---------- run ----------
s1은 null입니다.
s2의 길이 :0
str1와 str2는 주소값이 같다.
--------------------------------
str1와 str2는 문자열이 같다.
str1와 str3는 문자열이 같다.
str1와 str4는 문자열이 같다.
str2와 str3는 문자열이 같다.
str2와 str4는 문자열이 같다.
str3와 str4는 문자열이 같다.
- String(byte[] bytes) - byte형 배열 값들을 문자열로 리턴
- String(byte[] bytes, int offset(index 시작점), int length)
- String(char[] value) - char형 배열의 값들을 문자열로 리턴
- String(char[] value, int offset, int count) -- count는 한글일때는 2byte, 영어일 때는 1byte (주의!!!!)
public class StringTest2 {
public static void main(String[] args) {
//String(byte[] bytes) - byte형 배열 값들을 문자열로 리턴
byte b[] = {97,98,99,100,101,102,103};
//byte b[] = {-56,-66,-57,-68,-77,-54}; //한글, 2바이트니까 2개의 숫자가 합해져야 1자
String s1 = new String(b);
System.out.println("s1 : " + s1); //s1 : abcdefg
//String(byte[] bytes, int offset(index 시작점), int length)
String s2 = new String(b,3,2);
System.out.println("s2 : " + s2); //de
//String(char[] value) - char형 배열의 값들을 문자열로 리턴
char[] c = {'h','e','l','l','o'};
String s3 = new String(c);
System.out.println("s3 : " + s3); //hello
//String(char[] value, int offset, int count) -- count는 한글일때는 2byte, 영어일 때는 1byte (주의!!!!)
String s4 = new String(c,1,3);
System.out.println("s4 : " + s4); //ell
}
}
---------- run ----------
s1 : abcdefg
s2 : de
s3 : hello
s4 : ell
- charAt(int index) - 해당 인덱스에 있는 문자열 리턴
- indexOf(int ch) - 첫번째 문자열의 인덱스 위치를 반환
- lastIndexOf(int ch) - 문자열의 끝에서부터 특정 문자 찾기
- concat(String str) - 문자열 합치기
- contains(CharSequence s) - 문자열 안에 해당 문자열이 있는지 없는지
- endsWith(String suffix) - 이걸로 끝나는지
- startsWith(String prefix) - 이걸로 시작하는지
- toUpperCase(), toLowerCase() - 대소문자 구분
- equalsIgnoreCase(String anotherString) - 대소문자 구분 x
public class StringTest3 {
public static void main(String[] args) {
//charAt(int index) - 해당 인덱스에 있는 문자열 리턴
String str = "hello java!!!";
char c = str.charAt(4);
System.out.println("c : " + c);
//indexOf(int ch) - 첫번째 문자열의 인덱스 위치를 반환
int i = str.indexOf(c);
System.out.println("i : " + i);
//lastIndexOf(int ch) - 문자열의 끝에서부터 특정 문자 찾기
int i2 = str.lastIndexOf(c);
System.out.println("i2 : " + i2);
//concat(String str) - 문자열 합치기
String s1 = "hello ";
String s2 = s1.concat("java"); //불변인 String변수를 바꾸고 싶다면 이렇게 대입해주기
System.out.println(s1.concat("java"));
System.out.println(s2);
System.out.println(s1); //string은 불변이다!!
//contains(CharSequence s) - 문자열 안에 해당 문자열이 있는지 없는지
System.out.println(s1.contains("java"));
System.out.println(s2.contains("java"));
//endsWith(String suffix) - 이걸로 끝나는지
System.out.println(str.endsWith("java"));
//startsWith(String prefix) - 이걸로 시작하는지
System.out.println(str.startsWith("he"));
//toUpperCase(), toLowerCase() - 대소문자 구분
String t1 = "jaVa";
String t2 = "JAva";
if (t1.equals(t2))
System.out.println("같은 문자열이다.");
System.out.println("t1을 대문자로 " + t1.toUpperCase());
System.out.println("t2을 소문로 " + t2.toLowerCase());
if (t1.toUpperCase().equals(t2.toUpperCase()))
System.out.println("t1과 t2는 대소문자 무시하는 같은 문자열이다.");
//equalsIgnoreCase(String anotherString) - 대소문자 구분 x
if (t1.equalsIgnoreCase(t2))
System.out.println("t1과 t2는 대소문자 무시하는 같은 문자열이다.");
//getBytes(Charset charset) - getBytes(utf-8)
}
}
---------- run ----------
c : o
i : 4
i2 : 4
hello java
hello java
hello
false
true
false
true
t1을 대문자로 JAVA
t2을 소문로 java
t1과 t2는 대소문자 무시하는 같은 문자열이다.
t1과 t2는 대소문자 무시하는 같은 문자열이다.
- getBytes() - 문자열을 byte 배열로 쪼갤 수 있다.
- toCharArray() - 문자열을 char 배열로 변환 (한글이든 영문이든 상관x)
public class StringTest4 {
public static void main(String[] args) {
//getBytes() - 문자열을 byte 배열로 쪼갤 수 있다.
String str = "hello java";
//String str = "안녕하세요";
byte b[] = str.getBytes();
for (int i=0;i<b.length ;i++ )
System.out.print(b[i] + " ");
System.out.println();
//byte를 char로 형변환 해버리면 영문은 상관없지만, 한글 같은 경우는 2byte이기 때문에 인식을 못하는 문제가 발생
for (int i=0;i<b.length ;i++ )
System.out.print((char)b[i] + " ");
System.out.println();
//향상된 for문 - 단순히 값을 출력하고 싶다면 사용 vs for문 - i값으로 계산 등을 하고자 한다면 향상된 for문이 아니라 이거 사용
for(byte x : b)
System.out.print(x + " ");
System.out.println();
//toCharArray() - 문자열을 char 배열로 변환 (한글이든 영문이든 상관x)
char c[] = str.toCharArray();
for (int i=0;i<c.length ;i++ )
System.out.print(c[i] + " ");
}
}
---------- run ----------
104 101 108 108 111 32 106 97 118 97
h e l l o j a v a
104 101 108 108 111 32 106 97 118 97
h e l l o j a v a
public class StringReverseTest {
public static void main(String[] args) {
String str = "!!! avaJ olleH";
//String str = "!!! 바자 녕안";
//Hello Java !!! (3~4개 방법)
//reverse한 문자열의 6번째 인덱스 값 : 'J'입니다. (3~4개 중 사용)
//1.
for (int i = str.length() -1;i>=0 ; i--) //문자열의 길이는 인덱스-1이니까
System.out.print(str.charAt(i)); //해당 인덱스에 있는 문자열 리턴
System.out.println();
//2.
String msg = ""; //literal방식의 객체 생성
for (int i = str.length() -1;i>=0 ; i--)
msg += str.charAt(i);
System.out.println(msg);
System.out.println("reverse한 문자열의 6번째 인덱스 값 : '" + msg.charAt(6) +"' 입니다.");
//3.
char a[] = str.toCharArray();
char tmpc[] = new char[a.length];
int idx = 0;
for (int i = a.length -1;i>=0 ; i--)
tmpc[idx++] = a[i];
msg = new String(tmpc);
System.out.println(msg);
System.out.println("reverse한 문자열의 6번째 인덱스 값 : '" + msg.charAt(6) +"' 입니다.");
//4.
byte b[] = str.getBytes();
byte tmp[] = new byte[b.length];
idx = 0;
for (int i = str.length() -1;i>=0 ; i--)
tmp[idx++] = b[i];
msg = new String(tmp);
System.out.println(msg);
System.out.println("reverse한 문자열의 6번째 인덱스 값 : '" + msg.charAt(6) +"' 입니다.");
System.out.println("\n-------------------");
}
}
---------- run ----------
Hello Java !!!
Hello Java !!!
reverse한 문자열의 6번째 인덱스 값 : 'J' 입니다.
Hello Java !!!
reverse한 문자열의 6번째 인덱스 값 : 'J' 입니다.
Hello Java !!!
reverse한 문자열의 6번째 인덱스 값 : 'J' 입니다.
(2) Primitive VS Object DataType
Primitive : 간단한 데이터들 (int, double, boolean, char 등등)
ex) int i = 10;
> 메모리에 값이 바로 들어간다.
Object : 여러 데이터들이 모여 있는 복잡한 데이터들 (String, System, ArrayList 등등)
ex) String s = "ABC";
> 메모리에 값이 바로 들어가지 않고, 따로 "ABC"가 메모리 어딘가에 또 저장이 된다. 메모리에는 "ABC"가 저장된 주소값이 들어간다.
'Language > Java' 카테고리의 다른 글
19.11.11. (java.util/java.text/java.awt/GUI/컨테이너/배치관리자) (0) | 2021.02.14 |
---|---|
19.11.08. (Regular Expression/ String의 문제점/ StringBuffer/ StringBuilder / StringTokenizer) (0) | 2021.02.14 |
19.11.06.(API-Java.lang/Wrapper Class/기본DT->String, String->기본DT 변환/ autoboxing / unboxing/ boxing) (0) | 2021.02.14 |
19.11.05. (참조형 데이터 타입을 저장하는 배열) (0) | 2021.02.14 |
19.11.04.(알고리즘 문제 / 숫자 야구 게임 소스) (0) | 2021.02.14 |