오랜만에 모사이트에 가서 글을 보다가...

 

String과 StringBuffer에 대한 논쟁이 한참 불붙은 것을 보았습니다.

 

글쓴 사람들 보니까 좀 안다는 사람들 모여서 열띤 토론을 벌이더군요.

 

 

간단히 생각하면 될 문제를 복잡하게 생각하니 배가 산으로 갑니다.

 

 

String이나 StringBuffer나 뭘쓰면 어떻습니까... 성능문제는 성능에 문제가 될때만 발생하는 겁니다.

 

물론 성능이 좋을 수록 좋겠지만... 필요이상으로 성능에 집착하는 것은 낭비입니다.

 

 

제 의견을 말씀드리겠습니다.

 

String이나 StringBuffer나 모두 문자 배열입니다.(char[])

 

 

배열의 특징을 잘아시겠지만, 한번 생성하면 크기를 늘일 수 없어서 크기를 늘이려면 새로운 배열을 만들어야 합니다.

 

String은 변경할 수 없으니 문자열 결합이 일어날때마다 항상 새로운 배열을 만들고 복사하는 과정을 거칩니다.

 

이과정은 여유있는 크기의 배열(StringBuffer)의 내용을 변경하는 것과는 큰 성능 차이가 있습니다.

 

 

하지만, 너무 여유있는 크기의 배열을 생성하면, 메모리의 낭비가 있겠죠.(StringBuffer의 단점)

 

또한 아무리 StringBuffer라고 해도 크기를 작게 잡아놓으면 String쓰는거나 별다른게 없을 수도 있습니다.

(새로운 크기의 배열을 생성하고 복사해야하므로... 그래도 String보다는 StringBuffer가 낫습니다.)

 

 

그래도... 대부부의 경우, StringBuffer를 사용하는 것이 String을 쓰는 것보다 훨씬 빠릅니다.(문자열 편집에 관한한)

 

일부 경우에서는 String이 StringBuffer보다 빠를 수는 있지만, 대부분의 경우 당연하게도 StringBuffer가 빠를 수

 

밖에 없습니다. 배열의 특징이 그렇기 때문이죠.

 

 

한가지 알아야할 것은 String에 대한 +연산을 컴파일러가 StringBuffer로 자동변환해준다는 것입니다.

 

그러니 항상 StringBuffer대신 String을 써도 별 문제 없다고 하는 사람이 있지만... 컴파일러의 자동변환에도 한계가 있습니다.

 

String에 +연산을 사용하는 모든 경우를 커버할 수는 없다는 얘기죠.

 

 

그래서... 웬만하면 문자열 결합에 String을 그냥 사용해도 된다.(컴파일러가 자동변환해서 최적화 해주니까.)

 

성능상의 문제가 되는 경우에만 StringBuffer를 이용해서 최적화한다.

 

모든 곳에 String대신 StringBuffer를 사용하면 가독성이 떨어지니까...(코드를 읽기 힘들어지니까.)

 

출처 : 남궁성 자바카페

 

 

 정규식 패턴

설 명 

결 과 

 c[a-z]* 

 c 로 시작하는 영단어

 c, ca, co, car

 c[a-z]

 c 로 시작하는 두 자리 영단어(대소문구분)

 ca, co

 c[a-zA-Z]

 c 로 시작하는 두 자리 영단어(대소문구분않함)

 cA, ca, co

 c[a-zA-Z0-9]c\w

 c 로 시작하고 숫자와 영어로 조합된 두 글자

 cA, ca, co, c0

 .*

 모든 문자열

 전부다

 c.

 c 로 시작하는 두 자리

 cA, ca, co, c., c0, c#

 c.*

 c 로 시작하는 모든 문자열(기호포함)

 cA, ca, co, combat, c#

 c\.

 c. 와 일치하는 문자열 '.'은 패턴작성에 사용되는 문자이므로

 escape 문자인 '\'를 사용해야 한다.

 c.

 c\d

 c[0-9]

 c 와 숫자로 구성된 두 자리 문자열

 c0

 c.*t

 c 로 시작하고 t 로 끝나는 모든 문자열

 combat, count

 [b|c].*

 [bc].*

 [b-c].*

 b 또는 c 로 시작하는 문자열

 bat, baby, count, car

 [^b|c].*

 [^bc].*

 [^b-c].* 

 b 또는 c 로 시작하지 않는 문자열

 date, disc

 .*a.*

 a 를 포함하는 모든 문자열.

 * : 0 또는 그 이상의 문자

 bat, baby, ca, car, date

 .*a.+

 a 를 포함하는 모든 문자열.

 + : 1 또는 그 이상의 문자. '+' 는 '*' 와 달리 반드시 하나 이상의

 문자가 있어야 하므로 a 로 끝나는 단어는 포함되지 않는다.

 bat, baby, car, combat

 [b|c].{2}

 b 또는 c로 시작하는 세 자리 문자열.

 (b 또는 c 다음에 두 자리이므로 모두 세 자리)

 bat, car

 

