패키지 : java.lang
기본 데이터타입을 참조형으로 포장하여 기본 데이터타입의 변수를 객체타입으로 사용할 수 있게 해줌
| 기본형 | 참조형(Wrapper 클래스) |
|---|---|
| boolean | Boolean |
| char | Character (기본형과 이름이 다름) |
| byte | Byte |
| short | Short |
| int | Integer (기본형과 이름이 다름) |
| long | Long |
| float | Float |
| double | Double |
기본형은 자바 클래스들의 상속구조(계층구조)에서 빠져있어 Object 클래스의 자식타입이 아님 👉🏻 Wrapper 클래스를 이용하여 참조형 형식으로 표현하는 동시에 Object 클래스의 자식클래스가 됨
int num = 10; // int타입 변수
Integer iVal1 = num; //Integer 타입 변수 / int 변수를 직접 대입 가능
Integer iVal2 = 12345; //직접 값 대입도 가능
Integer iVal3 = new Integer(6789); //Error, 생성자 수정 불가
//int타입 변수에 직접 대입 가능
int i1 = iVal1;
int i2 = iVal2;
-------------------------------------------------------------------------------
Integer.BYTES / Integer.SIZE / Integer.MIN_VALUE / Integer.MAX_VALUE
👉🏻 자료형에 대한 정보 출력 가능
<문자열에서 데이터 추출하기>
int num = Integer.parseInt("12345");
double dNum = Doouble.parseDouble("3.4567");
boolean bData = Boolean.parseBoolean("true");
💡 문자열에서 문자 추출하기 💡
char chData = str.chatAt(0);
➡ 문자열 변수 대신 리터럴 상수 직접 참조 가능
char chData = "H".charAt(0);
---------------------------------------------------------------------------이 밑으로 다 인터페이스 charSequence를 상속받은 char의 자식클래스들
패키지 : java.lang
문자열을 다루는 기능(메소드)들을 포함하는 문자열을 표현하는 클래스
✔ 문자열 리터럴 상수도 String 클래스 타입으로 적용 가능
String str1 = "Banana"; ➡ 리터럴 상수
String str2 = new String("Apple"); ➡ 동적 할당한 문자열
👉🏻 변수는 main()가 활용하는 STACK영역에 공간이 만들어짐
👉🏻 상수는 상수 CODE 영역에 공간이 만들어짐 ➡ 변수에는 이 상수의 공간주소가 저장됨
👉🏻 인스턴스는 HEAP 영역에 공간이 만들어짐 ➡ 변수에는 이 인스턴스의 주소가 저장됨
String str = "Apple";
str = "Banana";
str = "Cherry";
String str = "Banana";
str += "Cherry";
💡 메소드가 원본을 건드리는지 API확인하고 사용하기
str.length() / 문자열의 길이
str.toLowerCase() / 문자열 전부 소문자로 변환
str.toUpperCase() / 문자열 전부 대문자로 변환
str.charAt(int) / n번째 인덱스의 문자 추출
str.replace(char1, char2) / 문자열의 char1을 전부 char2로 변환
str.replace(String1, String2) / 문자열의 연속된 문자 String1을 String2로 변환
str.contains(String) / 특정 문자열을 포함하고 있는지 확인
str.substing(int) / 문자열을 n번째 인덱스부터 끝까지 발췌
str.substing(int, int) / 문자열을 n1번째 인덱스부터 (n2-1)번째 인덱스까지 발췌
특정 규칙을 이용해서 문자열을 구분
구분자를 적용하여 문자열을 토큰화(tokenizer) 👉🏻 구분자를 지정하지 않으면 공백문자를 구분자로 사용
String data1 = "HI Hello Hola";
data1.split(delimiter); / 구분자를 기준으로 문자열 토큰화
-----------------------------------------------------------------------------------------------------------------
StringTokenizer st1 = new StringTokenizer(data1);
st1.countTokens(); / 토큰화된 문자열의 토큰 갯수
st1.nextToken(); / 현재 토큰 문자열을 반환 후 다음 토큰을 반환할 준비
st1.hasMoreToken(); / 반환할 토큰이 남아있는지 boolean값으로 리턴
//띄어쓰기 한 칸을 구분자로 적용하여 data1문자열을 토큰화하고 배열에 저장 후 for-each구문을 이용해 토큰 하나씩 출력
String data1 = "HI Hello Hola";
String[] tokens = data.Split(" ");
for(String token : tokens) {
System.out.println(token);
}
➡ HI / Hello / Hola
-----------------------------------------------------------------------------------------------------------------
String data2 = "I!@#am!@#Spider!@#man";
tokens = data2.split("!@#");
for(String token : tokens) {
System.out.println(token);
}
➡ I / am / Spider / man
-----------------------------------------------------------------------------------------------------------------
//StringTokenizer 클래스를 이용하여 문자열 토큰화하기
StringTokenizer st1 = new StringTokenizer(data1);
System.out.println(st1.countTokens());
➡ 3
-----------------------------------------------------------------------------------------------------------------
//토큰이 존재하는 만큼 토큰 출력 반복하기
while(st1.hasMoreToken()) {
System.out.println(st1.nextToken());
}
객체 내부에 문자열을 저장하는 공간을 따로 생성하여 그 공간을 지속적으로 관리하면서 사용 👉🏻 저장소 공간의 크기를 늘리거나 줄일 수 있어 수정이나 삭제가 빈번한 문자열을 다룰 때 좋음
동기화처리가 되어있어 멀티 스레드 환경에 안전함 ➡ Thread Safe
👉🏻 멀티 스레드 환경에서 사용
동기화처리가 되어있지 않음
👉🏻 싱글 스레드 환경에서 사용
StringBuffer sb;
StringBuilder sb;
👉🏻 몇몇개의 메소드만 다를 뿐 거의 같음
sb = "Apple"; //Error, 리터럴 상수 직접 대입 불가
sb = new StringBuffer();
sb.length() / 저장된 문자열의 길이
sb.capacity() / 저장 가능한 공간의 총 크기
sb.append() / 저장공간에 문자열 추가
sb.reverse() / 저장된 문자열을 뒤집어서 역으로 출력
sb.trimToSize() / 남은 capacity의 공간 잘라내기
자바에서 제공하는 기본 자료구조들을 모아놓은 것 👉🏻 List, Set, Map 세 가지형태의 자료구조 제공
💡 컬렉션은 요소의 데이터타입을 제네릭, Generic을 통해 지정해놓고 사용
👉🏻 특정 데이터타입을 지정하지 않으면 모든 객체의 부모인 Object로 사용

