라벨이 JAVA인 게시물 표시

(Java) EnumMap vs HashMap

*enumMap의 index 는 Enum의 내부 순서를 이용하므로 hashMap의 Hashing을 통한 index보다 효율적이다. HashMap의 경우 일정한 이상의 자료가 저장 되면, 자체적으로 resizing을 한다. 그로 인해 성능저하가 발생한다. 그러나 EnumMap은 Enum의 갯수로 제한하므로 Resizing에 대한 성능저하가 없다. put/get에 있어서 O(1)의 복잡도를 보장한다.

(Java) 중첩 클래스 (자바 4대 중첩 클래스)

이미지
1. 중첩 클래스( Inner Class) ->하나의 클래스 내부에 또 다른 클래스가 내포되어 있는 상태(클래스 관리의 효율을 높임) *특징 -중첩되는 클래스는 하나 이상 가능. -Outer 클래스 멤버를 Inner 클래스에서 사용가능 -Outer 클래스에서 Inner 클래스 멤버 사용불가능 (사용하고 싶으면 객체를 직접 발생시켜야함) - 일반 중첩 클래스 내부에서는 static과 관련된 멤버를 선언할 수 없음 예)    Class Outer{       내용부:       class Inner{         내용부:       }    } } * 중첩 클래스 객체 생성 Outer 객체 1=new Outer(); Outer.Inner 객체2=객체1.new Inner(); 2. 정적 중첩 클래스 (Static Inner Class) *정의 - 중첩 클래스 내부에서 static과 관련된 멤버를 선언할 수 있는 클래스. *특징 - 클래스의 이름 앞에 static 예약어가 붙음 - static의 특성상 객체를 독립적으로 만들 수 있음 - static멤버를 선언할 수 있고, static 메소드도 만들어 사용할 수 있음. - Outer 클래스의 static멤버만 Inner에서 사용할 수 있음 *형식 class Outer{     내용부:       static class Inner{         내용부:       } } *객체 생성 방법   Outer.Inner 객체 = new Outer.Inner();     -  Outer 클래스의 객체가 없어도 Inner ...

(Java) Java 중요한 개념

1. 객체지향 설명 2. static 설명 3. 가비지컬렉션 원리 설명 4. 그러면 가비지 컬렉션말고 프로그래머가 메모리 관리를 어떻게 할 수 있는지 설명하라(weaked해쉬맵???같은것??) 5. 리플렉션에 대해 알기 6. Wrapper Class란 무엇인가?

(Java) 리플렉션

*리플렉션이란? 객체를 통해 클래스의 정보를 분석해내는 기법이다. 스프링을 공부하다보면 BeanFactory라는 Spring Container개념을 학습하게 된다. 이 BeanFactory는 애플리케이션이 실행한 후 객체가 호출될 당시 객체의 인스턴스를 생성하게 되는데 그때 필요한 기술이 Reflection 이다. 자바는 스크립트 언어가 아닌 컴파일 언어이다. 물론 .java-> .class-> 실행 이라는 2단계의 메커니즘을 가지고 있지만, 컴파일 언어로 분리하는게 옳다. 원래 자바에서는 동적으로 객체를 생성하는 기술이 없었다. 그리고 동적으로 인스턴스를 생성하는 Reflection으로 그 역할을 대신하게 된다. 가정을 해보면, 만약 객체의 메모리만을 알고 있고, 그리고 객체의 형태에 대해 모른다고 생생각해보자. 리플렉션으로 형은 알고 있지만, 형변환을 할 수 없는 상태에서 객체의 메소드를 호출할 수 있다. Class c=Data.class; //Class c=Class.forName("클래스 이름"); Method[] m=c.getMethods(); Field[] f=c.getFields(); Constructor[] cs=c.getConstructor(); Class[] inter=c.getInterfaces(); Class superClass=c.getSuperClass();

(자바) HashTable, HashMap, ConcurrentHashMap

