Showing posts with label JAVA. Show all posts
Showing posts with label JAVA. Show all posts

Thursday, September 26, 2019

java shift 연산

java shift 연산

Shift 연산

  • bit 연산은
  • 16진수? int를 표현하는 방법
  • 아래 예제는 전부다 16을 출력
  int a = 0x010;
  System.out.println(a);
  a = 0x0010;
  System.out.println(a);
  a = 0x0000010;
  System.out.println(a);
  a = 0x000000000000000000000000000000000000000010;
  System.out.println(a);
  • 16진수를 표현하는 방법?
    • 0x에 0 to f 까지 표현할수 있다. (0 -15)

<< number , >> number 연산자

  • 비트값을 왼쪽으로 number만큼 움직여준다.
int a = 8;
System.out.println(Integer.toBinaryString(a));
// 001000
a = a << 2;
System.out.println(Integer.toBinaryString(a));
// 100000
a = a >> 2;
System.out.println(Integer.toBinaryString(a));
// 001000
  • 1을 오른쪽으로 비트 연산하게 되는경우 어떻게 나올까??
int a = 1;
System.out.println(Integer.toBinaryString(a));
// 00001
a = a >> 5;
System.out.println(Integer.toBinaryString(a));
// 0
  • 으로나온다.

Tuesday, October 31, 2017

Effective Java 규칙13 클래스와 멤버의 접근 권한은 최소화 하라

1. API를 만들때 감출수 있는 내용은 모두 감추는게 좋다
2. information hiding 정보 은닉, encapsulation 캡슐화라고 용어로 알려져있다. ( 소프트 설계의 기본 원칙중의 하나라고 한다. )
3. 정보은닉이 중요한 이유
  - 의존성을 낮춰서 병렬 개발 가능
  - 의존성을 낮추서 개발 속도 증가
  - 유지보수도 낮출수 있다.
4. 핵심은 각 클래스와 멤버는 가능한 접근 불가능하도록 만들어라
5. 접근 범위는
  1) public
  2) private
  3) protected
  4) default ( package-private) 라고도 한다
6. 변경가능한 public 필드를 가진 클래스는 다중 스레드에 안전하지 않다.
7. 배열은 public static final 배열필드를 두거나, 배열 필드를 반환하는 접근자를 정의하면 안된다. 배열의 내용을 언제든지 변경이 가능하기때문..

Monday, April 10, 2017

Effective Java 규칙12 Comparable 구현을 고려하라

알파벳 순서나 자연적 순서에 따르는 값의 클래스를 구현할때는
Comparable을 구현하는 것을 고려해봐야한다.

고려한다는 말은 추천한다는 말의 의미이지 꼭 써야한다는것은 아니다.


public interface Comparable<T>{
   int compareTo(T t);
}


A < B   -1
A == B  0
A > B    1

A<B 이고
B<C 인경우
A<C 이어야한다. 추이성(transitivity)

x.compareTo(y)== 0 이라고 x.equals(y) 가 참은 아니다.

int를 비교할때 대상이 음수라면
comapre로직을 고려해봐야한다.

비교 로직이 a-b > 0  이런식으로 작성할경우

int 의 max 값에서 더 큰수를 더 할 경우  즉
a = 양수 최대값이고
b = 음수면
int범위 밖의 내용에 해당하므로 음수가 반환이 된다.

Comparable은 컬렉션 객체에서 유용하게 쓰인다.

Monday, March 13, 2017

Effective Java 규칙10 toString은 항상 재정의하라

toString 값을 항상 재정의 하라고 나온다.

"모든 하위 클래스는 이 메서드를 재정의함이 바람직하다"

만약에 재정의 하지 않게 되면..
클래스이름@16진수해쉬코드 로 표현이 되는데

PhoneNumber@163b91 과 같은 사람이 인지하기에는어려움이 있다.
만약에 재정의 한다면 010-xxx-xxxx 처럼 읽기 쉽고, 명확해진다.


