복사 대상이 되는 클래스는 java.lang.Cloneable 인터페이스를 반드시 구현(implements)해야 한다.

 

복사 대상이 되는 클래스가 직접 구현해도 상관없고, 상위 클래스 어딘가에서 구현해도 괜찮으며, Cloneable의 하위 인터페이스를 구현해도 상관없다.

 

Cloneable 인터페이스를 구현한 클래스의 인스턴스는 clone메소드를 호출하면 복사된다.

 

clone메소드를 사용하는 방법은

 

n         public Object clone()메서드의 재정의와 protected native Object clone메서드 사용

 

인데..

 

 

아래의 경우 super를 붙여준 이유는 super를 빼버리면 자기 자신이 가지고 있는

 

(즉, 오버라이드한 clone)을 호출하게 되므로 무한루프가 돌아서 stack over flow가 발생하게 된다.

 

따라서 아래와 같이 해주던지..super를 빼려고 한다면

 

createclone등으로 이름을 바꿔주고 호출하면 된다...

 

 

 

class SimpleClone implements Cloneable{       

             public int count=0;

             public SimpleClone(int count){

                           this.count = count;

             }           

             public Object clone(){                      

                           Object o = null;                  

                           try{                     

                                        o = super.clone();              

                           }catch (Exception e){System.out.println("can't clone object");}

                           return o; 

             }

}

public class LCopy{

             public static void main(String args[]){

                           SimpleClone sc1 = new SimpleClone(22);

                           SimpleClone sc2 = (SimpleClone)sc1.clone();

                           System.out.println("sc1 hashCode:"+sc1.hashCode() + ", count의값:" + sc1.count);

                           System.out.println("sc2 hashCode:"+sc2.hashCode() + ", count의값:" + sc2.count);

             }

}

 

%헷갈리지 말자%

보통 서적에 나와있는 clone을 사용하려면 그 클래스는 cloneable을 구현하고

clone메소드를 재정의 해줘야 한다고 나온다.

 

여기서 생각해보면 clone()메소드는 java.lang.Object의 메소드이고 Object 클래스는 모든 클래스의 상위 클래스인데 왜 굳이 clone()메소드를 오버라이드 해줘야 한다고 할까..?

 

즉, public TestClone implements Clonable{...}

라는 클래스가 있을때 그냥 clone이라고 사용을 해도 될텐데 왜 재정의가 필요하다고 할까?

 

clone이라는 것은 자기 자신을 복제하는 메소드이다. 보통 다른 클래스에서

 

복제를 요청하거나 위의 경우만해도 Main클래스에서 테스트를 위해 clone을 호출하고 있는데

 

이 clone메소드는 Protected형이다. 따라서 재정의가 없으면 이 메소드를 다른 패키지나 상속관계에 있지 않는 클래스들은 호출 할 수 없다는 것이다.

 

따라서..clone()메소드를

 

public Object clone(){

   return super.clone();

}

 

로 재정의 해주던가 아니면 아예 다른 이름으로

 

public Object runClone(){

  return clone(); //이 경우에는 super를 안 붙여도 됀다. 같은 이름의 메소드로 재정의 하지 않았기 때문에 자동적으로 상위 클래스에 있는 clone()메소드가 호출된다.

}

 

그래서 재정의를 해줘야 한다는 말이 나오는 것이다.

 

같은 이름으로 오버라이드를 해주던 다른 이름으로 다른 클래스에서 접근가능한 클래스를

만들어주던간에 어쨋든 구현을 해주어야 다른 클래스에서 접근이 가능하기 때문이다.

 

 

혹시 인터페이스를 구현했기 때문에 거기에

 

있는 추상메소드를 구현해야 한다고 생각하지 말자. Cloneable 인터페이스는 아무런 추상메소드도

 

가지고 있지 않다. 단지 이 인터페이스를 implements한 클래스는 clone을 사용하여 복사 가능하다

 

..라고 나타내 주는 것에 불과하다.

 

퍼옴 : http://devyongsik.tistory.com/60

 