프로그램에서 사용되는 데이터들을 효과적으로 저장하고 사용할 수 있게 관리하는 전략
👉🏻 프로그램의 알고리즘(동작흐름, 내부 논리적 흐름)과 어울리는 형태로 데이터를 논리적으로 배치해야 함
👀 example
<학생 성적관리 프로그램>
2명의 학생 / 3과목 점수
➡ int[][] score = new int[2][3];
- 배열, Array
데이터(변수)들을일렬로 배치하는 구조를 가짐 👉🏻 가장 기본적인 형태의 자료구조
선형구조(Linear)일렬로 배치되는 구조 ◀▶비선형 구조
💡 리스트 자료구조들의 최상위 부모 인터페이스
선형구조로 요소(Element)들을 인덱스(Index)로 관리 👉🏻 데이터들의 순서가 존재 ➡ 기본 구조가 배열과 유사class ArrayList, classLinkedList, class VectorArrayList ar = new ArrayList();
LinkedList lk = new LinkedList(); //고유 멤버메소드
Vector vc = new Vector(); //고유 멤버메소드
✔ 객체변수를 부모타입인 List로 선언하면 각 타입의 고유한 메소드를 사용할 수 없음
But, 보통의 경우 List를 객체변수타입으로 사용
List list1 = new ArrayList();
List list2 = new LinkedList();
List list3 = new Vector();
단순 연결 리스트 ➡ 단방향 포인터(링크)를 사용
👉🏻 단방향 포인터의 단점 : 중간 인덱스의 데이터 삽입, 삭제가 빈번한 경우 비효율적

이중 연결 리스트 ➡ 양방향 포인터(링크)를 사용
👉🏻 양방향 포인터의 장점 : 중간 인덱스의 데이터 삽입, 삭제가 빈번할 때 잘어울리는 구조

ArrayList와 같은 구조, 같은 사용법 + 동기화 처리 👉🏻 Thread Safe
list.add(String); / 데이터 삽입
list.get(int); / n번째 요소 확인
list.size(); / 리스트의 크기 확인
list.set(int, String); / n번째 인덱스를 String으로 수정
list.remove(int); / n번째 인덱스 삭제
list.remove(String); / 같은 내용이 있으면 지우기
list.isEmpty(); / 리스트가 비었는지 확인
list.clear(); / 모든 요소 제거하기
----------------------------------------------------------------------------------------------------
ArrayList l1 = null; //객체를 생성하지 않았음
ArrayList l2 = new ArrayList(); //빈(empty) 리스트 👉🏻 현재 데이터 없이 공간만 존재
l1.isEmpty(); ➡ NullPointException
l2.isEmpty(); ➡ true
<객체 검사 후 요소가 있으면 출력하기>
👇🏻 앞이 false면 &&연산자에서 shortcut 해서 뒤에는 검사하지 않음
if(null!=l2 && !l2.isEmpty()) {
System.out.println(l2);
}
----------------------------------------------------------------------------------------------------
<for문 사용해서 요소 전체 출력>
for(int i=0; i<l1.size(); i++) {
System.out.println(list.get(i));
}
<for-each문 사용해서 요소 전체 출력>
for(Object obj : list) {
System.out.println(obj);
}
----------------------------------------------------------------------------------------------------
<Bonus>
배열의 모든 요소를 지정된 값으로 초기화하는 메소드
int[] arr = new int[10];
Arrays.fill(arr, 0);
매개변수로 나열된 데이터들을 ArrayList 객체를 생성 후 add하여 반환
List list = Arrays.asList("A", "B", "C", "D", "E");