Wrapper 클래스 / Collection Framework(컬렉션 프레임워크)

2022. 10. 6. 08:16Dev.Program/Java & Spring

728x90

p441

Wrapper 클래스

======== JAVA0330 → Ex.java

클래스 안에는 멤버변수와 메서드() 가 있음.

멤버변수가 하는 역할은 Only 저장! 근데 그 멤버변수를 살짝 감싸서 객체로 만들어주는 것이 Wrapper 클래스! ⇒ Wrapper 클래스로 만들면 다양한 메서드 활용이 가능하다

 

<Ex.java>

< Wrapper 클래스 >

  • 기본 데이터타입 8개에 대응하는 8개의 클래스
  • 기본 데이터타입을 참조 데이터타입(객체)로 변환하여

객체가 제공하는 다양한 기능(메서드)을 활용할 수 있도록 도와주는 클래스

  • 기본 데이터타입(스택) → 참조 데이터타입(힙) 으로 변환 : Boxing(박싱)

참조 데이터타입(힙) → 기본 데이터타입(스택) 으로 변환 : Unboxing(언박싱)

  • Wrapper 클래스에는 상수와 여러 메서드가 제공되므로

기본 데이터타입에 대한 다양한 작업을 쉽게 수행할 수 있도록 도와줌

 

  • Byte. 적고 Ctrl + Space 하면 다양한 상수와 메서드()들이 나옴.

 

  • char 타입이 나오지 않음(0~65535)
  • character 타입이기 때문에 0이나 65535 둘 다 ‘ ‘ 공백임

 

  • int 타입으로 바꿔주면 값을 볼 수 있다.

 

> 기본 데이터타입 변수에 정수를 저장하는 방법

  • 그냥 선언하면 됨

> 기본 데이터타입 변수의 값을 출력하는 방법

  • 역시 그냥 찍으면 됨

 

> Wrapper 클래스 타입 객체에 정수를 저장하는 방법

  • Integer ⇒ java.lang 패키지

  • int 타입과 String 타입을 받을 수 있다
  • 활용법 ) 나이를 String 으로 받았을 때

이런식으로 받아올 수 있다(받아오는 값이 String 타입이지만 숫자일 때만 가능)

  • 생성자에 정수 데이터 또는 문자열로 된 정수를 전달
  • 여기선 정수 20을 Integer 타입 객체로 생성

 

> Wrapper 클래스 타입 객체의 값을 출력하는 방법

문자열로 변환할 때 쓰는 메서드 toString()

  • toString()을 사용하여 출력
  • toString() 메서드 생략 가능(출력할 때만 생략가능)

 

p.442

< 오토 박싱(Auto Boxing) 과 오토 언박싱(Auto Unboxing) >

  • 기본 데이터타입과 참조 데이터타입은 메모리 공간이 다르고 성격이 다르므로

서로 호환이 불가능한 타입으로 취급됨(구조가 다름)

  • 따라서, 상호간의 변환을 위해서는 Wrapper 클래스를 활용해야함

기본 데이터타입(스택) → 참조 데이터타입(힙) 으로 변환 : Boxing(박싱)

참조 데이터타입(힙) → 기본 데이터타입(스택) 으로 변환 : Unboxing(언박싱)

⇒ 원래는 박싱에 new 키워드를 통한 객체 생성 방법을 사용하고,

    박싱에 Wrapper 클래스 객체의 XXXValue() 메서드 호출을 통한 방법 사용

⇒ JDK 1.5(Java 5) 부터는 상호 변환 과정을 생략해도

    컴파일러에 의해 자동으로 변환되는 오토 박싱, 오토 언박싱이 지원됨

 

기본 데이터타입 → n1

참조 데이터타입 → num1

1. 오토 박싱(기본 데이터타입(Stack) → 참조 데이터타입(Heap))

  • 그냥 이렇게 전달하면 됨
  • 오토 박싱이 지원되므로 바로 대입 가능(자동 변환 수행됨)
  • 기존의 박싱 문법(객체 생성을 통해 기본형 전달)

  • 주소값을 가지고 있는 num1 도 10이라는 값을 가지게 됨.

 

  • num1. 찍어보면 Integer 객체에서 지원하는 다양한 메서드나 상수 등을 활용 가능

 