일단 ConcurrentHashMap 과 HashMap 의 차이점은 다 알고 있다는 전제하에 포스팅을 작성 한다. 이 포스팅을 하게된 이유는 사실 어떤분이 나에게 ConcurrentHashMap 과 HashMap 의 차이점을 아냐고 물어봤고 물론 알고 있어서 쏼라쏼라 대답을 했지만 (Multi-Threaded 환경에서 thread safe 여부) 거기에서 끝나지 않고 또 물어보시더라 ConcurrentHashMap 이 왜 Thread 에 safe 한지? 어떤 원리인지 아세요? 그래서 나는 사실 정확하게 알진 못했지만 대략 MySQL 의 innodb 처럼 row-level lock 걸듯이 접근하고 있는 해당 Key 값에 lock을 걸지 않을까요? 라고 대답을 했다. 이 대답은 후에 찾아 보니 반은 맞고 반은 틀리더라… 그리고 다시한번 정확하게 정리한다.. —————————————————————————————————— 보통은 우리가 Multi-threaded 환경에서 key-value 저장소가 필요할때 자바에서 사용하는 것이 크게 1. HashTable 2. HashMap 3. ConcurrentHashMap 이렇게 있는데 파악을 하기 위해서 각 자바 source 를 까보았다. 가장 중요한 Get, Set 부분만 보면 1. HashTable public synchronized V More ...get(Object key) public synchronized V More ...put(K key, V value) 보이는가? 메소드 레벨에서 synchronized 를 걸어 버린다. 2. HashMap 얘는 볼것도 없이 synchronized 가 없다. 따라서 속도는 빠르지만 Multi-threaded 환경에서 그냥 쓰면 여러 Thread 에서 동시 접근시 Exception 이 난다. 3. ConcurrentHashMap 얘는 특이하게 synchronized 가 아니라 lock 을 사용한다. V More .....

(자바) System.out.println(참조변수)의 String자동 호출 원리

자바에서는 Card c=new Card(); System.out.println(c)와 System.out.println(c.toString())과 같다. 그 이유는 PrintStreamClass에는 print메소드가 있다. public void print(Object obj){    write(String.valueOf(obj)); } public static String valueOf(Object ob){      return (obj==null)?:"null":obj.toString(); }

(Java) 객체 직렬화

객체 스트림은 프로그램 메모리 상에 존재하는 객체를 직접 입출력 해 줄 수있는 스트림으로 현재 상태를 보존하기 위한 영속성을 지원할 수 있다. 자바에서 객체 안에 저장되어 있는 내용을 파일로 저장하거나 네트워크를 통ㅎ여 다른곳으로 전송하려면 객체를 바이트 형태로 일일이 분해해야 한다.이를위하여 객체를 직접 입출력 할 수 있도도록 해주는 것이 객체 스트림이다. 1. 객체 전송의 단계 객체를 분해하여 전송하기 위해서는 직렬화(Serialization) 되어야 한다. 객체를 전송하기 위해서는 3가지 단계를 거친다. (1) 직렬화된 객체를 바이트 단위로 분해한다. (marshalling) (2) 직렬화 되어 분해된 데이터를 순서에 따라 전송한다. (3) 전송 받은 데이터를 원래대로 복구한다. (unmarshalling) 2. 마샬링 (marshalling) 마샬링(marshalling)은 데이터를 바이트의 덩어리로 만들어 스트림에 보낼 수 있는 형태로 바꾸는 변환 작업을 뜻한다. 자바에서 마샬링을 적용할 수 있는 데이터는 원시 자료형(boolean, char, byte, short, int, long, float, double)와 객체 중에서 Serializable 인터페이스를 구현한 클래스로 만들어진 객체이다. 객체는 원시 자료형과 달리 일정한 크기를 가지지 않고 객체 내부의 멤버 변수가 다르기 때문에 크기가 천차만별로 달라진다. 이런 문제점을 처리할 수 있는게 ObjectOutputStream 클래스이다. 3. 직렬화 (Serializable) 마샬링으로 바이트로 분해된 객체는 스트림을 통해서 나갈 수 있는 준비가 되었다. 앞에서 언급한대로 객체를 마샬링하기 위해서는 Serializable 인터페이스를 구현한 클래스로 만들어진 객체에 한해서만 마샬링이 진행될 수 있다. Serializable 인터페이스는 아무런 메소드가 없고 단순히 자바 버추얼 머신에게 정보를 전달하...

(자바) HashSet의 커스텀 클래스 중복 제거 하기!

커스텀 클래스의 중복여부는 클래스 내부안에 hashCode와 equasl메소드를 생성해 주어야 한다. 예) HashSet<Node> hm=new HashSet(); //x,y좌표를 가지고 있는 노드 class Node { int x; int y; Node(int x,int y) { this.x=x; this.y=y; } @Override public int hashCode() { return Integer.toString(x).hashCode()+Integer.toString(y).hashCode(); } @Override public boolean equals(Object o) { if(o==null) return false; Node temp=(Node) o; if(temp.x==this.x && temp.y==this.y) return true; else return false; } }

(자바) atan2(아크탄젠트) , asin(아크사인 함수)

