국비 수업을 통해 내가 얻어갈 것들.. 

언어 : java, html, css, javascript, ajax, spring & spring boot, jpa, mybaits, oracle, android, Git, GitHub,Hibernate

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의 장점

  1. 컬렉션에서 요소를 제어하는 기능
  2. next() 및 previous()를 써서 앞뒤로 이동하는 기능
  3. hasNext()를 써서 더 많은 요소가 있는지 확인하는 기능

출저) 

 

[JAVA] Iterator란? Iterator를 사용하는 이유와 사용법

먼저 iterator와 원형인 iterate의 사전적 정의가 무엇인지 확인해보자. iterate : (계산, 컴퓨터 처리 절차를) 반복하다 iterator : 반복자 계산 같은 컴퓨터의 작업 처리 절차를 반복한다는 뜻 같다. 그럼

onlyfor-me-blog.tistory.com

 

 

정렬

 

중요한 내용, 잘 이해해야 함수 배울 때 사용한다.

 

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();

위 코드를 이용해 섞어주기

 

+ Recent posts