어떤사람들은 toString값을 파싱해서 사용하는 사람도 있다.
toString값에 이게 어떠한 값이들어있는지 주석을 달고 명시해주는것도 좋고
만약에 변동될 수 있는 사항이라면 그러한 내용을 담은 주석을 달아놓는것도 좋다.

나는 모든 클래스에 대해서 toString값을 재정의 하지 않는다.
책에서는 하라고 했는데 그냥 필요시에만 해도 여태까지 불편함없이 충분히 잘 개발해오고 debug 해왔다고 생각한다.

머 장점이라고 한다면 컬렌셕을 출력했을때 쉽게 해당 내용을 찾아볼수 있다는것??

모든 클래스 재정의는 한번 생각해볼필요가 있다.

Wednesday, March 8, 2017

Effective Java 규칙9 equals를 재정의 할때는 반드시 hashCode도 재정의해라

책의 내용이 너무 좋긴 한데 이렇게 긴글을 다 간추리기는 불가능하므로 
느낀점만 작성한다.
그리고 규칙이 띄엄띄엄 블로그에 올라올텐데
완전하게 이해가 안되는 부분은 한 사이클을 돌고 난후 두번째 읽으면서 이해가 되면 올릴 예정이다.

만약에 예를 들어

HashMap<PhoneNumber, String> 의 객체에 new PhoneNumber를 set하고
다시 똑같은 값의 객체를 생성해서 new PhoneNumber get을 하게 되는 경우

hashCode 를 재정의 하지 않은 경우 return의 null 값을 반환하게 된다.
그 이유는 각가 다른 Hash를 가지고 있기때문에 equals로 똑같은 객체라고 판단을 해도 서로 다른 hash bucket을 다이렉트로 참조 하려고 하기 때문이다.

hash code를 정의하는 알고리즘은 있을텐데...
이클립스에서는 자동으로 생성해주는것 같고..
나중에 알고리즘을 한번 읽어봐야겠다..

확실히 책을 읽으니깐 그전에 몰랐던 내용이 이해되는 부분이 많다.

Monday, February 27, 2017

Effective Java 규칙6 유효기간이 지난 객체 참조는 폐기하라

책에서는 Stack을 예를 들어 설명을 하고 있다

pop하는 부분을

return elements[--size];

이런식으로 했는데 그러면 stack 의 포지션은 size보다 더 클 수 없다.
그러면 그 이후의 값들이 전부다 무효하게 되는데..

이런 경우

elements[size] = null 로 치환 시켜주라는 이야기이다.

기존의 문제점
스택자체에서 메모리를 관리한다는 점..

null로 변경시 문제점
null point Exception이 발생할수도 있음..

캐쉬도 마찬가지인데
HashMap을 WeakHashMap이라던지
LinkedHashMap을 이용해서 구현하면 된다고 한다.

LinkedHashMap 에는 removeEldestEntry를 제공해줘서 오래된 내용을 파악하는데 도움이 된다고 함..

음... ....

머 자바 개발할때 이정도는 다 유의해서 사용하는거긴 한데..
왠만하면 자바에서 제공하는 자료구조를 이용해서 개발하는게 제일 괜찮을듯 하다.

Thursday, February 23, 2017

Effective Java 규칙5 불필요한 객체는 만들지마라

1. String 생성할때 new String("ab") 이런식으로 만들면 불필요한 객체를 생성하게 된다
차라리 String  key = "ab" 이런식으로 만들면 객체는 하나만 생성되고, 다른곳에서 사용을 하더라도 jvm 에서 객체를 생성하지 않고 동일한 객체를 사용한다.

2. Long  long autoboxing으로 primitive로 해결할 수 있는거는 굳이 Long으로 사용하지 않는다.