아크탄젠트 아크탄젠트는 탄젠트의  역함수 로 대변과 인접변의 비율( y증가량/x증가량 )을 이용해 라디안 각도를 구할 수 있다. 자바스크립트에서는  Math.atan() ,  Math.atan2()  2개의 함수가 있다.  Math.atan(y/x) 의 경우 반환 값의 범위가 -π/2 부터 +π/2 사이로 180도 범위만 구할수 있다. 하지만  Math.atan2(y,x)  함수를 사용하면 -π 부터 +π 사이의 받환 값을 얻을 수 있으므로 360도 범위 전체를 구할 수가 있게 된다. 아크탄젠트는 간단하게 설명할 수 있는 함수가 아니다. 테일러급수를 통해서 근사치를 구할 수 있다고 하지만 범위가 너무 커지기에 여기서는 다루지 않는다. 사실, 잘 모른다. 참고: http://gamedev.stackexchange.com/questions/14602/what-are-atan-and-atan2-used-for-in-games

(java) Arrays.fill 이중배열 채우기

double [][] matrix = new double [ 20 ][ 4 ]; // Fill each row with 1.0 for ( double [] row : matrix ) Arrays . fill ( row , 1.0 );

(Java) 쉬프트 연산자

○ 논리합(or) | 각 비트를 비교하여 어느 한쪽이 1 이면 1, 그렇지 않으면 0 을 반환한다. a = 170, b = 245 일때 a   = 1 0 1 0 1 0 1 0 b   = 1 1 1 1 0 1 0 1 a|b = 1 1 1 1 1 1 1 1 10진수로 바꾸면 255 가 된다. 출처: [java] 비트 연산자와 시프트 연산자 <시프트 연산자> 비트 열을 좌우로 지시한 만큼 이동시키는(shift) 연산자를 말한다. C 에도 시프트 연산자가 있는데, C 에는 >> 과 << 만 있으나, 자바에는 추가적으로 >>> 연산자도 있다. ○ 왼쪽 시프트 연산자 << 178 << 2 : 178 의 이진코드를 왼쪽으로 2비트 시프트 한다.   10110010 1011001000 왼쪽으로 두칸 밀면서, 비게 되는 오른쪽 두칸은 0 으로 채운다. 그런데, 문제는 왼쪽으로 밀면서 기존의 크기를 넘어서기 때문에 왼쪽으로 넘어선 2개의 비트는 삭제된다. 따라서, 10110010 을 왼쪽으로 밀면 왼쪽 두개 비트인 10 은 삭제되고, 오른쪽의 2개 비트는 0으로 채워져 결과값은 11001000 이 된다. ○ 오른쪽 시프트 연산자 >> 178 >> 2 : 178의 이진코드를 오른쪽으로 2 비트 시프트 한다. 10110010 1110110010 오른쪽으로 2비트 이동한후, 비게되는 왼쪽의 2개비트는 1로 채워지고, 오른쪽에서 2비트 넘어간 부분은 삭제된다. 따라서, 10110010 을 오른쪽으로 2비트 시프트하면, 11101100 이 된다. 그런데, 주의할점은, 오른쪽으로 밀면서 왼쪽에 비게되는 비트부분이 무조건 1 로 채워지는 것이 아니라, 밀기전의 최초 첫째자리 값과 동일한 값으로 채워진다는 것이다. 여기에서는 밀기전의 첫째자리값이 1 이었으므로, 1 로 채워진 것이다. ○ 논리 오른쪽 시프트 연산자 ...

(Java) 1로 설정된 비트의 수를 반환하는 함수 작성

http://namocom.tistory.com/377 참고 할 것

(Java) HashMap 정리

