메뉴 바로가기 검색 및 카테고리 바로가기

한빛미디어

뇌를 자극하는 java 프로그래밍

뇌를 자극하는 java 프로그래밍 질의응답 게시판입니다.

전에 메일로 질문 드렸던 indexOf 메서드, HashSet 클래스, currentTimeMillis 메서드 질문과 답변 파일들 올려둘께요

2014-08-07

|

by 질문자

1623

// 질문

391 페이지



package basic_java_classes;



public class StringIndexOfLastIndexOfMethod
{
    public static void main(String args[])
    {
        String str = "꽃나무는 제가 생각하는 꽃나무를 " + "열심으로 생각하는 것처럼 열심으로 꽃을 피워가지고 섰소";
  
        System.out.println("str.indexOf(꽃) = " + str.indexOf(꽃));
        System.out.println("str.indexOf(꽃, 3) = " + str.indexOf(꽃, 4));
        System.out.println("str.indexOf(\"꽃나무\") = " + str.indexOf("꽃나무"));
        System.out.println("str.indexOf(\"꽃나무\", 3) = " + str.indexOf("꽃나무", 3));
        System.out.println("str.lastIndexOf(꽃) = " + str.lastIndexOf(꽃));
        System.out.println("str.lastIndexOf(꽃, 20) = " + str.lastIndexOf(꽃, 20));
        System.out.println("str.lastIndexOf(\"꽃나무\") = " + str.lastIndexOf("꽃나무"));
        System.out.println("str.lastIndexOf(\"꽃나무\", 20) = " + str.lastIndexOf("꽃나무", 20));
    }
}







// 실행결과



str.indexOf(꽃) = 0
str.indexOf(꽃, 3) = 13   // 이 라인 출력 결과 이유를 모르겠습니다. 설명좀 해주세요...
str.indexOf("꽃나무") = 0
str.indexOf("꽃나무", 3) = 13
str.lastIndexOf(꽃) = 37
str.lastIndexOf(꽃, 20) = 13
str.lastIndexOf("꽃나무") = 13
str.lastIndexOf("꽃나무", 20) = 13







527 페이지



ArrayList list = new ArrayList();



ArrayList 객체 안에 String 객체 10개를 담을 수 있는 배열이 생성됩니다.



왜 10개가 생성되는지 모르겠습니다 설명좀 해주세요 ...






558 페이지



package datastructure_javaclasses;



import java.util.HashSet;
import java.util.Iterator;



public class HashSet1
{
    public static void main(String args[])
    {
        HashSet hashset = new HashSet();
        hashset.add("자바");
        hashset.add("카푸치노");
        hashset.add("에스프레소");
        hashset.add("자바");
  
        System.out.println("저장된 데이터의 수 = " + hashset.size());
  
        System.out.println();
  
        Iterator iterator = hashset.iterator();
  
        while(iterator.hasNext())
        {
            String s = iterator.next();
  
            System.out.println("s = " + s);
        }
    }
}







// 실행결과



저장된 데이터의 수 = 3

s = 카푸치노
s = 자바
s = 에스프레소







실행결과가 왜 카푸치노, 자바, 에스프레소(이런순서)로 출력되는지 잘모르겠습니다. 답변좀 주세요 ...







// 583 페이지



package system;



public class SystemCurrentTimeMillIsMethod
{
    public static void main(String args[])
    {
        long time1 = System.currentTimeMillis();
        System.out.println("time1 = " + time1);
        // 현재 시간이 오후 6시 30분 30초 일 경우 밀리세컨드 단위로 값을 어떻게 구하는지 좀 가르쳐주세요...
  
        double total = 0.0;
  
        /*
           원주율 파이 무한 급수를 이용하여 계산
      
           pi(파이) = 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 + ...
        */
  
  
        for(int cnt = 1; cnt < 1000000000; cnt += 2)
             if(cnt / 2 % 2 == 0)
                total += 1.0 / cnt;
             else
                total -= 1.0 / cnt;
             /*
                cnt 가 1일 경우 total 값과
    
                cnt 가 3일 경우 total 값좀 가르쳐주세요 계산을 잘 못하겠습니다...  
             */
  
             double pi = total * 4;
  
             long time2 = System.currentTimeMillis();
             System.out.println("time2 = " + time2);
  
             System.out.println("result = " + pi);
  
             System.out.printf("계산에 %d ms가 소요되었습니다.", time2 - time1);
      }
}







// 실행결과



time1 = 1286828294218
time2 = 1286828315828
result = 3.141592651589258
계산에 21610 ms가 소요되었습니다.






==> 답변 부분


안녕하세요, 김윤명입니다.



답변이 늦어져서 죄송합니다.



1) str.indexOf(꽃, 3) = 13라는 결과가 나오는 이유



이 메서드는 str 문자열에서 파라미터로 주어진 문자를 찾는데,

