[Java][국비교육] Day 16

Ga02·2023년 1월 17일

국비교육

목록 보기
15/82

🔍 Wrapper 클래스

패키지 : java.lang
기본 데이터타입을 참조형으로 포장하여 기본 데이터타입의 변수를 객체타입으로 사용할 수 있게 해줌

기본형참조형(Wrapper 클래스)
booleanBoolean
charCharacter (기본형과 이름이 다름)
byteByte
shortShort
intInteger (기본형과 이름이 다름)
longLong
floatFloat
doubleDouble

➰ Wrapper 클래스의 존재 이유

기본형은 자바 클래스들의 상속구조(계층구조)에서 빠져있어 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의 자식클래스들

🔍 String 클래스

패키지 : java.lang
문자열을 다루는 기능(메소드)들을 포함하는 문자열을 표현하는 클래스
✔ 문자열 리터럴 상수도 String 클래스 타입으로 적용 가능

➰ 문자열 객체 사용 방법

  • 리터럴 상수를 대입하여 사용
    ex) String str1 = "Banana";
  • String 객체를 생성하여 사용
    ex) String str2 = new String("Apple");
String str1 = "Banana"; ➡ 리터럴 상수
String str2 = new String("Apple"); ➡ 동적 할당한 문자열

👉🏻 변수는 main()가 활용하는 STACK영역에 공간이 만들어짐
👉🏻 상수는 상수 CODE 영역에 공간이 만들어짐 ➡ 변수에는 이 상수의 공간주소가 저장됨
👉🏻 인스턴스는 HEAP 영역에 공간이 만들어짐 ➡ 변수에는 이 인스턴스의 주소가 저장됨

➰ String 클래스 특징

  • 문자열을 저장할 때마다 매번 새로운 공간을 생성 👉🏻 new를 하진 않았지만 같은 효과를 보임
    • 기존의 데이터를 지우고 새로 기록하는 것이 아니라 각각 다른 공간에 저장공간이 생김 ➡ 리터럴 상수이므로 final과 같이 값을 바꿀 수 없음
String str = "Apple";
str = "Banana";
str = "Cherry";
  • 문자열 데이터를 수정할 때에도 새로운 공간을 생성
      1. 기존 "Banana" 생성
      1. 추가될 "Cherry" 생성
      1. 합쳐진 "BananaCherry" 생성
        ➡ 세 가지 문자열이 각각 생성됨
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) 	/ 문자열의 연속된 문자 String1String2로 변환
str.contains(String)			/ 특정 문자열을 포함하고 있는지 확인
str.substing(int)				/ 문자열을 n번째 인덱스부터 끝까지 발췌
str.substing(int, int)			/ 문자열을 n1번째 인덱스부터 (n2-1)번째 인덱스까지 발췌

🔍 StringTokenizer

특정 규칙을 이용해서 문자열을 구분

➰ delimiter, 구분자

구분자를 적용하여 문자열을 토큰화(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());
}

🔍 StringBuffer, StringBuilder 클래스

객체 내부에 문자열을 저장하는 공간을 따로 생성하여 그 공간을 지속적으로 관리하면서 사용 👉🏻 저장소 공간의 크기를 늘리거나 줄일 수 있어 수정이나 삭제가 빈번한 문자열을 다룰 때 좋음

➰ StringBuffer

동기화처리가 되어있어 멀티 스레드 환경에 안전함 ➡ Thread Safe
👉🏻 멀티 스레드 환경에서 사용

➰ StringBuilder

동기화처리가 되어있지 않음
👉🏻 싱글 스레드 환경에서 사용

➰ 메소드()

StringBuffer sb;
StringBuilder sb;
👉🏻 몇몇개의 메소드만 다를 뿐 거의 같음

sb = "Apple"; //Error, 리터럴 상수 직접 대입 불가
sb = new StringBuffer();

sb.length()					/ 저장된 문자열의 길이
sb.capacity()				/ 저장 가능한 공간의 총 크기
sb.append()					/ 저장공간에 문자열 추가
sb.reverse()				/ 저장된 문자열을 뒤집어서 역으로 출력
sb.trimToSize()				/ 남은 capacity의 공간 잘라내기

🔍 컬렉션, Collection

자바에서 제공하는 기본 자료구조들을 모아놓은 것 👉🏻 List, Set, Map 세 가지형태의 자료구조 제공
💡 컬렉션은 요소의 데이터타입을 제네릭, Generic을 통해 지정해놓고 사용
👉🏻 특정 데이터타입을 지정하지 않으면 모든 객체의 부모인 Object로 사용

➰ 자료구조, Data Structure

프로그램에서 사용되는 데이터들을 효과적으로 저장하고 사용할 수 있게 관리하는 전략
👉🏻 프로그램의 알고리즘(동작흐름, 내부 논리적 흐름)과 어울리는 형태로 데이터를 논리적으로 배치해야 함

👀 example

<학생 성적관리 프로그램>
2명의 학생 / 3과목 점수
➡ int[][] score = new int[2][3];

  • 배열, Array
    데이터(변수)들을 일렬로 배치하는 구조를 가짐 👉🏻 가장 기본적인 형태의 자료구조
    선형구조(Linear) 일렬로 배치되는 구조 ◀▶ 비선형 구조

🔍 List 인터페이스

💡 리스트 자료구조들의 최상위 부모 인터페이스

  • 데이터를 일렬로 배치하는 선형구조로 요소(Element)들을 인덱스(Index)로 관리 👉🏻 데이터들의 순서가 존재 ➡ 기본 구조가 배열과 유사
  • 배열은 생성하면서 요소를 저장할 수 있는 길이(크기)가 정해져 변경이 불가하지만, 리스트는 처음부터 요소를 저장하는 공간을 만들지 않음 👉🏻 배열이 필요하다면 ArrayList를 사용하는 것이 더 좋음
  • 요소가 추가될 때마다 각 요소데이터를 저장할 개별 공간을 만들고 연결 👉🏻 확장이 훨씬 쉬움
  • interface List의 구현체(구현된 class) : class ArrayList, classLinkedList, class Vector
ArrayList 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();

➰ class ArrayList

단순 연결 리스트 ➡ 단방향 포인터(링크)를 사용
👉🏻 단방향 포인터의 단점 : 중간 인덱스의 데이터 삽입, 삭제가 빈번한 경우 비효율적

  • 요소를 저장하는 크기가 확장 또는 축소됨
  • 배열과 거의 비슷하게 동작하며 배열에 비해 크게 느리지 않음(빠른편)

➰ class LinkedList

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

➰ class 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");
profile
IT꿈나무 댓츠미

0개의 댓글