#해싱

 해싱은 키 값에 직접 산술적인 연산을 적용하여 항목이 저장되어 있는 테이블의 주소를 계산하여 항목에 접근한다. 이렇게 키값 연산에 의해 직접 접근이 가능한 구조를 해시테이블이라 부르며,

해시테이블을 이용한 탐색을 해싱이라 한다.

 

 

#해싱의 구조

 해싱에서는 자료를 저장하는데 배열을 사용한다. 배열은 단점도 있지만 만약 원하는 항목이 들어 있는 위치를 알고 있다면 매우 빠르게 자료를 삽입하거나 꺼낼 수 있다.

(곧. 해싱이란 어떤 항목의 탐색 키만을 가지고 바로 항목이 들어 있는 배열의 인덱스를 결정하는 기법이다.)

 

해시함수란 탐색키를 입력으로 받아 해시주소를 생성하고 이 해시주소가 배열로 구현된 해시테이블의 인덱스가 된다. 이 배열의 인덱스의 위치에 자료를 저장 할수도 있고 거기에 저장된 자료를 꺼낼 수도 있다.

 

Iterator 개념 정리

Program_Language/Java 2015. 6. 6. 01:16 Posted by Request

Collection 인터페이스에는 Iterator 를 반화하는 Iterator()를 정의하고 있다.

곧, Collection 인터페이스의 자손인 List와 Set에도 포함되어 있다. 그래서 List나 Set 인터페이스를

구현하는 컬렉션은 iterator() 각 컬렉션의 특징에 알맞게 작성되어 있다.

 

boolean hashNext() : 읽어 올 요소가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다.

 

Object next() : 다음 요소를 읽어 온다. next() 호출 하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인 하는 것이 기본이다.

 

void remove() next()로 읽어 온 요소를 삭제한다. next()를 호출한 다음에 remove()를 호출해야한다.

 

HashMap과 HashSet은 둘다 collection framework에 속하여 객체들의 모음을 이용해 작업하는 것을 도와준다. Collection framework는 인터페이스 와 구현된 클래스를 가지고 있다.

 

기본적으로 collection framework는 Set, List, Queue 인터페이스로 나눠진다.

각각의 인터페이스는 속성을 갖게 되는데 예로 들어, set는 객체를 받되 중복되는 값은 허용하지 않는다.

List는 인덱싱을 하여 중복을 허용하고, Queue는 FCFS 알고리즘을 기반으로 한다.

(FCFS 알고리즘이란 : FIFO(First In First Out) 대기 큐에 먼저 들어온 것 우선으로 실행해주는 알고리즘 )

 

 

HashSet이란?

HashSet 은 Set 인터페이스를 구현한 것으로 들어오는 객체 중, 중복된 객체를 허용하지 않는다.

 

HashSet에 들어 가는 객체들은 반드시 equals()와 hashCode() 메소드를 구현해야 하는데,

이메소드들을 가지고 HashSet에 들어갈 때 중복된 객체가 있는지 여부를 체크하게 된다.

 

또한 HashSet은 저장 순서를 유지하지 않으므로, 저장 순서를 유지하고자 한다면

LinkedHashSet을 사용해야 한다.

 

public boolean add(Object o) 메소드는 set에 데이터를 집어넣을 때 사용되는데,

성공적으로 추가되면 true 를 중복된 객체가 들어오면 false를 리턴한다.

 

 

 

HashMap이란?

hashMap은 Map 인터페이스를 구현한 것으로 Key-value 형식의 데이터를 저장한다.

역시나 중복된 key값ㅇ느 호용되지 않는다.

HashMap과 TreeMap 이 두가지의 기구현된 클래스가 있다.

이 둘의 주요 차이점은 TreeMap은 집어 넣은 순서를 유지하는데 비해 HashMap은 유지하지 않는다.

HashMap은  null value 와 null key value를 허용한다.

HashMap은 기본적으로 동기화(synchronized) 가 되지 않으나, collection framework가 메소드를 제공하므로 이를 이용해서 HashMap을 동기화 시켜 멀티 쓰레드 환경에서 사용 할 수 있다.

 