2. 오토 언박싱(참조 데이터타입(Heap) → 기본 데이터타입(Stack))

  • 책에 오토가 안 붙어있는 이유는 오토로 사용하지 못하는 경우가 있기 때문

  • Wrapper 클래스 객체의 XXXValue() 메서드로 변환

  • 오토 언박싱이 지원되므로 바로 대입 가능(자동 변환 수행됨)
  • 20이 나옴!
  • 오토 언박싱 후에는 Integer → int 타입으로 변환되었으므로 기본 데이터타입으로 할 수 있는 작업들을 수행 가능

 

⇒ 둘 다 자동으로 수행되기 때문에 문법적으로 어려울 건 없다.

 

  • 기본형(n1)과 참조형(num2) 간에 연산도 잘 수행됨
  • 내부적으로 Wrapper 클래스 타입(참조형) 객체를 기본형으로 변환 후 연산 수행
  • 자동으로 해주기 때문에 우리가 알 필요 없음!!

  • 기본형(n1)과 참조형(num1) 을 동등비교연산자로 기본형과 참조형 비교도 가능

 

번외 )

  • equals() 메서드로 참조형과 기본형 비교 가능
  • 이렇게는 비교 잘 안함!
  • 정수는 그냥 == 동등비교 연산자를 사용하는게 직관적

 

p442-443

Integer i1 = new Integer(100);
Integer i2 = new Integer(100);

if(i1 == i2) {
System.out.println(i1 + ", " + i2 + " : 같은 데이터!");
} else {
System.out.println(i1 + ", " + i2 + " : 다른 데이터!");
}
  • 많이 실수하는 것 !!!!
  • new 를 하는 순간 주소값이 달라지기 때문에 동등비교는 사용하면 안됨
  • 위에서는 기본형과 참조형 간의 비교기 때문에 동등비교가 가능!

  • 객체끼리는 equals()로 비교

 

======== Ex2.java

p444

문자열 → 기본형으로 변환

  • 주로 웹이나 어플리케이션의 입력창에서 수치데이터를 입력받을 경우

실제 데이터 타입과 달리 문자열 형태로 전달되는 것이 일반적이다.

따라서, 문자열 형태의 데이터를 수치데이터로 변환하는 작업이 빈번

< 기본 문법 >

Wrapper클래스명.parseXXX(문자열데이터)

⇒ parseXXX() 메서드의 XXX 은 변환할 기본형의 데이터타입 이름

ex) 문자열로 전달받은 변수 strNum("20")을 int형 변수에 변환하여 저장하는 경우

       int num = Integer.parseInt(strNum);

ex2) 문자열로 전달받은 변수 strNum("20.0")을 double형 변수에 변환하여 저장하는 경우

       double num = Double.parseDouble(strNum); 

 

  • 오류창 확인!
  • 형변환 연산자를 사용할 수 없다!

  • int 형

  • int형인 Integer.parseInt(strNum)를 Integer형인 num에 넣으려면 AutoBoxing 이 일어남(자동)
  • 리턴타입 int형 → Integer 로 오토박싱

 

  • 그냥 이렇게 바로, 리턴타입 int형 그대로 저장 가능

 

  • 문법적 오류는 없음.

그러나!

  • 실행했을 때 java.lang.NumberFormatException 오류 남
  • double 형인 “20.0” 을 int 로 저장하려고 하기 때문
  • 20.0 실수형 데이터이므로 int형으로 변환 불가능!

 

< Integer 클래스의 다양한 메서드 >

  • 변환하는건 to ***

  • 진법계산
  • 실행창

 

  • max / min 등의 메서드들도 있음!

 

 

======== Ex3.java

< Character 클래스 활용 >

  • 얘는 좀 중요함! Wrapper 클래스 중에 제일 많음…! ( → 문자로 활용할 수 있는 메서드들이 많기 때문)

 

1. toXXX() 메서드를 호출하여 다양한 변환 가능

> Character.toUpperCase(ch) : 대문자로 변환> Character.toLowerCase(ch) : 소문자로 변환

  • 변환 안됨!
  • 영문자가 아닌 경우 변환은 안되지만 오류 발생은 없음

2. isXXX() 메서드를 호출하여 다양한 판별 가능

> Character.isUpperCase(ch) : 대문자 판별

  • 출력창

  • ch에 ‘T’를 주고 다시 출력하면
  • 출력창

