고급자바 1219-1
이전에 배운 ArrayList를 통한 예제문제 풀기
문제) 5명의 별명을 입력 받아 ArrayList에 저장하고 이들 중 별명의 길이가 제일 긴 별명을 출력하시오.
(단, 별명의 길이는 모두 다르게 입력한다.)
ArrayList<String> list = new ArrayList();
Scanner sc = new Scanner(System.in);
System.out.println("서로 다른 길이의 별명을 5번 입력하시오!");
for(int i = 1; i <= 5; i++) {
System.out.println(i +"번째 별명: ");
String nickName = sc.nextLine();
list.add(nickName);
}
// 제일 긴 별명이 저장될 변수를 선언하고 이 변수에는 List의 첫번째 별명을 초기화 한다.
String maxName = list.get(0);
for(int i = 0; i < list.size(); i++) {
if(list.get(0).length() < list.get(i).length() ) {
maxName = list.get(i);
}
}
System.out.println("별명이 가장 긴 사람");
System.out.println(maxName);
여러가지 방법이 있지만 한가지 방법만 정의해봤습니다.
문제2) 5명의 별명을 입력 받아 ArrayList에 저장하고 이들 중 별명의 길이가 제일 긴 별명을 출력하시오.
(단, 별명의 길이가 같은것이 중복될 수 있다.)
ArrayList<String> list = new ArrayList();
Scanner sc = new Scanner(System.in);
System.out.println("별명을 5번 입력하시오!");
for(int i = 1; i <= 5; i++) {
System.out.print(i +"번째 별명: ");
String nickName = sc.nextLine();
list.add(nickName);
}
// 제일 긴 별명의 길이를 저장할 변수를 선언하고 첫번째 별명의 길이로 초기화 한다.
int maxLength = list.get(0).length();
for(int i = 1; i < list.size(); i++) {
if(maxLength < list.get(i).length()) {
maxLength = list.get(i).length();
}
}
System.out.println("제일 긴 별명들..");
for(int i = 0; i < list.size(); i++) {
if(maxLength == list.get(i).length()) {
System.out.println(list.get(i));
}
}
다양한 방법들이 있다 ! 다른 방법들도 공부해보면 좋습니다.
데이터 저장장소인 Stack과 Queue에 대하여 알아보았습니다.
Stack => 후입선출(LIFO)의 자료구조
Queue => 선입선출(FIFO)의 자료구조
Stack의 명령으로는
1. 자료 입력 : push(입력값)
2. 자료 출력 : pop() ==> 자료를 꺼내온 후 꺼내온 자료를 Stack에서 삭제한다.
peek() ==> 삭제없이 자료를 꺼내온다.
예시를 보면
stack.push("홍길동");
stack.push("일지매");
stack.push("변학도");
stack.push("강감찬");
System.out.println("현재 stack값: " + stack);
String data = stack.pop();
System.out.println("꺼내온 값: " + data);
System.out.println("꺼내온 값: " + stack.pop());
System.out.println("현재 stack값: " + stack);
stack.push("성춘향");
System.out.println("추가후 stack값: " + stack);
System.out.println("꺼내온 값: " + stack.pop());
System.out.println("현재 stack값: " + stack);
System.out.println("삭제 없이 꺼내온 값: " + stack.peek());
System.out.println("현재 stack값: " + stack);
후입선출로 인하여 마지막에 들어온 값들이 먼저 빠져나가는 것을 알 수 있다.
Queue의 명령
1. 자료입력 : offer(입력값)
2. 자료출력 : poll() ==> 자료를 꺼내오고 꺼내온 자료를 Queue에서 삭제한다.
peek() ==> 삭제없이 자료를 꺼내온다.
예시를 보자면
Queue<String> queue = new LinkedList<String>();
queue.offer("홍길동");
queue.offer("일지매");
queue.offer("변학도");
queue.offer("강감찬");
System.out.println("현재의 queue값: "+ queue);
String temp = queue.poll();
System.out.println("꺼내온 값: " + temp);
System.out.println("꺼내온 값: " + queue.poll());
System.out.println("현재 queue 값: " + queue);
queue.offer("성춘향");
System.out.println("현재 queue 값: " + queue);
System.out.println("꺼내온 값 : " + queue.poll());
System.out.println("현재 queue 값: " + queue);
System.out.println("삭제 없이 꺼내온 값: " + queue.peek());
System.out.println("현재 queue 값: " + queue);
결과값으로 선입선출이 되는것을 알 수 있다.
Stack을 이용하여 웹브라우저의 앞으로가기, 뒤로가기 기능을 구현해보는 예시를 보도록 하겠습니다.
class Browser{
private Stack<String> back; // 이전 방문 내역이 저장될 Stack
private Stack<String> forward; // 다음 방문내역이 저장될 Stack
private String currentUrl; // 현재 페이지
//생성자
public Browser(){
back = new Stack<String>();
forward = new Stack<String>();
currentUrl = "";
}
Stack을 통하여 현재 페이지, 이전 방문 내역, 다음 방문내역을 저장해주고 생성자를 만든다.
public void goURL(String url) {
System.out.println(url +"사이트에 접속합니다...");
if(!"".equals(currentUrl)) { // 주어진 URL로 이동하기 전 현재페이지가 있으면
back.push(currentUrl); // 현재 페이지를 back스택에 추가한다.
}
currentUrl = url; // 현재 페이지 변경
}
사이트를 방문하는 메서드를 만들어서 인수값으로 방문할 URL을 넣는다.
public void goBack() {
// isEmpty() 메서드 ==> Collection이 비어 있으면 true, 그렇지 않으면 false
if(! back.isEmpty()) { // 데이터가 있으면
forward.push(currentUrl); // 현재페이지를 forward스택에 추가
currentUrl = back.pop(); // back스택에서 1개의 요소를 꺼내와 현재페이지로 한다.
}
}
뒤로가기 기능을 만든다.
public void goForward() {
if(!forward.isEmpty()) {
back.push(currentUrl); //현재 페이지를 back스택에 추가
currentUrl = forward.pop();
}
}
앞으로 가기 기능을 만든다.
public void history() {
System.out.println("----------------------------");
System.out.println(" 방 문 기 록");
System.out.println("----------------------------");
System.out.println("back =>" + back);
System.out.println("현재 =>" + currentUrl);
System.out.println("forward =>" + forward);
System.out.println("----------------------------");
}
방문기록을 확인하기 위한 메서드를 작성한다.
public static void main(String[] args) {
Browser b = new Browser();
b.goURL("1. 네이버");
b.history();
b.goURL("2. 야후");
b.history();
b.goURL("3. 구글");
b.goURL("4. 다음");
b.history();
}
메인 메서드에서 확인해본다.
접속할때마다 back에 저장이 되고 마지막 접속 사이트가 현재로 바뀌는 것을 알 수 있다.
System.out.println("뒤로가기 기능...");
b.goBack();
b.history();
System.out.println("뒤로가기 후..");
b.goBack();
b.history();
System.out.println("뒤로가기 후..");
b.goBack();
b.history();
뒤로가기 기능을 작동해보면
forward로 데이터가 모아지는 것을 볼 수 있다.
System.out.println("앞으로가기 후..");
b.goForward();
b.history();
System.out.println();
System.out.println("새로운 사이트 접속 후..");
b.goURL("5. 네이트");
b.history();
앞으로 가기 기능과 새로운 사이트에 접속해보면
사이트를 방문하는 메서드에서
forward.clear(); 통하여 전체데이터 삭제를 해서 기록이 없어지는 것을 알 수 있다.