예제)

1. 정규식을 매개변수로 pattern 클래스의 compile(String regex)을 호출하여 pattern 인스턴스를 생성

EX) Pattern pattern = Pattern.compile("c[a-z]*");

 

2. 정규식으로 비교할 대상을 매개변수로 Pattern 클래스의 Matcher matcher(CharSequenceinput)를 호출해서 

    Matcher 인스턴스를 얻는다.

EX) Matcher matcher = pattern.matcher("비교할 매개변수");

 

3. Matcher 인스턴스에 boolean matches()를 호출해서 정규식으로 부합하는지 확인한다. (return boolean)

if( matcher.matches() )




-    일반적으로 문자열들을 비교하기 위해서 equels 메서드를 사용합니다.

equals() 메서드로 문자열의 내용을 비교하는 것보다는 등가비교연산자(==) 를 이용해서 주소(4 byte)를 비교하는 것이 더 빠르다.

그래서 비교해야 할 문자열의 개수가 많은 경우에는 보다 빠른 문자열검색을 위해서 intern 메서드와

등가비교연산자(==)를 사용하기도 한다.

- Function 만 기재한다. 나중에 봐도 이해가 되겟지...과연?

 

var jsCopyText = function() {
           
            var copyText = $('#acctList option:selected').text();
            var IE = (document.all) ? true : false;
           
            if(IE) {
                window.clipboardData.setData('Text', copyText);
                alert('클립보드에 복사되었습니다.');
            }
            else {
                temp = prompt('복사할 가상계좌입니다. Ctrl+C를 눌러 클립보드에 복사하세요.', copyText);
            }
           
        }

 

- 브라우저가 IE 일경우에는 window.clipboardData.setDate('setName', '클립보드에 복사할 문자');

   IE가 아니면 prompt 를 뛰어서 사용자가 복사할수 있도록 한다.

   위의 예제는 selectBox 의  text 값을 사용자가 쉽게 복사할수 있도록 하기위함이니. prompt 로 띄어서 복사하게 하는

   것 만으로도 충분하닥 생각한다..(변명이지요)

- Console 에서 로그를 보는데 자꾸 화면을 넘어가서 보기가 힘들다. 구글링 하니 Console 제한을 푸는게 있군.

  자세한 설명은 캡쳐로...

  경로 : Window -> Preferences

 

 

 

 

 

- 스프링에서는 간편하고 프레임워크안에서 스케쥴링 하던 quatz 를 annotation 으로 더 간단하게 설정 할 수 있다.

1. applicationContext.xml 같은 bean 을 설정하는 설정파일에

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/task

http://www.springframework.org/schema/task/spring-task-3.0.xsd

<task:annotation-driven />

 

구문을 입력하면 된다.

EX) 별도의 context-schedule.xml 로 관리(첨부파일 확인)

파일명 : context-schedule.xml  (context-schedule.xml)

 

 

2. 스케쥴링 할 메소드위에 @scheduled 어노테이션을 입력한 후에 시간설정하면 끝

 

3. 시간 설정 @scheduled(cron=" ")  * 리눅스 crontab 과 같은 설정방법

ex> @Scheduled(cron="0 0 02 * * ?") = 매일 새벽2시에 실행

ex> @Scheduled(cron="0 0 02 2,20 * ?") = 매월 2일,20일 새벽2시에 실행

 

4. 스케쥴러 cron 양식? 의미?

 

초 0-59 , - * /
분 0-59 , - * /
시 0-23 , - * /
일 1-31 , - * ? / L W
월 1-12 or JAN-DEC , - * /
요일 1-7 or SUN-SAT , - * ? / L #
년(옵션) 1970-2099 , - * /

* : 모든 값
? : 특정 값 없음
- : 범위 지정에 사용
, : 여러 값 지정 구분에 사용
/ : 초기값과 증가치 설정에 사용
L : 지정할 수 있는 범위의 마지막 값
W : 월~금요일 또는 가장 가까운 월/금요일
# : 몇 번째 무슨 요일 2#1 => 첫 번째 월요일

 