> Character.isDigit(ch) : 숫자 판별

  • 출력창

> Character.isLetter(ch) : 문자 판별

  • 출력창
  • Character.isLetter(ch)

> Character.isSpace(ch) : 공백 판별(권장 안함 → deprecate 처리)> Character.isWhitespace(ch) : 공백 판별(권장)

  • 출력창
  • 출력창 보면 판별은 잘 됨!

  • 그러나 밑줄
  • deprecate 처리된 메서드(사용하지 않는 것을 권장)라 밑줄 그인게 보임!

  • ⇒ 주로 isSpace() 보다는 isWhitespace() 메서드를 사용(권장해줌!)

  • isWhitespace() 가 더 많은 것을 판별 가능(공백)

 

======== Test3.java

Character 클래스 활용

문제 1) char 타입 배열에 저장된 문자들을

대문자, 소문자, 숫자, 공백문자, 기타로 구분하여 출력

char[] chArr = {'R', 't', '1', ' ', '!'};

 

  • 푼 답
  • 출력창

  • 선생님 답안(향상 for문 사용)

 

문제 2) 문자열을 암호화

⇒ 문자열을 char 타입으로 각각 하나씩 변환하여

문자의 코드값에 3을 더한 문자를 다시 문자열로 결합하여 출력

ex) “Hello”(변환 전) ⇒ “Khoor”(변환 후)

String originalStr = "Hello, World!";
// String 타입 문자열을 char[] 타입으로 변환하는 메서드

// : toCharArray()
char[] splitChar = originalStr.toCharArray();

String encryptStr = "";
// 반복문을 사용하여 char[] 타입 문자 하나하나의 값을

// 3만큼 증가시킨 후
// encryptStr 변수에 문자열 결합하여 출력

 

  • ???? 출력 잘 된 거 처럼 보이지만 잘못 푼 거….ㅎ

  • 선생님 답안
  • 출력창

 

문제 3)

암호화 된 문자열(encryptStr)을 원래대로 복호화하여 originalStr 에 저장, 출력

(앞에 했던 거 반대로 하면 됨!)

  • 근데 못 풀었다 ㅎ
encryptStr = ""; // 초기화 필수!

  • 선생님 답안
  • 출력창

 

.toCharArray(); 를 쓸 일이 자주 있을 겁니다~~

 

참고 )

char[] 타입에 저장된 문자들을 String 타입으로 변환하는 방법

  • toString() 은 Object 꺼! 이거 아님!!

  • String 객체 생성 파라미터로 char[] 타입 전달

 

 

 

p.499

Chapter 13

 

500=501

516

======== Ex4.java

< Collection Framework(컬렉션 프레임워크) >

  • 컴퓨터 시스템에서 데이터를 효율적으로 저장 및 관리하는 방법 = 자료구조

⇒ 자료구조를 자바에서 구현하여 제공하는 클래스들의 모음

  • Set, List, Map 인터페이스 계열로 구분됨

⇒ Set 과 List 인터페이스는 공통적으로 Collection 인터페이스를 구현하므로

    제공되는 메서드가 거의 동일함

  • java.util 패키지에 컬렉션 프레임워크 클래스들이 제공됨

< Set 계열 >

  • 저장 순서 유지 X, 데이터 중복 허용 X

⇒ 주머니에 공을 무작위로 집어넣는 것과 유사한 방식(순서 유지와 중복 불가)

  • 주로 HashSet, TreeSet 클래스 사용
  • 인덱스를 사용하지 않음

 

> HashSet 객체 생성 ⇒ Set 인터페이스 구현체이므로 업캐스팅 가능

  • HashSet → Set 업캐스팅

  • HashSet 클래스타입 그대로 사용 가능

1) boolean isEmpty() : 컬렉션 객체가 비어있는지 확인

2) int size() : 컬렉션 객체에 저장된 요소(데이터) 갯수 리턴

3) boolean add(Object o) : 컬렉션 객체에 요소(데이터) 추가

⇒ 파라미터가 Object 타입이므로 모든 데이터타입 추가 가능(기본형, 객체 모두)

⇒ 리턴 타입이 boolean 이므로 추가 성공 여부 리턴됨(중복 데이터 추가X)

  • 아무거나 다 넣는 거 가능! (문법적 오류 없다!)

  • 이제 3개 들어가있음!