HashMap이란 Map인터페이스의 한종류로써 Key와 Value 값으로 데이터를 저장하는 형태를 가지고 있습니다. 그러면 가만, Map이란 녀석을 무엇일까요? Map이란 놈은 키(Key) , 값(Value) 을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스들을 구현하는 데 사용 되는 녀석 입니다. 쉽게 말해 key, value 값으로 저장하는 List 형태의 조상이라고 생각 하시면 됩니다. Map에 종류에는 Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap 등이 있습니다. 역시 이들 객체들 또한 key, value로 데이터를 저장하게 됩니다. 그 중에서 오늘은 HashMap에 대해서 다뤄 볼껀데요. HashMap또한 Map인터페이스를 구현한 녀석이기 때문에 Map의 속성을 모두 가지고 있고, 저장 방식 또한 동일 합니다. 그리고 해싱(hashing)이란 검색 방법을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보여줍니다. HashMap에서 한가지 주의 하실 점이 map에 데이터를 등록할 때 , key값은 중복이 되지 않고 , value값은 중복이 허용된다는 점입니다. 예를들어, map.put("사자","스피트90"); map.put("곰","힘100"); map.put("사자","힘80"); (최종 사자는 힘 80으로 저장된다) public class TestHashMap { public static void main(String[] args) {                     // HashMap에 Data 넣기 (Key , Value) 형태    HashMap<String , Integer> map = new HashMap<String , Integer>(); map.put("김태희...

(Java) SET -> ArrayList

import java . util . HashSet ; import java . util . List ; import java . util . ArrayList ; class ConvertHashSetToArrayList { public static void main ( String [] args ) { // Create a HashSet HashSet < String > hset = new HashSet < String >(); //add elements to HashSet hset . add ( "Steve" ); hset . add ( "Matt" ); hset . add ( "Govinda" ); hset . add ( "John" ); hset . add ( "Tommy" ); // Displaying HashSet elements System . out . println ( "HashSet contains: " + hset ); // Creating a List of HashSet elements List < String > list = new ArrayList < String >( hset ); // Displaying ArrayList elements System . out . println ( "ArrayList contains: " + list ); } }

(Java)문자열(String)을 쉬프트 하는 방법 (right shift) ,(left shift)

//////////////////RIGHT SHIFT public static void main(String[] args) throws UnsupportedEncodingException{ shift("010000",3); } public final static void shift(String str,int size) { byte[] orgByte=null; byte[] resultByte=new byte[str.length()]; orgByte=str.getBytes(); int strlen=orgByte.length; for(int i=0;i<strlen;i++){ resultByte[(i+size)%strlen]=orgByte[i]; } String result=null; result=new String(resultByte); System.out.println(result); } //LEFT SHFIT public final static void left_shift(String str,int size) throws UnsupportedEncodingException{ byte[] orgByte=null; byte[] resultByte=new byte[str.length()]; orgByte=str.getBytes("ASCII"); String s="0"; byte []a=s.getBytes("ASCII"); int strlen=orgByte.length; for(int i=1;i<strlen;i++){ resultByte[(i-size)%strlen]=orgByte[i]; if(i==strlen-1){ resultByte[i]=a[0]; } } String result=null; re...

NumberFormat으로 자릿수 맞추기

숫자를 출력할때는 자릿수를 맞추어야 할 경우가 있습니다. 3자리 숫자를 표시할때 앞에 0을 붙인다던가 3자리마다 콤마를 넣는다던가... 이런경우 NumberFormat을 사용하면 좀더 편하게 자릿수를 표현할 수 있습니다 단, 자릿수를 맞추는 것은 void메소드 형이기 때문에 출력만 가능하다 public static void main(String[] args) {   int a=1;   int b=13;     NumberFormat numformat=NumberFormat.getIntegerInstance(); //3자리 표현 numformat.setMinimumIntegerDigits(3); System.out.println(numformat.format(a)); }

HashMap의 Comparator 이용하기.

리스트 같은 경우는 그냥 Comparator를 사용하면 되지만 Map같은 경우는 List로 바꾸어 준 후 리턴 받아 바꾸어 주는게 좋다. 예) main(){  HashMap<String,Integer> hm=new HashMap<String,Integer>(); Iterator iterator=SortByValue(hm).iterator();  while(iterator.hasNext()){     String temp = (String) iterator.next();             System.out.println(temp + "  " + hm.get(temp));    } } private static List SortByValue(HashMap map) {     List<String> list=new ArrayList<String>();     list.addAll(map.keySet());      Collection.sort(list,new Comparator(){      public int compare(Object o1,Object o2)     {          Object v1=map.get(o1);          Object v2=map.get(o2);          return ((Comparable) v1).compareTo(v2);     }     } }

String 클래스 정리

1) toLowerCase ->문자열에서 대문자를 소문자로 바꾼다. 예)String str="ABC"     String toLower=str.toLowerCase();     결과: abc 2)toUpperCase ->문자열에서 소문자를 대문자로 바꾼다.     String str="abc"     String toLower=str.toUpperCase();     결과: ABC 3)concat ->문자와 문자를 결합해준다.   String str="Korea"   Sting str2="is fighting"   String concat=str.concat(str2);  결과:Korea is fighting 4)replace ->문자열에 지정한 문자" "가 있으면 새로 지정한 문자" "로 바꾸어 출력한다    String str="A*B*C*D"    String replace=str.replace("*","-");   결과: A-B-C-D -->>만약 여러개를 한번에 바꾸고 싶으면 연결 해 붙인다. .예)input.replace(".","").replace("!", "").replace(",", ""); 5)replaceall(정규표현식이 무엇인지는 정규표현식 글 참고) ->정규 표현식을 지정한 문자로 바꾸어 출력한다 String str = "AB CD" ; String replaceAll = str.replaceAll( "\\p{Space}" , "*" ); System.out.println( "replaceAll: ...