국비 수업을 통해 내가 얻어갈 것들..
l 언어 : java, html, css, javascript, ajax, spring & spring boot, jpa, mybaits, oracle, android, Git, GitHub,Hibernate
l tools : eclipe, intellij, sqldeveloper,tomcat, visual studio, android studio, git, source tree
오늘 수업하며 내가 잘 이해 못하고 있는 것
- 형변환 활용 (다음에 이해한다 하며 넘김..)
- 오버라이딩 (이해한다고 착각했다)
- Iterator (아예 이해 X)
✨ int, integer 차이점 정리
- int : 자료형(primitive type)
- 산술 연산 가능함
- null로 초기화 불가
- Integer : 래퍼클래스(Wrapper class)
- Unboxing 하지 않을 시 산술 연산 불가능
- null값 처리 가능
boxing : primitive type -> wrapper class 변환 (int to Integer)
unboxing: wrapper class -> primitive type 변환 ( Integer to int)
리스트의 특성을 따르는 자료구조, 스택과 큐
Queue 에 대해 알아본다.
Stack 구조
들어 오는 곳 나가는 곳이 한 곳, LIFO (후입선출): 가장 늦게 들어온 것이 가장 먼저 사용된다
(class 제공이 됨)
Queue 구조
들어오는 곳, 나가는 곳 따로 있음, FIFO (선입선출) : 먼저 들어온 것이 먼저 나온다
(인터페이스)
Queue 선언
Queue<Integer> q = new LinkdeList<>();
Integer형
- Queue 값 추가
add() : 해당 큐의 맨 뒤에 값 삽입, 값 추가 성공 시 true 반환, 큐가 꽉 찬 경우 에러발생
offer() : 해당 큐의 맨 뒤에 값 삽입, 값 추가 성공 시 true 반환, 값 추가 실패 시 false 반환
- Queue 값 제거
remove() : 큐 맨 앞에 있는 값 반환 후 삭제, 비어있는 경우 에러
poll() : 큐 맨 앞에 있는 값 반환 후 삭제, 비어있는 경우 null 반환
clear() : 큐 비우기 (전체 삭제)
- Queue 맨 앞의 값 확인
element() : 큐의 맨 앞의 값을 반환, 비어있는 경우 에러발생
peek() : 큐의 맨 앞의 값을 반환, 비어있는 경우 null 반환
offer(), poll()
package come.list;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class QueueTest {
public static void main(String[] args) {
// Queue
// FIFO (선입선출)
Queue q = new LinkedList();
q.offer("0");
q.offer("1");
q.offer("2");
while (!q.isEmpty()) {
System.out.println(q.poll());
}
}
}
브라우저의 히스토리를 저장하는 방식 → 스택을 쓰는 것이 합리적.
이렇게 계속 고민을 해야 함. 스택을 쓸지 큐를 쓸지.
브라우저 히스토리를 저장하는 프로그램 만들기
package come.list;
import java.util.Stack;
public class StackExplore0522 {
public static Stack back = new Stack();
public static Stack forward = new Stack();
public static void main(String[] args) {
// 브라우저 히스토리 관리 프로그램 (데이터 주고 받기)
// 스택을 두개 써야함.
// 사이트를 방문하기 이전 정보를 관리, 사이트를 방문한 후 정보를 관리
// back, forward
// backStack 의 가장 상단 url 주소가 현재 실행 중인 사이트
// 중간 단계에서 새로운 사이트로 이동할 경우 forward 스택에 있던 모든 정보는 삭제
goURL("1.네이트");
goURL("2.카카오");
goURL("3.네이버");
goURL("4.구글");
printStatus();
// 이전가기
goBack(); // back :[1.네이트, 2.카카오, 3.네이버]
System.out.println("이전가기 클릭");
printStatus(); // forward :[4.구글]
goBack(); // back :[1.네이트, 2.카카오]
System.out.println("이전가기 클릭");
printStatus(); // forward :[4.구글, 3.네이버]
// 다음가기
goForward(); // back :[1.네이트, 2.카카오, 3.네이버]
System.out.println("다음가기 클릭");
printStatus(); // forward :[4.구글]
goURL("https://nomadcoders.co"); // back :[1.네이트, 2.카카오, 3.네이버, https://nomadcoders.co]
System.out.println("새로운 사이트로 이동");
printStatus(); // forward :[]
}
// 새로운 주소를 입력했을 때
public static void goURL(String url) {
back.push(url);
// 스택이 비어있지 않다면 (새롭게 주소를 입력하는 순간) 다 지워라
if (!forward.empty()) {
forward.clear();
}
}
// 출력 함수
public static void printStatus() {
System.out.println("back :" + back);
System.out.println("forward :" + forward);
// 현재 실행되는 화면 정보
// peek() 가장 상단의 정보를 읽어옴.
System.out.println("현재 실행 중인 사이트는 " + back.peek() + " 입니다.");
}
// 새로운 브라우저 실행 이전으로 옮겨주는 것
// 백스택에서 정보를 옮겨야 함. 동시에 백스택에서 데이터 정보 지우기
public static void goBack() {
if (!back.empty()) {
forward.push(back.pop());
// forward에 백의 정보 넣기, 동시에 백 정보 삭제
}
}
// 다음으로 가기
// forward 정보 끄집어 내 back 에 담고, forward 에서는 삭제
public static void goForward() {
if (!forward.empty()) {
// back에 값을 넣는 동시에 forward 값 삭제
back.push(forward.pop());
}
}
}
어제 복습한 함수를 다 써봤다.
이젠 점점 문제를 이해하는 게 더 어려워진다..; 이래서 진짜 문제를 많이 푸는 게 중요한듯!
정렬에 대해 배우기 앞서 Iterator 소개)
Iterator
컨테이너,리스트를 순회할 수 있게 해준다
인터페이스)
Iterator의 장점
- 컬렉션에서 요소를 제어하는 기능
- next() 및 previous()를 써서 앞뒤로 이동하는 기능
- hasNext()를 써서 더 많은 요소가 있는지 확인하는 기능
출저)
정렬
중요한 내용, 잘 이해해야 함수 배울 때 사용한다.
sort()를 이용한 정렬
String 클래스는 미리 오름차순 정렬을 하기로 정의되어있음.
→ 각 클래스에는 정렬 방식이 저장되어 있다.
package come.list;
import java.util.Arrays;
public class ComperatorTest0522 {
public static void main(String[] args) {
// 정렬에 대해 배운다
// 문자열 대소비교 (사전의 알파벳 순서)
String[] strArr = {"cat", "Dog", "Lion", "tiger"};
System.out.println(Arrays.toString(strArr)); // [cat, Dog, Lion, tiger]
// Arrays 클래스 : 배열 정리
// 그 중 sort() : 오름차순
// 오름차순 배열 정렬
Arrays.sort(strArr); // String -> 기본정렬 방식이 정의가 되어있음
System.out.println(Arrays.toString(strArr)); // [Dog, Lion, cat, tiger]
}
}
정렬과 관련되어 사용 되어지는 인터페이스
Comperable 인터페이스와 Comperator 인터페이스가 있음.
sort 로 정렬 → 클래스에 기본 정렬 방식이 정의가 되어있어야 한다.
기본 정렬 방식이 정의 되어 있지 않은 경우 → Comperable , Comperator
// 오름, 내림
Comperable : 기본 정렬을 구현할 때 사용하는 인터페이스
int compareTo(Object o1. Object o2)
오버라이딩 시 양수 or 0 or 음수를 리턴하도록 한다 (두 수의 차를 구한다)
Comperator : 정렬의 기준과 방식을 변경하고 싶을 때 사용하는 인터페이스
int compare(Object o)
오버라이딩 시 양수 or 0 or 음수를 리턴하도록 한다 (두 수의 차를 구한다)
* 기본 정렬은 주로 오름차순을 나타낸다.
양수가 리턴 → 앞의 값이 큰 것
0 → 같다
음수 → 뒤의 값이 큰 것
오름차순 정렬
// Descending = 내림차순
class Descending implements Comparator{
// 오름차순
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof String && o2 instanceof String) {
String s1 = (String)o1;
String s2 = (String)o2;
return s1.compareTo(s2); // 양수 , 0 , 음수
}
return 0;
}
내림차순 정렬
package come.list;
import java.util.Arrays;
import java.util.Comparator;
public class ComperatorTest0522 {
public static void main(String[] args) {
// 정렬에 대해 배운다
// 문자열 대소비교 (사전의 알파벳 순서)
String[] strArr = {"cat", "Dog", "Lion", "tiger"};
System.out.println(Arrays.toString(strArr)); // [cat, Dog, Lion, tiger]
// Arrays 클래스 : 배열 정리
// 그 중 sort() : 오름차순
// 오름차순 배열 정렬
Arrays.sort(strArr); // String -> 기본정렬 방식이 정의가 되어있음
System.out.println(Arrays.toString(strArr)); // [Dog, Lion, cat, tiger]
// 내림차순 배열 정렬
// sort(값, Comperator 타입의 객체)
// 이 객체의 정렬 방식이 Descending 이 정의해놓은대로 정렬이 된다
Arrays.sort(strArr, new Descending());
System.out.println(Arrays.toString(strArr)); // [tiger, cat, Lion, Dog]
// Comperable 인터페이스와
// Comperator 인터페이스가 있음.
// 정렬과 관련되어 사용되어지는 인터페이스
}
}
// Descending = 내림차순
class Descending implements Comparator{
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof String && o2 instanceof String) {
String s1 = (String)o1;
String s2 = (String)o2;
// return s1.compareTo(s2); -> 오름차순
// 값의 순서만 바꾸면 된다.
return s2.compareTo(s1); // -> 내림차순
// 양수 , 0 , 음수
}
// 기본값
// 내림차순할때 참고해라
return -1;
}
}
class Descending implements Comparator{
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof String && o2 instanceof String) {
String s1 = (String)o1;
String s2 = (String)o2;
return o1 - o2; // 오름차순 (숫자 였다면)
return o2 - o1; // 내림차순 (숫자 였다면)
return s1.compareTo(s2); // 오름차순
return s2.compareTo(s1); // 내림차순
return s1.compareTo(s2) * -1; // 내림차순
추가)
Integer 에도 String 처럼 기본 정렬 방식이 정의되어 있다.
때문에 sort()로 오름차순 정렬이 된다.
Integer[] intg = {new Integer(1), 5, 2, 4, 3};
System.out.println(Arrays.toString(intg));
Arrays.sort(intg);
System.out.println(Arrays.toString(intg)); // [1, 2, 3, 4, 5]
Set
package come.set;
import java.util.HashSet;
import java.util.Set;
public class HashSetTest {
public static void main(String[] args) {
// set 중복된 값을 허용하지 않는다
// 데이터가 작은 경우에는 순서대로 들어가는 듯 보여지긴 하지만
// 순서대로 들어가지 않는다
// 해당 데이터 타입의 클래스에는 equals(), hashCode() 두개의 메서드가 오버라이딩 되어 있어야한다.
// 중복체크를 위해서
Object[] objArr = {"1", new Integer(1), "2", "2", "3", "3", "4", "4", "4"};
Set set = new HashSet();
for (int i = 0; i <objArr.length; i++) {
set.add(objArr[i]);
}
// HashSet() 중복제거
// 타입이 다른 데이터는 set에서도 다른 값이라고 판단한다.
System.out.println(set); // [1, 1, 2, 3, 4]
}
}
문제)
- 중복된 값을 제거하는 것 때문에 번호가 5개가 나오기도 하고 4개가 나오기도 한다.
- 44가지의 수만 체크하고 있었다.
해결된 코드 :
package come.set;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class HashSetLotto {
public static void main(String[] args) {
Set set = new HashSet();
// 1 ~ 45 사이의 난수 중에서 6개의 숫자를 중복없이
// set에 저장해서 출력하세요
Random rand = new Random();
while (set.size() < 6) {
int number = rand.nextInt(45) + 1;
set.add(number);
}
System.out.println("lotto 번호: " + set);
}
}
- rand.nextInt(45) 에 1을 더해 45까지 나오게 했다.
- 조건 하나만 실행되면 되기 때문에 for문 두개를 빼주고 while문을 썼다.
- 꼭 6자리가 나오게 하기 위해 size()를 사용했다.
위 문제를 풀고나니 어제 했던 로또번호 출력 프로그램도 뭔가 잘못됐다는걸 알았다.
그래서 돌려보니 역시 +1을 안해서 44까지의 수만 나오고 있었다.
수정된 코드 :
HashSet 을 이용한 빙고 번호판 만들기
List list = new ArrayList(set);
Collections.shuffle(list);
Iterator it = list.iterator();
위 코드를 이용해 섞어주기
'2024_UIUX 국비 TIL' 카테고리의 다른 글
UIUX _국비과정 0524 [JAVA _ Generic, 스레드의 개념] (0) | 2024.06.12 |
---|---|
UIUX _국비과정 0523 [Map, 배열 정렬] (0) | 2024.06.11 |
UIUX _국비과정 0521 [피그마 마무리, 자바2] (1) | 2024.06.11 |
UIUX _국비과정 0517~0520 [피그마] (0) | 2024.06.11 |
UIUX _국비과정 0516 [JS 애니메이션으로 풍선 날리기, 계산기] (0) | 2024.06.11 |