Java

[Java]String 클래스 / 문자열 형변환

하체는 스쿼트 2022. 9. 27. 17:59
복습

 

2차원 배열은 => 행렬

 

3차원 배열은 => 표,행,렬 이라고 생각하면 된다.

 

 

3차원 배열 예제

 

비정방 행렬이 있을 수도 있다.

 

 

크기 선언 할때 열의 개수만 비워둘 수 있다.

 

int[][]a = new int[3][]

 

 

 

한글은 자바에서 2바이트     

(그래서 사진에 보면 5글자이므로 10바이트= 인덱스가 9까지 해서 총10칸이 있는거다.)

utf - 8 에서는 3바이트 이다.

 

/*
 *실제 메모리 상의 순서
 * 9번의 좌변에서 객체가 생성된다(힙영역에) 그리고 우변에 있는 
 * 
 * 
 * 2에서 안녕하세요를 만든후 3에서 안녕하세요를 만드려고 할때
 * 기존에 안녕하세요 가 있다면
 * 3이 기존의 주소인 2를  참조하게 된다.(실질적으로 안녕하세요는 하나만 있는 것이다.)
 * 
 * 
 */

 

기존  hello에 world를 더하는 경우는 어떻게 될까?

 

world를 heap영역에서 만들고

 

hello world 또한 heap영역에서 만든다.

 

기존의 hello 참조 주소를 변경하는게 아니라 world를 따로 만들고 world라는 글자를 hello에 붙여서

heap영역에 hello world  라는 문자를 새로 만들어서 할당하는 것이다. 

 

String이 새로운 글자마다 새로운 heap영역에 올라가는 이유는 다른영역을 침범하지 않기 위해서 반드시 복제 후에 사용하는 것이다.

 

기존의 문자열을 변경하는 것이 아니라 새로 만들때 마다 새로 힙영역에 할당해서 새로운 곳으로 연결해 주는 것이므로

메모리 누수가 많아진다.

(이런것 떄문에 String class는 메모리 누수가 많다.)

 

p191참고

 

 

 

문자열을 만드는걸 루프르 돌리게 된다면 메모리 누수가 심해진다는걸 알 수 있다.

프로그래밍에서 문자열 다루는건 굉장히 어려운 일이다.

 

문자열은 생성방법이 같고(new 이용 또는 바로 대입) 내용이 같으면 같은 주소를 참조하게 된다.

 

 

StringBuffer

 

메모리 누수를 극복하기위해 만들어진 클래스가 있다.     =>StringBuffer

JVM구현에 따라 StringBuffer가 용량을 산정하는 방식은 다르다.

(예를 한가지 들자면 크기가 넘어가려고 하면 자동으로 크기를 늘리던지....등등)

 

 

String sql = "select last_name, department_name"
+ "from employee"
+ "where";

 

위의 코딩은 굉장히 안좋은 방법이다.

"select last_name, department_name"   이거 생성되고

"from employee" 이것도 생성되고

"where";  이것도 생성된다음

"select last_name, department_name from employee where"   이 최종적으로 생성된다.

=> 메모리 누수가 심하다.

 

StringBuffer을 이용하면 해결 할 수 있다.

아래와 같은 코딩이 좋은 코딩이다.

 

StringBuffer sql = new StringBuffer();
sql.append("select last_name, department_name");
sql.append("from employee");
sql.append("where....");

 

*싱글쓰레드일 경우네는 굳이 멀티쓰레드를 사용하는 StringBuffer을 사용하지 말고

StringBulilder 를 사용해라(동기화 처리가 되어 있지 않다.)

 

여러사람이 동시에 접근할 수 있는 웹의 상황에서는 StringBuffer을 사용하는게 맞다.

 

 

멀티 태스킹/쓰레드

 

멀티 태스킹이란?

동시에 여러가지 업무를 진행하는 것이다.

 

멀티 쓰레드란?

프로그램이 내부에서 실행될때 이걸 프로세스라고 부른다.

보조 기억장치에서 메모리에 올린다음 실행된다.

 

프로세스에는 흐름이 있는데 이것 하나의 흐름을 쓰레드 라고 한다.

이런 흐름이 여러개가 동시에 실행되는 것을 멀티 쓰레드 라고 한다.

 

멀티쓰레드 동기화란?

두 스레드가 동시에 진행하면 안되는 상황이 있을 때, 두 스레드는 매개체를 통해 진행 가능 여부를 판단하고 이에 근거해 자신의 실행을 계속할지를 결정

 

 

형변환

 

 

 - lastIndexOf(int ch, int fromIndex)

 - lastIndexOf(String str, int fromIndex)

 

기본 자료형 -> 문자열 반환

valueOf(기본자료형)

 

문자열 -> byte[] 변환

getBytes()

 

문자열 -> char[] 변환

toCharArray();

 

trim:()

오른쪽 왼쪽 공백 제거 가능

 

 

문자열 비교

 

 

문자열을 == 으로 비교하면 안된다.

==으로 비교하게 되면 문자열의 해쉬코드 끼리 비교를 하기 때문이다.

 

String str1 = new String("Java");

String str2 = new String("Java");

 

잘못된 방법

str1==str2

 

옳은 방법

str1.equals(str2)

 

equalsIgnoreCase

대소문자 구분없이 비교할때 사용된다.

 

String str2 = "hello";
String str3 = "hello";

주소가 같다는건 2개가 완전히 같다는 거다.(그냥 같은거다.)

이거는 해쉬 코드가 같게 나온다.