728x90

 

자바 기본 API(Application Programming Interface)

목차

1.String

2.Wrapper

3.Date

  1. Calendar
  2. Gregorian Calendar

4.Math

 


 

String Class

String : 문자열 클래스

문자열의 값 수정 불가(불변 클래스) 수정 시 수정된 문자열이 새로 할당 되어 새 주소를 넘김

String name = "abc";
name = "def"; // <-수정된 거 아닌가? 수정된거 아님
immutable(불변) 의미
배열 크기 변경 불가능처럼
눈으로 보이기는 수정되는 것처럼 보이나 컴퓨터 안에 로직은 삭제 새로생성되었고 주소값도 변경됨

 

 

API에 구현이 되어있는 메소드들

hashCode(), identityHashCode()

 

hashCode()

hashCode() : int ← 매개변수x 주소값 반환

Returns a hash code for this string.

주소값을 보기 위해 사용하는 코드

객체의 주소값을 해시코드로 구현한 결과값

object클래스에 있음.

실제 주소값을 직접 볼 수 있는건 아님.

자바는 애초에 주소값을 다이렉트로 볼 수 없게 만듬

equals비교했는데 둘이 같다면 해쉬코드 결과도 둘이 같게해줘야한다

System.out.println("str1의 hashcode : "+str1.hashCode());
System.out.println("str2의 hashcode : "+str2.hashCode());
System.out.println("str3의 hashcode : "+str3.hashCode());

 

identityHashCode()

System.identityHashCode(변수명)

실주소값을 연산해놓은 결과값을 도출하는 메소드

스트링은 불변 클래스

수정되는게 아닌 새로 생성하고 기존것 삭제하고 대체되는 개념

 


 

StringBuffer & StringBuilder

문자열 클래스

주소값은 그대로하고 문자열을 수정 가능케 하는 메소드

가변클래스 : 문자열 수정 가능. mutable(가변)

    - String클래스 : 변경이 적고 읽기만 많은 경우에 유리

    - StringBuffer / StringBuilder : 문자열에 대한 수정이 많이 일어나는 경우 유리

https://rise-up.tistory.com/303

 

[Java] 주소값은 그대로하고 문자열을 수정 가능케 하는 메소드 : StringBuffer & StringBuilder

StringBuffer & StringBuilder 클래스는 불변 클래스인 String 클래스랑 다르게 문자열 수정이 가능한 가변 클래스다 String이 수정이 불가능하다니 무슨 말일까? String 타입의 변수에 값을 넣어보면 언제든

rise-up.tistory.com

 

 

StringBuffer vs StringBuilder 비교

불변 클래스인 String 클래스랑 다르게 문자열 수정이 가능한 가변(mutable)클래스

문자열 값 수정 가능, mutable(가변) 수정, 삭제 등이 기존 문자열에 수정되어 적용 기본 16문자 크기로 지정된 버퍼를 이용하며 크기 증가 가능

모두 같은 기능이나 동기화처리 가능 / 불가능으로 구별된다

동기화가 들어가면 안전 : 데이터에 대해 락을 걸어놓고 진행. 처리속도가 느림. 동기화가 안들어가면 속도가 빠름

  • StringBuffer   동기화 o / 느림 / 안전 / thread safe기능o
  • StringBuilder 동기화 x / 빠름 / 안전 x / thread safe기능x

 

메모리 관리를 위해 String대신 쓰기도 하나 String을 대개 많이씀

컴퓨터도 많이 좋아지고 버퍼나빌더를 쓴다고 눈에띄게 빨라지는건 아님

StringBuffer/StringBuilder는 자동으로 수용량 증가

 

 

쓰레드 세이프 기능(thread safe)

멀티 쓰레드 프로그래밍에서 여러 쓰레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것을 의미

이를 위해 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 "임계 영역(critical section)"과 "잠금(lock)"의 개념이 도입됨

 

  • 임계영역(critical section)

둘 이상의 스레드가 동시에 접근해서는 안 되는 공유 리소스(자료 구조 또는 장치)를 접근하는 코드의 일부를 뜻함

  • 락(lock)

모든 객체에는 락(lock)이 하나씩 있고 이 락(lock)을 가지고 있는 스레드만 해당 객체의 임계 영역 코드와 관련된 작업이 가능

  1. 공유 데이터를 사용하는 코드 영역을 임계 영역으로 지정하고, 공유 데이터가 가지고 있는 lock을 획득한 단 하나의 쓰레드만 영역 내의 코드를 수행할 수 있게함
  2. 해당 쓰레드가 임계 영역 내의 모든 코드를 수행하고 벗어나 lock을 반납해야만 다른 쓰레드가 반납된 lock을 획득하여 임계 영역 내의 코드를 수행할 수 있도록함

 

 

쓰레드(thread)의 동기화(Synchronization)

여러 스레드가 한 리소스를 사용하려 할 때

사용하려는 스레드 하나를 제외한 나머지 스레드들은 리소스를 사용하지 못하도록 막는 것

 

쓰레드 동기화는 크게 Synchronized, Volatile, Atomic 3가지가 있고 추후 깊게 공부해보자

 

728x90
반응형

+ Recent posts