3. 데이터 베이스 같은 고 메모리의 객체를 사용할때는 Pool을 사용하면 성능에 좋겠지만
일반적으로는 사용하지 않는게 더 좋다. 그 이유는 (최적화된 쓰레기 수집기) 라고 번역되어있지만 이게 gabage Collector를 말하는것 같네요. 그 이유는 가벼운 객체라면 풀보다 월등한 성능도 보여지고 코드수가 간결해진다.


Monday, February 13, 2017

Effective Java 규칙4 객체 생성을 막을때느 private 생성자를 사용하라

객체 사용을 왜 막아야할까??
모든 메소드들이 정적 패턴으로 이루어져있다면..

책에서는 Math 클래스를 예를 들었다.
사실 메소드 단위의 기능들을 객체로 만들기도 애매하고. 그런경우 정적 (static) 메소드로 만드는데 어찌되었든 객체 생성을 막고싶을때 어떻게 해야하나??

클래스를 abstract로 생성한다면??? 하위클래스로 생성하면 그만이다.
생성자를 private 로 선안하면 객체 생성이 안된다

그리고 클래스 내부에서도 호출을 못하도록 예외를 던지면 객체를 생성할수 없는 class 완성

이걸 해서 머할까?? 아직은 감이 안오넹..

Effective Java 규칙3 private 생성자나 enum 자료형은 싱글턴 패터을 따르도록 설계하라 TODO

이거는 나중에 정리해야겠다

Thursday, February 9, 2017

Effective Java 규칙2 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라

다시 말하지만 내용을 요약한 부분이 아니라 이 책을 읽고 어떻게 이해를 했고 장단점이 머가 있을까라고 생각하는 나의 의견을 적는 곳이라서 참고 부탁합니다.


일반적으로 자바 빈스 패턴으로 getter와 setter를 사용하는게 일반적이지만
생성자를 만들때 인자의 개수가 많아지면 곤란한다. 그리고 그 인자 값들이 필수 값이 아니라 선택사항일 경우 인자의 개수만큼 생성자수의 개수만큼 만들어지니 복잡해진다.

만약에 개수가 A, B, C, D 4개라고 한다면 (모두 String이라고 가정한다.)

Class(A) 가 필요하겠고
Class(B) 가 필요하겠고
...
Class(A, B) 가 필요하고..
음..
불필요하게 많은 생성자가 필요하다.

Build Pattern 의 장점

  1. 한번 build를 하면 변수값들이 immutable이 된다.
  2. 내부적으로 일련번호를 만들어서 관리할수 있다.
  3. build할때마다 새로운 객체를 생성할 수 있다.
  4. 변수 입력후 반환타입이 build객체라서 객체가 유연하다.


Build Pattern 의 단점

  1. 코딩이 길어진다
  2. 귀찮다.
  3. 장점이지만 한번 빌드한 변수는 수정이 불가능하다

이 정도로 생각이 되네요.

Wednesday, February 1, 2017

Effective Java 1장 생성자 대신 정적 팩토리 메소드를 사용하자

책을 읽고 난 후 개인 정리

장점 : 
  1. 반환값이 항상 객체가 아니다.
  2. type을 유추할 수 있다.
  3. Singletone으로 만들수도 있고 매 호출마다 객체를 생성 할 수 있다.
  4. Naming 이 가능하다
 
단점
  1. 객체를 생성하는 정적 메소드 이름이 일반 정적 메소드와 구분이 안된다.
  2. 개발자들끼리 어느정도 동의가 필요함
  3. 그외 딱히 단점은 없는것 같다

잘 정리하고 싶지만 회사 일이 바빠서 개인적인 느낌만 적어 나가야겠다.

Tuesday, April 26, 2016

how can we know this array is sorted in java

this is easy example

        int o = a[0] < a[1] ? 0 :1;
 for (int i = 1; i < a.length-1; i++) 
   if( 0!= (a[i] < a[i+1]?0:1) )   return "not sorted";
 return o ==0?"ascending" : "descending";

Monday, January 4, 2016

