* 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"가 저장된 주소값이 들어간다.

 

+ Recent posts