예제)
Expression Meaning
초분시일월주(년)
 "0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00
 "0 15 10 ? * *" : 모든 요일, 매월, 아무 날이나 10:15:00
 "0 15 10 * * ?" : 아무 요일, 매월, 매일 10:15:00
 "0 15 10 * * ? *" : 모든 연도, 아무 요일, 매월, 매일 10:15
 "0 15 10 * * ? : 2005" 2005년 아무 요일이나 매월, 매일 10:15
 "0 * 14 * * ?" : 아무 요일, 매월, 매일, 14시 매분 0초
 "0 0/5 14 * * ?" : 아무 요일, 매월, 매일, 14시 매 5분마다 0초
 "0 0/5 14,18 * * ?" : 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초
 "0 0-5 14 * * ?" : 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초
 "0 10,44 14 ? 3 WED" : 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00
 "0 15 10 ? * MON-FRI" : 월~금, 매월, 아무 날이나 10:15:00
 "0 15 10 15 * ?" : 아무 요일, 매월 15일 10:15:00
 "0 15 10 L * ?" : 아무 요일, 매월 마지막 날 10:15:00
 "0 15 10 ? * 6L" : 매월 마지막 금요일 아무 날이나 10:15:00
 "0 15 10 ? * 6L 2002-2005" : 2002년부터 2005년까지 매월 마지막 금요일 아무 날이나 10:15:00
 "0 15 10 ? * 6#3" : 매월 3번째 금요일 아무 날이나 10:15:00

 

사진도 첨부합니다.

 

 

 

- DB 링크 생성방법 중에 TNSNAMES.ora 에 DB 정보를 추가하고 추가한 정보의 네이밍으로 연결하는방법과

  TNSNAMES.ora 추가없이 생성시 바로 정보를 넣는 방법 두가지가 있는데... 두번째 방법이 쉽고 편하늬까 그걸로...

 

  SQL> CREATE DATABASE LINK 'DB링크 별칭'

           CONNECT TO 'DB링크 접속 ID'

           IDENTIFIED BY 'DB링크 접속 PASSWORD'

           USING 'DB 접속정보'

 

  EX-SQL> CREATE DATABASE LINK DB_LINK_TEST

                CONNECT TO DANIEL

                IDENTIFIED BY DANIEL

                USING '(DESCRIPTION=
                                 (ADDRESS=
                                 (PROTOCOL=TCP)
                                 (HOST=98.28.5.111)
                                 (PORT=1521)
                            )
                                 (CONNECT_DATA=
                                 (SERVER=dedicated)
                                 (SERVICE_NAME=DANIEL)
                            )
                          )';

 

- DB LINK 사용

SQL> SELECT * FROM TABLE명@DB_LINK

 

- DB LINK 삭제

SQL> DROP DATABASE LINK DB_LINK명

- 한글을 체크하는 함수

var koreanCharCheck = function(inputStr) {

for( var i = 0; inputStr.length; i++ ) {

var checkChar = inputStr.charCodeAt(i);

// 한글체크부분 하위 if 문에서 true 이면 한글이 포함되어 있는것이다.

if( (0xAC00 <= checkChar && checkChar <= 0xD7A3) || (0x3131 <= checkChar && checkChar <= 0x318E) ) {

alert('한글은 입력하실수 없습니다.');

return false;

}

}

}

 

- 한글입력을 막는 임의의 스크립트

- JQuery Form 에서의 입력값을 검증하다가 Type 이 'undefined' 이면 당황한다...

  DatePicker 의 입력값을 확인하려고

  $('#DatePickerVal').val() 해서 Null 체크하니 'undefined' 가 뜬다.. 비교를 못한다. Null 확인도 못한다. 당황했다.

 

if( jQuery.type(입력값) === 'undefined' ) {

alert('값을 입력하세요.');

return false;

}

모 이런식으로 대처하면 된다.

jQuery( document ).ready( function(){

        var head = document.getElementsByTagName('head')[0];

        var nProtect = document.createElement('script');

        nProtect.type = 'text/javascript';

        nProtect.async = true;

        nProtect.src = 'https://supdate.nprotect.net/nprotect2007/keycrypt/arisu/npkfx.js';

        head.appendChild(nProtect);

});


실제 개발에 반영한 소스를 그대로 옮긴것. 참고해서 사용하면 될 듯

.ready() 되면 무조건 실행이 되고 있고, 상황 별로 하라면 .ready() 안에 있는 스크립트 내용을 function() 으로 만들고

.ready() 에서 분기별로 호출하는 식으로 변경하면 된다.


위에서는 nProtect.src 에서 호출한 .js 가 자동으로 브라우져체크해서 실행여부를 판단하므로, 나는 그냥 호출만 했다..

저건 키보드보안 모듈 설치하는거..;

 


+ Recent posts