카카오톡 메세지중 url의 상세정보 처리

카톡을 하면서 url을 보내보았는데 아래와같이 정보들이 보여지길래 API가 있나보다 생각해서 한참을 찾았는데
못찾았네요. 어떻게 할까 고민하다가 Java로 카톡 url 메세지 내용을 따라 하는 소스를 코딩했어요.

먼저 캡처화면을 찍은거를 보여주면 컨텐츠 내용에 url이 담겨져있는거는 사이트의 내용이 요약되어 보여지네요


검색해야하는 내용
1. 이미지가 보여진다
2. 해당 사이트의 Detail이 보여진다.
끝??? 생각보다 분석할 부분이 없네요. ㅡ.ㅡ;


그러면 이미지는 어디에서 확인을 해야할까요?? 일단 네이버 홈페이지에 들어가보았습니다
크롬으로 www.naver.com에 들어가 크롬 개발자모드로 디버깅을 해본결과 meta태그에 내용이 있었습니다.


여기서 meta tag에  property 에 image 와, description을 발견할수 있는데
어떤싸이트에는 og:image 이런식으로 표현하고 또 다른 특정사이트에는 og를 제외한 image라고 표시하던데 둘중에 하나라도 있으면 해당 정보들이 있다고 판단하면 될 것 같네요.


content-type체크 
모든 URL의 반환타입이 html이 아니다. 경우에 따라서 xml을 반환할때도 있고, 특정 파일들을 반환할때도 있는데
어떻게 이 url이 사이트라고 판단을 하냐면 request의 response 값에 content-type을 확인해보면 된다.

json 같은 경우는
application/json 의 형식이고
html같은경우는
text/html 이런식으로 반환해주는데

content-type 규약 사이트에 들어가면 더 자세하게 나와있을것 같네요.


실제 코딩을 해보자. 
1. HttpURLConnection 을 이용하여 url 호출 
2. responseCode == 200(성공) 이고 content-type 이 text/html 일때 전체 html을 파싱준비
3. html 파싱 라이브러리를 사용하지 않고 정규식을 이용해서 meta 태그를 찾고 content 와 property 값이 있는 경우에만 매칭
4. 결과물 출력

