| Java.lang 패키지
- 가장 기본이 되는 클래스를 담고 있으며, import 없이 사용 가능하다.
- Oracle에서 제공하는 java.lang 패키지에 대한 상세 정보는 아래 링크에 (JDK8 기준)
https://docs.oracle.com/javase/8/docs/api/java/lang/package-summary.html
- 아래 표는 위 링크에서 소개하는 java.lang의 인터페이스와 클래스 중 자주 사용할만한 것만 일부를 가져온 표이다.
Interface | Class |
Comparable | Object |
Cloneable | Math |
Runnable | Process |
Readable | Thread |
Thread.UncaughtExceptionHandler | String |
Iterable | System |
... | Character, Integer, Long.... |
| Object
메소드 | 내용 |
clone | 현재 객체를 복사한 객체를 반환 |
equals | 참조되는 주소값을 비교 (* 주의 : null값은 비교할 수 없다) |
getClass | 현재 객체타입의 런타임 객체를 반환 |
hashCode | 객체의 해쉬코드를 반환 |
toString | java.lang.Object@해쉬코드를 반환 오버라이딩하여 주로 사용 |
| String
1. String은 힙에 저장되며, 두 가지 방식으로 저장된다.
종류 | 저장 영역 |
문자열 리터럴 | Heap 영역 내 "String Constant Pool"에 생성 |
문자열 객체 | Heap 영역 내 별도의 객체로 생성 |
// s1과 s2는 같은 곳을 가리킨다.
String s1 = "Spring";
String s2 = "Spring";
// s3와 s4는 다른 곳을 가리킨다.
String s3 = new String("Spring");
String s4 = new String("Spring");
2. String 메소드들
contains | trim | compareTo | toString |
indexOf lastIndexOf |
substring | equals equalsIgnoreCase |
toLowerCase toUpperCase |
startsWith endsWith |
split | valueOf | toCharArray |
length | charAt | replace replaceAll |
concat * |
* concat : 문자열을 덧붙이는 메소드로 +를 사용하는 것과 동일하다.(자바에서는 잘 사용하지 않는다)
pf. mariaDB, mysql에서 문자열을 조합할 때 concat('a', 'b', 'c')를 사용한다. (Oracle은 ||를 통해 문자열을 조합)
3. 자바는 기본적으로 UTF-16 인코딩 방식을 다른다.
※ EUC-KR과 UTF-8방식에 대하여
> 확장된 아스키 코드와 유니코드의 역사
- 유니코드 이전에는 각 나라별로 확장된 아스키코드(Extended Ascii)를 사용했다.(아스키 코드의 문자는 1byte)
- 나라별로 인코딩 방식이 상이하다보니 전 세계의 데이터가 모두 다르게 읽히는 문제가 발생했다.
- 이를 해결하고자 유니코드를 만들었다. (유니코드의 문자는 2byte)
- 하지만 유니코드는 영문자의 경우 사용하는 메모리 공간이 1byte -> 2byte가 된다는 단점이 있어,
영어권 같은 나라에서는 유니코드를 사용하는 것이 큰 메리트가 되지 않았다.
- 그래서 나온 것이 UTF-8. UTF-8은 가변 길이를 제공하여, 각 나라의 언어별로 최적화된 문자 크기를 할당한다.
ex. 영문자의 경우 1byte, 한글의 경우 3byte
> EUC-KR과 UTF-8.
- EUC-KR은 유니코드가 나오기 이전에 사용하던 한글 인코딩 방식(Extended Ascii)이다.
* 자바의 KSC5601기법은 곧 EUC-KR 인코딩을 말하며, 윈도우OS에서 MS949와 동일한 기법을 사용한다.
* 윈도우의 기본 인코딩 방식은 MS949다. 이클립스를 키면 늘 이 인코딩이 디폴트로 설정되어 있어 UTF-8로 바꾸는게 필요
- EUC-KR을 사용하면 온전한 한글을 만들기가 어렵다. (ex.'뷁' 이라는 문자가 없음)
- 당연한 얘기지만, 인코딩 방식이 EUC-KR일 때, 디코딩을 UTF-8로 하면 문자가 깨지게 된다. (제대로 인식을 못함)
- 그렇기에 항상 에디터를 쓸 때 사전에 인코딩 방식을 UTF-8로 설정을 해두는 것이다.
4. 자바에서 인코딩을 변환하는 메소드 getBytes()
import java.nio.charset.Charset;
public class StringTest {
public static void main(String[] args) {
String sample = "행복한개발자가되자"; // 설정에서 UTF-8 방식으로 바꾼 상태
try {
System.out.println("Default Encoding : " + Charset.defaultCharset());
byte[] default_encoding = sample.getBytes();
byte[] euc_kr = sample.getBytes("EUC-KR");
System.out.println(">> default decoding : " + new String(default_encoding));
System.out.println(">> EUC-KR decoding : " + new String(euc_kr));
} catch (Exception e) {
System.out.println("Encoding Error");
System.out.println(e.getMessage());
}
}
}
>> 결과
Default Encoding : UTF-8
>> default decoding : 행복한개발자가되자
>> EUC-KR decoding : �ູ�Ѱ����ڰ�����
| StringBuffer
1. 문자열 불변 법칙
String 불변의 법칙이란?
- 문자열 할당 후 수정이 있을 때, 기존 메모리에서 데이터를 수정하지 않고,
- 새로운 메모리 공간을 할당하여 그곳의 주소를 가리키도록 하는 방식
>> 문자열의 변경(추가/삭제/수정)이 빈번한 경우, 단순 덧셈 시 시간/공간복잡도에 영향을 준다.
- 앞서 문자열 리터럴의 경우, 힙의 string constant pool에 저장되며,
서로 다른 참조변수(ex. s1, s2)가 같은 메모리 공간을 참조한다고 했다.
- 문자열에 수정이 있어날 때마다 메모리 공간을 재설정해주지 않으면 s1에서 수정한게 s2에 영향을 미치기 때문에
String에 수정사항이 발생할 때마다 매번 메모리를 재할당해준다. (문자열 불변 법칙)
- 문자열 불변 법칙의 특성 때문에 많은 문자열 데이터를 수정/삭제해야하는 경우, 단순 연산을 사용하면(ex. +) 시간복잡도/공간복잡도 면에서 효율성이 떨어질 수 있다.
- 그래서 사용하는 게, StringBuilder/StringBuffer다.
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("hello");
sb.append(System.lineSeparator());
sb.append("this is StringBuffer!");
System.out.println(sb);
}
}
>> 결과
hello
this is StringBuffer!
2. StringBuilder와 StringBuffer의 차이점
StringBuilder | StringBuffer | |
공통점 | char[] 배열로 이루어진 버퍼로, String 추가/수정/삭제 연산시 시간/공간 사용을 절약 * 디폴트로 16의 사이즈를 가지며 추가적으로 늘릴 수 있다. |
|
차이점 | Thread-safe | Thread-safe x |
public synchronized StringBuffer append(String str) {
/*생략*/
}
public AbstractStringBuilder append(Object obj) {
/*생략*/
}
| Math
- 수학 계산에 사용되는 클래스.
- 아래는 Math를 사용하여 소수점 n번째까지 반올림/올림/버림을 하는 법과,
- 두 좌표 간의 거리를 구하는 법을 작성한 코드이다.
public class MathTest {
public static void main(String[] args) {
// 1. 반올림, 올림, 버림
double d = 123.2364;
int n = 3; // 소수점 자릿수
// 소수점 n번째까지 반올림
double d1 = Math.round(d * Math.pow(10, n)) / Math.pow(10, n);
System.out.println(d1);
// 소수점 n번째까지 올림
n = 2;
double d2 = Math.ceil(d * Math.pow(10, n)) / Math.pow(10, n);
System.out.println(d2);
// 소수점 n번째까지 버림
double d3 = Math.floor(d * Math.pow(10, n)) / Math.pow(10, n);
System.out.println(d3);
// -----------------------------------------------------------
// 2. 피타고라스의 법칙을 활용하여 두 좌표의 거리 구하기
int[][] pos = {{2, 1}, {5, 5}};
int xDistance = pos[1][0] - pos[0][0];
int yDistance = pos[1][1] - pos[0][1];
double distance = Math.sqrt(Math.pow(xDistance, 2) + Math.pow(yDistance, 2));
System.out.println(distance);
}
}
[ 참고 및 출처 ]
부트캠프 강의를 들은 후 여러 자료를 참고하여 정리하였습니다.
- 인코딩 관련 참조
https://codechacha.com/ko/java-convert-bytes-to-string/
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=pjok1122&logNo=221505713248
https://corock.tistory.com/139
https://dogcowking.tistory.com/289
- 문자열 불변 법칙
https://starkying.tistory.com/entry/what-is-java-string-pool
'Language > Java' 카테고리의 다른 글
JAVA 라이브러리 - 제네릭 클래스 (0) | 2022.08.10 |
---|---|
JAVA 라이브러리 - 날짜, 시간 관련 클래스(java.util/java.time..) (0) | 2022.08.10 |
객체지향 언어의 특징 4_캡슐화 (정보 은닉) (0) | 2022.07.22 |
객체지향 언어의 특징 3_다형성 (사용 편의성) (0) | 2022.07.22 |
객체지향 언어의 특징 2_상속 (재사용 + 확장) (0) | 2022.07.20 |