2022. 10. 6. 08:16ㆍDev.Program/Java & Spring
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 + "개"); } } |
- 최종코드
'Dev.Program > Java & Spring' 카테고리의 다른 글
java.util 클래스 / 정규표현식 / Pattern 클래스 / Matcher 클래스 (0) | 2022.10.06 |
---|---|
List 계열 / Map 계열 / Stack(스택) / Queue(큐) / 제네릭 / Random 클래스 (0) | 2022.10.06 |
[Math.random()] 로또 번호 생성 프로그램 (0) | 2022.10.06 |
StringBuffer 와 StringBuilder 클래스 / java.lang.Math 클래스 (1) | 2022.10.06 |
[Java] java.lang.String 클래스 (0) | 2022.10.05 |