사용한 정규식
<meta.*?((content=['\"].*['\"])|(property=['\"].*['\"])).*?((content=['\"].*['\"])|(property=['\"].*['\"])).*?>

해석 : 
<meta 태그로 시작하며
.는 모든 문자를 말하며
*는 0번또는 여러번을 말한다.
content 가 먼저 나올수도 있고 property가 먼저 나올수도 있어서
((content=['\"].*['\"])|(property=['\"].*['\"]))
그룹함수로 그룹을 묶어주었고 | or 표시로 둘중에 하나만 매칭이 되도 매치가 될수 있도록 지정
['\"] 란 홑따옴표가 나올수가 있고 쌍따옴표가 나올수가 있는데 둘중 하나라도 매칭이 되면 OK
.*?다른 변수들이 나올수도 있어서 조건을 넣어주었고
((content=['\"].*['\"])|(property=['\"].*['\"]))
다시 content나 property가 매칭이 되도록 조건을 한번더
>
그리고 마무리는 닫는 태그로.

좋은 방법인지는 모르겠지만 한방에 체크하고 싶어서 복잡한 정규식을 사용했습니다.


그룹함수에 번호를 사용을했는데
((A)|(B)) ((C)|(D))
순서를 매기자면
((A)|(B)) 의값이 1번
(A)의 값이 2번
(B)의 값이 3번
((C)|(D))의 값이 4번
(C)의 값이 5번
(D)의 값이 6번으로 데이터를 캐치할수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package kakaotalk;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
    public static void main(String args[]){
        URL url;7
        InputStream is = null;
        BufferedReader br;
        String line;
        try {
            url = new URL("http://www.naver.com");
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.connect();
            String contentType = connection.getContentType();
            System.out.println(contentType);
            
            int responseCode = connection.getResponseCode();
            System.out.println(responseCode);
            
            if(responseCode== 200){ // 성공
                if(contentType != null ){
                    if(contentType .contains("text/html")){
                        // 파싱 시작
                        br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
                        String fullStr = "";
                        StringBuffer bf = new StringBuffer();
                        while ((line = br.readLine()) != null) {
//                            System.out.println(line);
                            
                            bf .append(line).append("\n");
                        }
                        fullStr = bf.toString();
                        
                       // 전체
                       System.out.println(fullStr);
                        
                       long start = System.currentTimeMillis(); 
                       KakaoData data  = getData(fullStr);
                       System.out.println(System.currentTimeMillis()-start);
                    }
                }
            }
            
            
        } catch (MalformedURLException mue) {
             mue.printStackTrace();
        } catch (IOException ioe) {
             ioe.printStackTrace();
        } finally {
            try {
                if (is != null) is.close();
            } catch (IOException ioe) {
                // nothing to see here
            }
        }
    }
    
    class KakaoData {
        public String imagePath =null;
        public String content = null; 
    }
    
    /**
     * 메타 tag에서 content와 property 값을 가진 라인을 찾는다
     * @param str
     * @return
     */
    public static KakaoData getData(String str) {
        
        String reg = "<meta.*?((content=['\"].*['\"])|(property=['\"].*['\"])).*?((content=['\"].*['\"])|(property=['\"].*['\"])).*?>";
        
        Pattern pattern2 = Pattern.compile(reg,
                Pattern.CASE_INSENSITIVE);
        Matcher matcher2 = pattern2.matcher(str);
        while(matcher2.find()){
            String match2 = matcher2.group();
            System.out.println(" 0 : " + matcher2.group(0));
            System.out.println(" 1 : " + matcher2.group(1));
//            System.out.println(" 2 : " + matcher2.group(2));
//            System.out.println(" 3 : " + matcher2.group(3));
            System.out.println(" 4 : " + matcher2.group(4));
//            System.out.println(" 5 : " + matcher2.group(5));
//            System.out.println(" 6 : " + matcher2.group(6));
            System.out.println();
        }
        
        // 한번더 필터링을 거친후 실제 데이터를 입력을 해주어야함
        return null;
    }
}
cs


결과물 
 0 : <meta property="og:title" content="네이버 메인">
 1 : property="og:title"
 4 : content="네이버 메인"

 0 : <meta property="og:url" content="http://www.naver.com/">
 1 : property="og:url"
 4 : content="http://www.naver.com/"

 1 : property="og:image"

 0 : <meta property="og:description" content="네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요">
 1 : property="og:description"
 4 : content="네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요"


음... 여기서 필요한 내용을 다시 한번 split을 사용하던 파싱을 해서 뽑아내면 되겠네요.

처음 그림으로 돌아가서 
필요한 데이터는 
detail >>  네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요
title  >> 네이버 메인

Sunday, December 20, 2015

ThreadLocal

금일 ThreadLocal에 대해서 공부를 했다.

static 으로 선언을 하며 ThreadLocal<?>에 있는 객체를
쓰레드마다 set과 get을 할 수 있다.

신기하게도 자동으로 Thread 의 고유한값에 의해서 데이터들을 불러올수 있으며 ThreadLocal의 객체 끼리 자원공유가 안되며..

음..... 아무튼 신기하다.

ThreadLocal을 아직까지는 쓸 이유가 없다고 생각이 든다.

Thursday, December 10, 2015

Easy binding template using regExp in java

this is what easy way to just data binding with regExpression

my template

java

/**
 * Copyright 2009 by  Corp.,
 * All rights reserved.
 * 
 */
package hanwha.neo.modules.mobileapp.util;
import hanwha.neo.commons.IOUtils;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * @author : ddavid
 * @version $Id: HtmlCovertToString.java,v 1.1.2.1 2015/12/11 15:01:53 Exp $
 */
public class HtmlCovertToString {
    
    
    public static String getConvertedString(String path, HashMap<String, String> map){
        return getChangedStr(getFileString(path), map);
    }
    public static String getFileString(String path) {
        FileInputStream fi = null;
        String str = "";
        try {
            fi = new FileInputStream(path);
            str = IOUtils.getString(fi);            
            System.out.println(str);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            org.apache.commons.io.IOUtils.closeQuietly(fi);
        }
        return str;
    }
    public static String getChangedStr(String str, HashMap<String, String> map) {
        StringBuffer output = new StringBuffer();
        Pattern pattern = Pattern.compile("\\{\\{[a-zA-Z0-0]+\\}\\}",
                Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);
        // using Matcher find(), group(), start() and end() methods
        int currentIndex = 0;
        while (matcher.find()) {
            String match = matcher.group();
            match = match.substring(2, match.length() - 2); // remove {{ }}
            output.append(str.substring(currentIndex, matcher.start()));
            if (map.containsKey(match)) {
                output.append(map.get(match));
            } else {
                output.append(matcher.group());
            }
            currentIndex = matcher.end();
            /*
             * System.out.println("Found the text " + matcher.group() +
             * " starting at " + matcher.start() + " index and ending at index "
             * + matcher.end());
             */
        }
        output.append(str.substring(currentIndex, str.length()));
        return output.toString();
    }
}
cs

and html file is

1
2
3
4
5
6
7
8
<html>
    <head></head>
<body>
    <p>    this is very good template  name {{name}} and age {{age}}
    </p>
</body>
</html>
cs

where to call is

1
2
3
4
5
6
HashMap<String, String> map = new HashMap<String, String>();
        
map.put("name", "david");
map.put("age", "15");
            
body = HtmlCovertToString.getConvertedString("testhtml", map);
cs

this is output
1
2
3
4
5
6
7
<html>
    <head></head>
<body>
    <p>    this is very good template  name david and age 15    
    </p>
</body>
</html>
cs

Monday, October 26, 2015

프로젝트를 import 후 class 변경할때 엑세스가 거부되었습니다.

그 폴더를 가서 attrib으로 proejct 파일과 classpath 속성을 변경해준다.

attrib -S -H .project
attrib -S -H .classpath



attrib는 도스, OS/2, 마이크로소프트 윈도의 명령 가운데 하나이다. attrib의 기능은 파일 특성 (읽기 전용/r, 보관/a, 시스템/s, 숨김/h)을 설정하고 제거하는 것이다. 이러한 특성들은 파일을 보호하고 분류할 목적으로 다양한 소프트웨어에 사용된다.[1]

수많은 사용자들은 일반적으로 읽기 전용 특성을 마주치면서 소프트웨어 사용 시 사용자가 파일을 덮어쓰거나 추가하지 못하게 한다. 그러나 사용자에게 확인을 받은 뒤에는 소프트웨어가 이 옵션을 무효화할 수 있다. 보관 특성은 어느 파일을 백업할 필요가 있는지를 알려주기 위해 다양한 백업 및 파일 복사 프로그램에 사용된다.[2] 숨김 특성은 영향을 받는 파일들이 수많은 프로그램들에 보이지 않게 하지만 다양한 소프트웨어, 특히 파일 나열, 표시, 검색을 목적으로 설계된 소프트웨어는 숨김 파일을 보이게 만들 수 있으며 숨김 처리되어 있음을 표시해준다. 시스템 특성은 특정한 운영 체제 파일들을 가리키며 다른 특성들에 비해 대부분의 소프트웨어의 작동에 덜 영향을 미친다.

Tuesday, October 13, 2015

Thread Safe ArrayList

how to make Thread safe Array List

List<Integer> list = Collections.synchronizedList(new ArrayList<Integer>());

Tuesday, January 6, 2015

Difference between LinkedList and ArrayList and Performance Test

안녕하세요 저는 쯔앙구입니다.

3년전에 학원에서 처음으로 Java언어를 배우고 안드로이드 어플 개발중 왜 실력이 늘지 않는걸까?? 라는 생각에 자바 자료구조 책을 한권샀습니다.
거기에서는 c언어랑 의사코드랑 같이 섞여있는데 제가 자바만 배웠는데 알겠나요?? 너무 어려워서 Linked에서 포기...
에라 모르겠다. 몰라도 어플동작이 잘만 되자나??
라고 생각했는데 1년뒤에 제가 짠 어플 소스를 다시 보니깐 부끄러울 정도였더군요.
혹시나 저처럼 먹고살기 힘들어서 기초 없이 학원에서 속성과정으로 자바를 시작하는 사람에게 한번더 생각하면서
코딩을 할 수 있도록 도움을 주고자 작성합니다.


ArrayList와 Linked 리스트의 차이점.

학원에서 무조건 암기하라고 했습니다.
List list = new ArrayList();
그러다 보니 2-3년간 무조건 리스트는 ArrayList를 만들었습니다.

자바에서 대표적으로 사용하는 리스트는 ArrayList와 LinkedList가 있는데
잠깐 살표볼께요.

상황에 따라서 사용을 해야하는데 무조건 ArrayList를 고집해서 사용하게 될 경우 시스템에 어떠한 영향을 끼칠지 알아봅시다.


ArrayList = 말 그대로 new Object[] 배열을 생성해서 배열을 가지고 Insert, delete 하는 방법

LinkedList = Header부분에 왼쪽 노드, 오른쪽 노드의 주소값을 가지고 찾아가는 방법
아래는 코드를 돌린 내용입니다.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package mybook;

import java.util.ArrayList;
import java.util.LinkedList;

public class DifferentList {

 public static void main(String[] args) {
  Long start =0l;
  Long end =0l;
  
  start = System.currentTimeMillis();
  
  ArrayList<String> array= new ArrayList<String>();
  for(int i=0; i<10000000; i++){
   array.add("hello");
  }
  logEnd(start, "array Insert");
  
  
  start = System.currentTimeMillis();
  LinkedList<String> linked= new LinkedList<String>();
  for(int i=0; i<10000000; i++){
   linked.add("hello");
  }
  logEnd(start, "Linked Insert");
  
  
  start = System.currentTimeMillis();
  for(int i=0; i< 10000; i++){
   array.remove(i); 
  }
  logEnd(start, "Array RemoveIndex");
  
  
  start = System.currentTimeMillis();
  for(int i=0; i< 10000; i++){
   linked.remove(i); 
  }
  logEnd(start, "Linked RemoveIndex");
  
  start = System.currentTimeMillis();
  for(int i=1000000; i< 10000; i++){
   array.remove(i); 
  }
  logEnd(start, "Array RemoveIndex");
  
  
  start = System.currentTimeMillis();
  for(int i=1000000; i< 10000; i++){
   linked.remove(i); 
  }
  logEnd(start, "Linked RemoveIndex");
 }
 
 public static void logEnd(long start,  String message){
  System.out.println(message + " : " +(System.currentTimeMillis() - start));
 }
 
 
}


== 결과 ==

array Insert : 94
Linked Insert : 1078

Array RemoveIndex : 78462
Linked RemoveIndex : 110

Array RemoveIndex : 0
Linked RemoveIndex : 0


결과를 봐서 add 하는 부분은 LinkedList에 비해 ArrayList 가 10배 정도 빠르고
index값의 데이터를 삭제하는 부분은 데이터가 크면 클수록 ArrayList 가 LinkedList에 비해 속도가 현저히 느렸습니다.

결론 : 무조건 ArrayList를 사용하는것이 아니라 고객의 Needs를 통해서 어떠한 방법으로 구현을 해야할지에 대해서 충분히 고민을 한 후 코딩을 해야한다.