4) String toString() : 컬렉션 객체에 저장된 요소(데이터) 모두 출력

  • 출력창
  • 저장 순서 유지 안되기 때문에 선생님이랑 순서가 다르게 나올 수 있다!

  • 출력창에서는 toString() 생략 가능

 

> add() 메서드의 리턴타입이 boolean 이므로 데이터 추가 성공 여부가 리턴됨

⇒ 중복된 데이터는 추가되지 않고 리턴값으로 false 리턴됨

  • 이미 들어 있는 숫자기 때문에 false 리턴 (중복X)

 

  • 4는 없는 숫자라 들어간다! (true 리턴)

 

5) boolean contains(Object o) : 객체 내의 요소 o 포함 여부 리턴

6) boolean remove(Object o) : 객체 내의 요소 삭제 → 삭제 후 결과 리턴

  • Object 타입을 받고 boolean 리턴

  • 두번 째는 삭제할 게 없기 때문에 false 리턴

  • 3.14 삭제된 것을 확인할 수 있다

7) void clear()

  • 모두 지움

  • 확인 해 보면 다 날아간 것을 확인할 수 있다



> Set 또는 List 계열 객체 생성 시 각 객체 데이터 이전(복사) 가능

  • Collection 타입 확인!

  • 출력창
  • 위에 있는 set 객체 복사 해 옴

 

> 객체 생성 후 addAll() 메서드를 통해 데이터 이전(복사)도 가능

 

⇒ 복사하는 다양한 방법이 있다




  • 정렬이 안 되어있는 상태!
  • TreeSet 객체를 활용하면 같은 타입 데이터가 저장된 Set 객체 정렬 가능

  • 1, 10, 30, 100, 200, 300 순서로 출력되어야 할 것 같은데 이렇게 출력됨. 왜? 문자기 때문!

  • 정수를 넣으니까 우리가 생각한 순서대로 출력됨

 

TreeSet 객체를 활용하면 같은 타입 데이터가 저장된 Set 객체 정렬 가능

⇒ 수치데이터는 수치 순으로 정렬되며

     문자데이터는 문자 코드값 순으로 정렬되므로 정렬 결과가 다름!




금요일까지 만든 로또 Set 사용해서 출력해보기!! (숙제 ⇒ 제출은 아님)

 

  • Hashset 대신 쓰면 정렬기능까지 포함됨!

  • 향상된 for 문 오류 왜?

  • int 형만 넣을 수 있게 제한
  • 오류 사라짐 (원래 object 타입이었는데 int 타입으로 바뀌어서)

 

⇒ 자료구조를 몰라도 되지만 이걸 알면 코딩이 쉬워짐! (코드가 짧아진다)

 

import java.util.Set;
import java.util.TreeSet;
public class Test4 {

public static void main(String[] args) {
// Set 계열을 사용하여 로또 번호 생성기 작성
// 1, 10, 15, 19, 30, 45
Set<Integer> thisWeekLotto = new TreeSet<Integer>();

// Set 객체 + 정렬 기능 포함
thisWeekLotto.add(45);
thisWeekLotto.add(15);
thisWeekLotto.add(10);
thisWeekLotto.add(19);
thisWeekLotto.add(30);
thisWeekLotto.add(1);
// System.out.println(thisWeekLotto);

Set<Integer> myLotto = new TreeSet<Integer>();
// 1 ~ 45 사이의 난수 6개 저장
⇒ Set 계열은 중복을 허용하지 않으므로 size()가 6이 될때까지 반복
while(myLotto.size() < 6) {
int rNum = (int)(Math.random() * 45 + 1);
myLotto.add(rNum);
}

System.out.println("나의 로또 번호 : " + myLotto);
System.out.println("이번주 1등 당첨번호 : " + thisWeekLotto);

// 당첨번호 갯수 카운팅
int count = 0;

for(int lottoNum : myLotto) {

// myLotto 숫자를 하나씩 꺼내 lottoNum 에 저장
// 꺼낸 번호를 1등 당첨번호 목록에서 일치 여부 판별
if(thisWeekLotto.contains(lottoNum)) {

// 일치하는 번호가 있을 경우
System.out.println("일치하는 번호 : " + lottoNum);
count++; // 카운트 증가
}
}
System.out.println("일치하는 번호 갯수 : " + count + "개");
}
}
  • 최종코드

 

728x90