처음부터 찾는 것이 아니라 두 번째 파라미터 값으로 주어진 인덱스 위치부터 찾기 시작합니다.

그런데 자바에서는 한글과 영문, 공백 문자 등이 모두 한 글자로 취급되므로

인덱스 3의 위치는 는이라는 글자의 위치가 됩니다.

그러므로 그 위치부터 다음번 꽃자를 찾으면 14번째 글자의 위치가 되고,

이것을 인덱스 값으로 표현하면 13이 됩니다.



2) "ArrayList 객체 안에 String 객체 10개를 담을 수 있는 배열이 생성됩니다"라는 내용에 대해서



ArrarList 클래스의 API 규격서를 찾아보면 파라미터가 없는 생성자의 설명이

"Constructs an empty list with an initial capacity of ten."라고 되어 있습니다.

이 문장의 끝에 나오는 an initial capacity of ten는 초기의 용량이 10이라는 의미입니다.

이 부분에 대해 본문에서 설명을 했어야 하는데 그런 설명이 부족했던 것 같습니다.

죄송합니다.



3) HashSet 객체에 넣은 데이터가 순서대로 출력되지 않는 이유



이 클래스는 데이터를 순서대로 넣고 꺼내는 것이 목적이 아니라

나중에 키값을 가지고 특정 데이터를 찾을 때 빠르게 찾을 수 있는 방법으로 저장합니다.

그리고 그 순서가 반드시 알파벳이나 한글의 자모 순서와 일치하는 것도 아닙니다.

이 클래스의 객체에 대해 iterator 메서드를 호출해서 데이터를 가져오는 목적도

데이터를 순서대로 가져다가 처리하기 위한 것이 아니라

모든 데이터를 하나도 빠짐없이 가져다가 처리하기 위한 것입니다.

만약 데이터를 넣은 순서대로 가져오길 원한다면 HashSet가 아닌 다른 클래스를 사용해야 합니다.



4) "// 현재 시간이 오후 6시 30분 30초 일 경우 밀리세컨드 단위로 값을 어떻게 구하는지 좀 가르쳐주세요..."



시스템 시계는 현재 시각을 1970년 1월 1일 00:00:00 GMT를 기점으로 해서 현재까지 경과한 밀리세컨드 단위로 저장해서 관리합니다. (p.406에서 설명)

질문의 내용이 이것을 말하는 건지요? 아니라면 다시 질문해주시기 바랍니다.



5) 손으로 계산하는 것보다 예제에 다음과 같이 수정해서 실행해보는 것이 좋을 것 같습니다.



class SystemExample11 {
    public static void main(String args[]) {
        long time1 = System.currentTimeMillis();
        double total = 0.0;

        int cnt = 1;
        for ( ; cnt < 50; cnt += 2) {
            if (cnt / 2 % 2 == 0)
                total += 1.0 / cnt;
            else
                total -= 1.0 / cnt;

            System.out.printf("cnt = %d, total = %f %n", cnt, total);                
        }
        double pi = total * 4;
        long time2 = System.currentTimeMillis();
        System.out.println("result = " + pi);
        System.out.printf("계산에 %d ms가 소요되었습니다.",
                          time2 - time1);
    }
}


이 예제를 실행하면 다음과 같은 결과가 나올 것입니다.



cnt = 1, total = 1.000000
cnt = 3, total = 0.666667
cnt = 5, total = 0.866667
cnt = 7, total = 0.723810
cnt = 9, total = 0.834921
cnt = 11, total = 0.744012
cnt = 13, total = 0.820935
cnt = 15, total = 0.754268
cnt = 17, total = 0.813091
cnt = 19, total = 0.760460
cnt = 21, total = 0.808079
cnt = 23, total = 0.764601
cnt = 25, total = 0.804601
cnt = 27, total = 0.767564
cnt = 29, total = 0.802046
cnt = 31, total = 0.769788
cnt = 33, total = 0.800091
cnt = 35, total = 0.771520
cnt = 37, total = 0.798547
cnt = 39, total = 0.772906
cnt = 41, total = 0.797296
cnt = 43, total = 0.774040
cnt = 45, total = 0.796263
cnt = 47, total = 0.774986
cnt = 49, total = 0.795394

result = 3.1815766854350325
계산에 78 ms가 소요되었습니다.   // 계산 시간은 cnt, total 값을 출력하느라 더 걸렸으며 실행할 때마다 달라질 수 있음



더불어 p.584의 <여기서 잠깐>에 있는 파이 계산식이 잘못되어서 죄송하다는 말씀 덧붙이겠습니다.



1/3 + 1/5 - 1/7 + 1/9  - 1/11 + 1/13  - 1/15 + ...  가 아니라




4 x (1 - 1/3 + 1/5 - 1/7 + 1/9  - 1/11 + 1/13  - 1/15 + ... ) 입니다.



감사합니다.



김윤명
댓글 입력
자료실