분류 전체보기
- 디자인 패턴 소개. 2019.02.03
- CHAPTER 11 2019.01.31
- 개발/운영 설정파일 개념. 2019.01.31
- 해당 디렉토리 트리에서 심볼릭링크 찾기 2019.01.31
- CHAPTER 9 2019.01.29
- jquery event에 parameter를 전달하고자 할 때 2019.01.24
- CHAPTER5~CHAPTER7 2019.01.21
- encoding 별로 JAVA 문자열 byte단위로 자르기 2018.08.13
- HttpsURLConnection 으로 Http통신할 때 오류 메세지 잡아내기 2018.05.30
- opener를 사용하지 못할 때 2018.04.12
디자인 패턴 소개.
1. 디자인원칙
1.1 어플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리 시킨다.
-> 달라지는 부분을 찾아서 나머지 코드에 영향을 주지 않도록 "캡슐화"합니다.
1.2 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
1.3 상속보다는 구성을 활용한다.
'디자인패턴' 카테고리의 다른 글
옵저버패턴(Observer Pattern) (0) | 2019.02.10 |
---|---|
스트래티지 패턴(strategy pattern) (0) | 2019.02.03 |
CHAPTER 11
1. List 인터페이스
List인터페이스는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현
1-1. ArrayList
- 연속적
- remove메서드는 끝에서부터 하는게 효율적 -> 처음이나 중간 값을 remove하면 해당 Index를 채워넣기 위해 System.arrayCopy가 호출되어야 하므로 비효율적이다.
1-2 LinkedList
- 불연속적
- 배열의 중간에 추가 혹은 삭제할 경우의 비효율성을 보완하기 위해 만들어짐
- 배열의 중간에 추가 혹은 삭제할 경우에 다음 노드의 주소값을 변경하기만 하면 돼서 효율적이다.
- 더블 링크드 리스트 : 단방향리스트는 이전요소에 대한 접근이 힘들기 때문에 이전/다음의 노드 주소값을 갖고 있다.
- 더블 써큘러 링크드 리스트 : 더블 링크드 리스트에서 처음과 끝을 이어준다.
- LinkedList클래스는 '더블 링크드 리스트'로 구현되어 있음!
컬렉션 | 읽기(접근시간) | 추가 / 삭제 | 비고 |
ArrayList | 빠르다 | 느리다 | 순차적인 추가삭제는 더 빠름 비효율적인 메모리 사용 |
LinkedList | 느리다 | 빠르다 | 데이터가 많을수록 접근성이 떨어진다. |
- 데이터의 개수가 변하지 않는 경우 : ArrayList
- 데이터 개수의 변경이 잦다면 : LinkedList
- 두 클래스의 장점을 이용해서 두 클래스를 조합해서 사용하는 방법도 있음.
ArrayList al = new ArrayList(100000); for(int i=0;i<100000;i++) al.add(i); LinkedList ll = new LinkedList(al); for(int i=0;i<100000;i++) ll.add(500,"X");
2. Set 인터페이스
Set인터페이스는 중복을 허용하지 않고 저장순서가 유지되지 않는 클래스를 구현
3. Map 인터페이스
Map인터페이스는 Key와 Value를 하나의 쌍으로 묶어서 저장하는 컬렉션
Key는 중복이 허용되지 않고 Value는 중복이 허용된다.
메서드 |
설 명 |
boolean containsKey(Object key) |
지정된 key객체와 일치하는 Map의 key 객체가 있는지 확인 |
boolean containsValue(Object value) |
지정된 value객체와 일치하는 Map의 value 객체가 있는지 확인 |
Set entrySet() |
Map에 저장되어 있는 key-value쌍을 Map.Entry타입의 객체로 저장한 Set으로 반환 |
Set keySet() |
Map에 저장된 모든 key객체를 반환한다. |
Collection values() |
Map에 저장된 모든 value객체를 반환한다. |
values()에서는 반환타입이 Collection이고, keySet의 반환타입이 Set인거에 주목하자.
key는 중복을 허용하지 않기 때문에 Set / value는 중복을 허용하기 때문에 Collection 반환
3-1. Map.Entry 인터페이스
Map.Entry 인터페이스는 Map 인터페이스의 내부 인터페이스 이다.
Map에 저장되는 key-value쌍을 다루기 위해 내부적으로 정의해놓았다.
메서드 |
설 명 |
boolean equals(Object o) |
동일한 Entry인지 비교한다. |
Object getKey() |
Entry의 key객체를 반환한다. |
Object getValue() |
Entry의 value객체를 반환한다. |
int hashCode() |
Entry의 해시코드를 반환한다. |
Object setValue(Object value) |
Entry의 value객체를 지정된 객체로 바꾼다. |
'자바의정석' 카테고리의 다른 글
CHAPTER 9 (0) | 2019.01.29 |
---|---|
CHAPTER5~CHAPTER7 (0) | 2019.01.21 |
개발/운영 설정파일 개념.
개발/운영 설정파일은 따로 관리해서 원소스로 가는게 좋다.
1. was기동시 개발/운영서버에 D옵션을 각각 설정해준다.
2. 개발 : DSERVER.ID=DEV / 운영 : DSERVER.ID=REAL
3. .prop 파일에서는 D옵션으로 개발, 운영 구분하여서 각각의 설정파일을 다른 걸 바라보게 한다.
4. 개발소스에서는 .prop의 설정key를 물고 와서 개발/운영이 원소스로 돌아가도록 개발한다.!
'경험, 느낀 점' 카테고리의 다른 글
poi-object-mapper 라이브러리를 사용하여 엑셀 데이터 바인딩하기 (0) | 2019.02.26 |
---|
해당 디렉토리 트리에서 심볼릭링크 찾기
- 해당 디렉토리 트리에서 심볼릭링크 찾기
find . -type l -printf "%p --> %l\n"
'Linux' 카테고리의 다른 글
Apache(웹서버) & Tomcat(WAS) 설치 및 연동 (0) | 2019.07.07 |
---|---|
Cent OS 7 설치 및 기본세팅 (0) | 2019.07.07 |
포트번호로 프로세스 찾기(WAS 포트 겹칠 때) (0) | 2019.02.22 |
crontab 설정 (0) | 2019.02.22 |
리눅스] BASH 쉘의 로그인 과정 (0) | 2019.02.22 |
CHAPTER 9
1.1 Object 클래스
1.2 String 클래스
1.2.1 변경 불가능한 클래스
String a = "a"; (주소값 : 0x100)
String b = "b"; (주소값 : 0x200)
a = a+b; (주소값 : 0x300) -> 새로운 주소값으로 변경 -> 메모리공간차지하므로 비효율적
위와 같은 케이스의 경우 StringBuffer클래스의 append 메서드를 이용하는게 효율적!
1.2.2 문자열 비교
public class StringEx1 { public static void main(String[] args) { String str1 = "abc"; // 문자열 리터럴 String str2 = "abc"; // 문자열 리터럴 String str3 = new String("abc"); String str4 = new String("abc"); if(str1==str2) System.out.println("1"); if(str1.equals(str2)) System.out.println("2"); if(str3==str4) System.out.println("3"); if(str3.equals(str4)) System.out.println("4"); if(str1==str3) System.out.println("5"); if(str1.equals(str3)) System.out.println("6"); } }
- 결과 값 : 1 2 4 6
1 : 주소값 같음
2 : 문자열 같음
3 : 주소값 다름
4 : 문자열 같음
5 : 주소값 다름
6 : 문자열 같음
- String 클래스에서
equals는 주소값 비교가 아닌 문자열 리터럴 비교
등가 연산자('==')는 주소값 비교
※ 참고사항 : 문자열리터럴은 동일한 주소를 가지며, 클래스가 로드될 때 JVM의 상수 풀(constant pool) 메모리 영역에 올라간다.
'자바의정석' 카테고리의 다른 글
CHAPTER 11 (0) | 2019.01.31 |
---|---|
CHAPTER5~CHAPTER7 (0) | 2019.01.21 |
jquery event에 parameter를 전달하고자 할 때
1. event 선언부
$(document).on("change","#PAY_TYPE",function (event,first_load) { if(first_load){ // true logic } else{ // false logic } });
2. event 호출부
$("#PAY_TYPE").trigger("change",[true]);
'Javascript' 카테고리의 다른 글
IE에서 iframe(레이어 팝업) reload 시에 input text 태그 미작동 오류 (0) | 2020.03.03 |
---|---|
jsp에서 jqery template을 사용할 때 (0) | 2019.02.18 |
opener를 사용하지 못할 때 (0) | 2018.04.12 |
파일다운로드 완료 시 로딩바 종료 (0) | 2017.08.24 |
CHAPTER5~CHAPTER7
5장 배열
1.5 배열의 복사
- 배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.
6장 객체지향프로그래밍
1.2 객체지향언어
1.2.1 객체지향언어의 주요 특징
1) 코드의 재사용성이 높다.
- 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
2) 코드의 관리가 용이하다.
- 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3) 신뢰성이 높은 프로그래밍을 가능하게 한다.
- 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며,
코드의 중복을 제거하여 코드의 불일치로 인한 오작동을 방지할 수 있다.
3. 변수와 메서드
3.1 선언위치에 따른 변수의 종류
class Variables { int iv; // 인스턴스 변수 static int cv; // 클래스변수(static 변수, 공유변수) void method() { int lv = 0; // 지역변수 } }
변수의 종류 |
선언위치 |
생성시기 |
클래스 변수 (class variable) |
클래스 영역 |
클래스가 메모리에 올라갈 때 |
인스턴스변수 (instance variable) |
인스턴스가 생성되었을 때 |
|
지역변수 (local variable) |
클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) |
변수 선언문이 수행되었을 때 |
3.2 클래스변수와 인스턴스 변수
- 인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스는 각기 다른 값을 갖지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.
3.7 JVM의 메모리 구조
3.7.1 메서드영역(method area)
- 프로그램 실행 중 사용되는 클래스에 대한 정보를 저장.
이 때 클래스의 클래스 변수도 이 영역에 함께 저장됨.
3.7.2 힙
- 프로그램 실행 중 생성되는 인스턴스에 대한 정보를 저장
3.7.3 호출스택
- 메서드의 작업에 필요한 메모리 공간을 제공.
메서드 안에 메서드를 호출할 경우 스택형식으로 쌓이며, 가장 마지막 호출 메서드부터 종료된다.
3.10 재귀호출
- 반복문에 비해 성능이 좋지 않다.
- 대신, 복잡한 로직 처리 요건을 하고자 할 때 반복문에 비해 간결하고 직관적이다.
- 따라서, 상황에 맞게 알아서 잘 사용해야 한다.
3.11 클래스 메서드와 인스턴스 메서드
- 인스턴스 메서드는 인스턴스 변수/메서드와 관련된 작업을 하는 메서드로 개발하여야 한다.
- 클래스 메서드는 인스턴스 변수/메서드와 관련이 없는 작업을 하는 메서드로 개발하여야 한다.
-> 클래스 메서드 내부에서 인스턴스 변수 조작 불가 && 인스턴스 메서드보다 성능이 더 빠르다.
-> 이미 메모리(Method Area)에 올라가 있기 때문
'자바의정석' 카테고리의 다른 글
CHAPTER 11 (0) | 2019.01.31 |
---|---|
CHAPTER 9 (0) | 2019.01.29 |
encoding 별로 JAVA 문자열 byte단위로 자르기
public String[] parseStringByBytes(String raw, int len, String encoding) {
if (raw == null)
return null;
String[] ary = null;
try {
// raw 의 byte
byte[] rawBytes = raw.getBytes(encoding);
int rawLength = rawBytes.length;
int index = 0;
int minus_byte_num = 0;
int offset = 0;
int hangul_byte_num = encoding.equals("UTF-8") ? 3 : 2;
if (rawLength > len) {
int aryLength = (rawLength / len) + (rawLength % len != 0 ? 1 : 0);
ary = new String[aryLength];
for (int i = 0; i < aryLength; i++) {
minus_byte_num = 0;
offset = len;
if (index + offset > rawBytes.length) {
offset = rawBytes.length - index;
}
for (int j = 0; j < offset; j++) {
if (((int) rawBytes[index + j] & 0x80) != 0) {
minus_byte_num++;
}
}
if (minus_byte_num % hangul_byte_num != 0) {
offset -= minus_byte_num % hangul_byte_num;
}
ary[i] = new String(rawBytes, index, offset, encoding);
index += offset;
}
} else {
ary = new String[] { raw };
}
} catch (Exception e) {
}
return ary;
}
출처 : http://blog.naver.com/PostView.nhn?blogId=nackhwa7&logNo=140103352320
'Java' 카테고리의 다른 글
HttpsURLConnection 으로 Http통신할 때 오류 메세지 잡아내기 (0) | 2018.05.30 |
---|---|
클래스로더 오류 관련 (0) | 2018.02.19 |
HttpsURLConnection 으로 Http통신할 때 오류 메세지 잡아내기
#URL호출 서버에서 response 오류 발생하였을 때, con.getInputStream()에서 IOException이 발생 : 뿌려주는 오류 메세지를 잡지 못함
HttpsURLConnection con = (HttpsURLConnection)connectUrl.openConnection();
.....
InputStreamReader ir = new InputStreamReader(con.getInputStream(), charSet);
# 이를 해결하고자 오류가 발생했을 경우(con.getResponseCode()가 400 이상일 경우) con.getErrorStream()으로 받는다.
HttpsURLConnection con = (HttpsURLConnection)connectUrl.openConnection();
....
// SERVER ERROR CHECK
if(con.getResponseCode() < HttpsURLConnection.HTTP_BAD_REQUEST){
/* not error from server : con.getInputStream() */
ir = new InputStreamReader(con.getInputStream(), charSet);
postRes = new BufferedReader(ir);
while ((resultJson = postRes.readLine()) != null){
resultBuffer.append(resultJson);
}
con.disconnect();
}else{
/* error from server : con.getErrorStream() */
ir = new InputStreamReader(con.getErrorStream(), charSet);
postRes = new BufferedReader(ir);
while ((resultJson = postRes.readLine()) != null){
resultBuffer.append(resultJson);
}
con.disconnect();
/* Exception 던지지 않으면 오류가 났음에도 불구하고 로직이 계속 진행되므로 Exception 던져서 오류가 났다는 것을 전달한다. */
throw new Exception(resultBuffer.toString());
}
어떤 오류가 발생 했는지 로그로 출력된다.
이 때 주의할 점은 오류가 발생했을 때 Exception을 반드시 던져주어야 한다. 만약 Exception을 던지지 않는다면 오류가 났음에도 불구하고 로직이 계속 진행되므로 오류가 났다는 것을 전달해주어야 한다.
'Java' 카테고리의 다른 글
encoding 별로 JAVA 문자열 byte단위로 자르기 (0) | 2018.08.13 |
---|---|
클래스로더 오류 관련 (0) | 2018.02.19 |
opener를 사용하지 못할 때
http://www.abc.com 이하 "abc"에서 http://www.xyz.com 이하 "xyz"을 window.open(); 형태로 팝업을 호출한 후
xyz(자식)에서 abc(부모)의 함수를 호출 하거나 파라미터에 접근하려고 할 경우
크로스도메인 보안 이슈로 opener로 접근을 하지 못한다. (팝업 호출 시 도메인주소가 달라져서 opener객체를 잃어버림)
오류로그 : Uncaught DOMException: Blocked a frame with origin "http://www.xyz.com" from accessing a cross-origin frame.
이 때 해결방법이 2가지가 있다.
1. postMessage를 사용할 수 있다.(이 경우 IE 8 부터 지원된다)
2. iframe을 사용하여 abc(부모)아래에 xyz(자식)의 jsp호출 후 호출한 iframe영역에서 팝업창을 띄우면 된다. (팝업 창에서는 opener.parent.으로 접근하면 된다)
예제 소스 정리는 나중에 해서 업로드 하자.......! 지금은 바쁘다!
'Javascript' 카테고리의 다른 글
IE에서 iframe(레이어 팝업) reload 시에 input text 태그 미작동 오류 (0) | 2020.03.03 |
---|---|
jsp에서 jqery template을 사용할 때 (0) | 2019.02.18 |
jquery event에 parameter를 전달하고자 할 때 (0) | 2019.01.24 |
파일다운로드 완료 시 로딩바 종료 (0) | 2017.08.24 |