본문 바로가기

Java

[Java] 제네릭 1.1 왜 제네릭을 사용해야 하는가? 컴파일 시 강한 타입 체크를 할 수 있다. 실행 시 타입 에러가 나는 것보다는 컴파일 시에 미리 타입을 강하게 체크해서 에러를 사전에 방지하는 것이 좋다. 타입 변환(casting)을 제거한다. 비제네릭 코드는 불필요한 타입 변환을 하기 때문에 프로그램 성능에 악영향을 미친다. 1.2 제네릭 타입을 살펴보자 제네릭 타입은 타입을 파라미터로 가지는 클래스를 말한다. 타입을 파라미터로 가진다는 말이 무슨말일까? 다음 예시를 보자. 다음과 같이 필드 타입을 Object로 가지고 있는 Main 메소드가 있다. class Box { private Object object; public void set(Object object) { this.object = object; } p.. 더보기
[Java] StringBuffer, StringBuilder 클래스 문자열을 저장하는 String은 내부의 문자열을 수정할 수 없다. 예를 들어 String의 replace() 메소드는 내부의 문자를 대치하는 것이 아니라, 대치된 새로운 문자열을 리턴한다. String 객체를 + 연산할 경우에도 마찬가지다. String data = "ABC"; data += "DEF"; String 객체는 내부 데이터를 수정할 수 없으므로 "ABC" 에 "DEF" 가 추가된 "ABCDEF" 라는 새로운 String 객체가 생성된다. 그리고 data 변수는 새로 생성된 String 객체를 참조하게 된다. 문자열을 결합하는 + 연산자를 많이 사용할수록 그만큼 String 객체의 수가 늘어나기 때문에 프로그램 성능을 느리게 하는 요인이 된다. 문자열을 변경하는 작업이 많을 경우에는 Strin.. 더보기
상대방의 소스를 받았는데 한글이 깨지는 경우 (Encoding 깨짐 현상) Window를 쓰고 있는 상대방의 소스를 Mac을 쓰고 있는 내가 받았더니 한글이 깨졌다. 물론, Encoding은 OS와 상관이 없다. 하지만 Window의 경우, 보통 이클립스나 sts.. 등 기본 인코딩이 MS949 로 되어 있는 경우가 있다. 사용자가 직접 UTF-8로 바꾸지 않는 이상, MS949 인코딩으로 저장되는 것이다. 이 경우, 우리는 소스 파일을 받고 어디서 고쳐줘야 할까? 프로젝트 우클릭 > Properties > Resource > MS949 (선택지에 없다면 직접 입력) 그리고 우리가 앞으로 작성할 코드가 UTF-8로 저장되게 하기 위해서는 Window > Preferences > Workspace > Text file encoding > UTF-8 로 지정해져 있는지 확인하자 더보기
[Java] StringTokenizer 사용법 문자열이 특정 구분자(delimiter)로 연결되어 있을 경우, 구분자를 기준으로 부분 문자열을 분리하기 위해서는 다음 두가지 방법이 있다. String의 split() 메소드 이용 java.util 패키지의 StringTokenizer 클래스 이용 ① split() 메소드 사용법 String 클래스의 split() 메소드는 다음과 같이 호출되는데, 정규 표현식을 구분자로 해서 문자열을 분리한 후, 배열에 저장하고 리턴한다. String[] result = "문자열".split("정규표현식"); 다음과 같은 문자열 중 &, 쉼표(,) , - 를 제외하고 사람 이름만 따로 뽑아내고 싶을 경우, 홍길동&이수홍,박연수,김자바-최명호 &, 쉼표(,), -를 파이프(|) 기호로 연결한 정규 표현식을 매개값으로 제.. 더보기
[Java] BufferedInputStream 와 BufferedReader 프로그램의 실행 성능은 입출력이 가장 늦은 장치를 따라간다. CPU와 메모리가 아무리 뛰어나도 하드 디스크의 입출력이 늦어지면 프로그램의 실행 성능은 하드 디스크의 처리 속도에 맞춰진다. 네트워크로 데이터를 전송할 때도 마찬가지다. 느린 네트워크 환경이라면 컴퓨터 사양이 아무리 좋아도 메신저와 게임의 속도는 느릴 수밖에 없다. 이 문제에 대한 완전한 해결책은 될 수 없지만, 프로그램이 입출력 소스와 직접 작업하지 않고 중간에 메모리 버퍼(buffer)와 작업함으로써 실행 성능을 향상시킬 수 있다. 예를 들어 프로그램은 직접 하드 디스크에 데이터를 보내지 않고 메모리 버퍼에 데이터를 보냄으로써 쓰기 속도가 향상된다. 버퍼는 데이터가 쌓이기를 기다렸다가 꽉 차게 되면 데이터를 한꺼번에 하드디스크로 보냄으로써.. 더보기
문자열 비교가 안되는 경우 해결 방법 (==, equals 이용) == 을 이용했는데도 문자열 비교가 되지 않을 때가 있다. 왜 일까? 다음 예에서 map.get("TYPE")은 분명 "A"를 담고 있는데도 말이다. Map map = new HashMap(); map.put("TYPE","A"); if(map.get("TYPE") == "A") { // 들어오지 않는다. } 기본 타입 변수간의 == 연산자는 단순히 변수의 값이 같은지, 아닌지를 조사하지만 참조 타입 변수들 간의 == 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용된다. 참조 타입 변수의 값은 힙 영역의 객체 주소이므로 결국 주소 값을 비교하는 것이 된다. 동일한 주소 값을 갖고 있다는 것은 동일한 객체를 참조한다는 의미이다. 위의 예에서 map은 Map 타입 변수이므로 참조 타.. 더보기
이클립스 성능개선 및 Validation 최적화 설정 1. 최소,최대 힙 메모리영역 동일하게 맞추기 eclipse.ini 파일을 열어 -Xms는 최소 힙메모리영역으로 -Xms1024m로 설정합니다. -Xmx는 최대 힙메모리영역으로 -Xmx1024m로 설정합니다. -Xms와 -Xmx를 동일하게 설정하여 이클립스에서 메모리를 유동적으로 관리하지 못하도록 설정하여 메모리 누수를 차단합니다. ( -> 속도향상!) 2. 힙 메모리 상태 표시 Window > Preferences > General 에 들어가서 Show heap status 체크 이클립스 오른쪽 하단에 힙 메모리를 확인할 수 있는 영역이 생겼습니다. 이클립스가 버벅거릴 경우 휴지통을 클릭하면 조금 더 향상된 속도가 제공됩니다. 3. Spelling Checking 해제 Window > Preferenc.. 더보기
이클립스 Permgen space 에러 해결하기 java.lang.OutOfMemoryError : PermGen space 에러 해결법 다음과 같이 PermGen space 에러가 나는 경우가 있다. 말 그대로 메모리가 부족해서 나는 에러이다. Window > Preferences > Java > Installed JREs 클릭 Edit을 눌러 Default VM arguments에 -XX:MaxPermSize=512m 을 입력해준다. 이건 최대 Permanent Generation size를 의미하며, Out of Memory 오류 발생 시 size 조절을 해주면 되는 영역이다. 더보기