put()

 

public Object put(Object key, Object value)메소드는 map에 데이터를 저장 할 때 사용한다.

 

 

다음 정리 할 것 --> 해시코드와 해싱 & Hashtable

PBKDF2-HMAC-SHA-256/SHA-512

 bcrypt


패스워드 정책

 

[출처 : http://helloworld.naver.com/helloworld/318732]

지금까지는 그냥 String의 길이는 length()로 체크하고

배열에는 length로 하는 것이다. 라고만 알고 있었지.

 

왜 그럴까 하는 궁금증이 이제서야 났다.

 

그래서 API에서 배열에 대한 length를 찾아보았으나.. 없다.... 머지??

 

그래서 네이년에서 검색을 해보니 나처럼 궁금증이 있는 분이 블로그에 글을 올려놓았다.

 

[스크랩 : http://blog.naver.com/thtlsgkrtod?Redirect=Log&logNo=40133271545]

 

스크랩 내용을 빌리자면

----------------------------------------------------------

int, char, byte 등은 프로토타입의 변수입니다.

 

마찬가지로 []란 배열의 개념도 프로토타입의 클래스로 보시면 됩니다.

 

정해진 값들이는 것으로 length는 함수(메서드)가 아닌 필드(영역)라 보심 됩니다.


API는 클래스와 함수(메서드)를 사전식으로 놓은 것이므로 이에 대한 내용을 찾을 수 없습니다.

 

굳이 찾아보실려면 JVM 스펙문서를 뒤져보시면 됩니다.

----------------------------------------------------------

 

JVM 스펙 문서를 찾아 봤으나 ... length 필드 라는 영역을 찾을 수가 없었다.. (OTL...)

 

<Exception>

fail to execute jsp : gagaga07.jsp

(Exception) java.lang.NumberFormatException : For input string: "60504.44"

 

at java.lang.NumberFormatexception.forinputString(NumberFormatException.java:63)

at java.lang.Long.parseLong(Long.java:427)

at java.lang.Long.parseLong(Long.java:476)

at _donor._500_gagaga07_5fjsp._jspService(_500_gagaga07_5fjsp.java:80)

at jeus.servlet.jsp.HttpJspBase.service(HttpJspBase.java:54)

.......

 

 

왜 에러가 날까 하는 고민 끝에..

일단 컴파일 된 jsp의 자바 파일을 찾기로 했다.

 

1.컴파일 된 java 파일 내 에러 난 행을 찾아라.

 

위치는

 WEB-INF에서 .warjspwork에 있었는데 디폴트 폴더인지 아니면 설정하기 나름인지는

추후 알아 보기로하고!!

 

Exception 로그에서 확인한대로 "e_500_gagaga07_5fjsp.java" 파일을 열어서

vi 편집기 (라인 넘버 :set number , 63G) 63행 확인

 

 

2.원인 파악

 

구글링을 해보니,

"60504.44"

소숫점 붙어 있는 것은 parseLong으로 변환이 안되서 에러 난 것임.

 

해결책은 parseFloat 이나 parseDouble로 변환한 다음에 (캐스팅)변환 해야 함.

 

 

charAt()로 한글자씩 읽어서 그것이 숫자에 속하면 자릿수를 곱하여 전체를 더하여 나타내는

함수로 자릿수는 String길이로 알게 된다고 한다.

만약 소숫점을 읽게 되면 숫자가 아니므로 예외가 발생하도록 함수를 만들어 두었다고 한다.

 

-API에 나와 있나? 음.... 이것도 추후 어디에서 설명 되어 있는지 찾아 봐야 겠다.

 

[찾아 볼것]

1.컴파일 된 폴더 설정

WEB-INF에서 .warjspwork에 있었는데 디폴트 폴더 인지 설정 가능 및 설정확인 하는 곳.

 

2.parseLong, parseInt 에 대한 함수 설명

-API 도큐먼트에서 찾아볼것

 

[출처 : http://valley.egloos.com/viewer/?url=http://mchh621.egloos.com/175431 ]

 

null str checking

Program_Language/Java 2013. 7. 23. 00:47 Posted by Request

"".equals(str) vs str.equals("")

로 어느 것이 맞는 것인지 헷갈릴때가 있었다.

아니 아직도 헷갈린다.

어떤 방식이 맞는 것인가? 또한 NullPointException 에 대해 발생 하는 건 어떤 것인가?

두가지를 따져 보기로 하자.

 

오늘 내 소스를 보더니 사수가 equals로 null 체크시 객체 생성으로 메모리 효율성이  떨어질수 있으니

 

if( str == null && str.length() == 0 ) 에 대한 사용을 권유 받았다.

 

그래서 정확히 짚고 넘어가고 싶어 야밤에 정리 해 놓는다.

 

 

구글링에서 찾은 결과,

이유까지 설명해주면서 나에게 너무나 이해가 쉽게 될 수있는 두 곳이 있었다.

한곳은 nullPointException 처리에 대한 조건문 처리,

다른 한곳은 equals에 대한 param 위치

 

==========================================================================

1. nullPointException 처리 

equals("")를 사용하면 불필요하게 새로운 스트링인 ""를 생성하게 되고
함수 내부에서 몇 번의 비교후에 다른 스트링으로 형변환 및 치환도 합니다.
반면 length() 함수는 내장객체인 int 변수 하나만 리턴하면 되므로 빠릅니다.
아래 String.equals() 함수와 String.length() 함수 소스를 확인해보세요.
-----------------------------------------
 public int length()
 {
     return count;
 }
-----------------------------------------
    public boolean equals(O bject obj)
    {
        if(this == obj)
            return true;
        if(obj instanceof String)
        {
            String s = (String)obj;
            int i = count;
            if(i == s.count)
            {
                char ac[] = value;
                char ac1[] = s.value;
                int j = offset;
                int k = s.offset;
                while(i-- != 0)
                    if(ac[j++] != ac1[k++])
                        return false;
                return true;
            }
        }
        return false;
    }

 

[ 출처 :   http://tazz.tistory.com/30  ]

 역시 불필요한 메모리 확보 없이 프로그램은 속도가 갑이다.

==========================================================================

2.equals 의 올바른 param 위치

 

 1)equals는 boolean값을 반환한다.

 2)매개변수로 Object 클래스를 input 시킨다.

 3)Compares this string to the specified object.(문자열을 object와 비교한다.)

 

"문자열".equals(obj)

 

 

String str = request.getParameter("param");

str.equals("");

 

대신 맞게 문법을 사용해도 불구하고 이런 경우,

str.equest(""); 이 null.equals(""); 로 비교 될수 있어

nullPointException 이 날수 있는 구조이다.

 

그러므로 null 체크에 대한 if문에서는 안 쓰는게 좋다가 결론이다.

 

[출처 : http://imovator.tistory.com/entry/%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%B9%84%EA%B5%90%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0-equals]

 

스크립 : http://blog.naver.com/PostView.nhn?blogId=led73loh&logNo=40168301301

궁금증이 생긴 소스 원본

__pPopup = new (std::nothrow) Popup();

 

 

※ 궁금증

1.new(std::nothrow)

사용방법)

new(std::nothrow) CBASE; 형식으로 할당 하면 되고, 예외발생시 예외를 던지지 않고,

NULL 포인터를 반환하게 해준다.

 

 

 

 

java.lang.IllegalStateException

Program_Language/Java 2012. 6. 25. 10:57 Posted by Request

java.lang.IllegalStateException:저 익셉션은 forward나 redirect를 하기전에.. out.println() 또는 response.setHeader(..)와 같은 함수를 호출해서 발생합니다.

 

즉 브라우져에 보낼 데이터를 버퍼에 쓴 이후로는 redirect나 forward를 할수 없다는 말입니다.


발생한 jsp에서 위와 같은 사항이 없는지 살펴보시길..


디버그 모드에서 값을 확인해도 문제가 된다.

즉, response로 오는 inputStream값에 영향을 주는 요소가 생기기 때문에 말생한다.

참고 : http://okjsp.pe.kr/seq/32250