HashMap은 key 와 value 쌍으로 존재하는 


자료구조이다.


프로그래머가 key값을 알고 있는 상태에서 쓰는 경우도 있지만,


프로그래머가 동적으로 구한 데이터를 key, value 쌍으로 


HashMap을 쓴 경우는 프로그래머도 key 값이 무엇이 들어갔는지 알 수가 없다.


arrayList 처럼 index 가 정해져 있는것도 아니라


순차적으로 Log 에 찍어보기도 애매하다.


오늘 포스팅 내용은 이러한 상황에서 HashMap key값이 무엇이 있는지


구하는것이다.


HashMap 클래스 내부구조로 Set 자료구조에 key를 보관한 객체가 존재한다.


Set 객체를 통해 key를 가져오는 것이다. 


Set 객체에 들어있는 값(key)를 iterator 인터페이스를 통해, 순차적으로 탐색할 준비를한다.



HashMap<String,String> hashMap = new HashMap<>();

hashMap.put("key","value");


Set set = hashMap.keySet();

Iterator iterator = set.iterator();



가져온 후, iterator를 통해 순차탐색한다.


while(iterator.hasNext()){

  String key = (String)iterator.next();

  System.out.println("hashMap Key : " + key);

}


Entry 객체를 이용한 방법도 있다.


Entry 객체를 이용하면 key 와 value를 동시에 구할 수 있다.


물론 위에 코드로 key값을 구한 후, hashMap.get(key) 로 value를 구해도 상관없다.


Set set = hashMap.entrySet();

Iterator iterator = set.iterator();


while(iterator.hasNext()){

  Map.Entry entry = (Map.Entry)iterator.next();

  String key = (String)entry.getKey();

  String value = (String)entry.getValue();

  System.out.println("hashMap Key : " + key);

  System.out.println("hashMap Value : " + value);

}


주의할 점은 Set 자료형에 keySet() 을 넣은 경우와 entrySet() 경우를 잘 구별해서 이용 해야한다.




'Java' 카테고리의 다른 글

JAVA - [SWING] LinearLayout 사용하기.  (0) 2017.08.25
JAVA - DownCasting(다운캐스팅)  (25) 2016.08.27
JAVA - 변수 선언할때 m을 왜 붙일까?  (2) 2016.07.05
JAVA - UpCasting(업캐스팅)  (9) 2016.06.07
JAVA - Casting(캐스팅)  (0) 2016.05.26

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

아래의 코드를 보자.



public class Test{

  private Test mTest;

  public int add(int a, int b){

    int sum = a + b;

    return sum;

  }

}


Test 클래스의 변수엔 'm' 을 붙인 변수 mTest로 선언했고,


add메서드 안에 사용한 sum 변수는 m이 붙질 않았다.


라이브러리나, 가이드라인을 볼 시 많은 개발자들은 변수에 m을 붙이길래


궁금하여 찾아본 결과,


m은 Member의 약자라고 한다. 즉, 클래스의 멤버변수일시 m을 붙여줘 구분하는 것이였다.






'Java' 카테고리의 다른 글

JAVA - DownCasting(다운캐스팅)  (25) 2016.08.27
JAVA - HashMap key 구하기.  (1) 2016.08.25
JAVA - UpCasting(업캐스팅)  (9) 2016.06.07
JAVA - Casting(캐스팅)  (0) 2016.05.26
JAVA - ArrayList에서 배열로, 배열에서 ArrayList로  (2) 2016.04.25

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

저번 포스팅은 캐스팅에 관해 전반적으로 다루었다.


아래의 URL은 이전 포스팅 내용이다.


http://mommoo.tistory.com/40


이전 포스팅 내용을 요약하자면 아래와 같다.


자료형이 정해진 변수에 값을 넣을때는


변수가 원하는 정보를 하나도 빠짐 없이 다 넣어줘야 성립한다.



이전 포스팅은 기본형으로 캐스팅을 설명했다면,


이번 포스팅은 참조형으로 캐스팅을 설명하려 한다.


기본적으로 캐스팅은 서로 관련없는 데이터 끼리는 변환되지 않는다.


int a = (int) true;


boolean 자료형이랑 int 자료형이랑 은 서로 성질이 맞지 않는 데이터 이므로,


형변환이 안되는 것 이다.


참조형(자바에서는 클래스) 데이터 역시 마찬가지다. 


그렇다면 참조형 데이터가 서로 관련이 있다고 하는 것은 무얼 의미 하는 것일까?


아래와 같은 상황일 것이다.


1. 상속관계가 맺어진 경우.


2. 인터페이스로 인해 확장이 된 경우.



1번 경우인 상속관계를 통해 예시로 설명 하겠다.


class Parent , class Child extends Parent 클래스 가 있다고 가정하자.


Child 는 Parent 클래스를 상속 받으므로 Chiid 클래스가 Parent 클래스 보다 가지고 있는


데이터 양이 무조건 많다. 왜냐하면 Child 클래스는 적어도 Parent 클래스의 데이터를 가지고 있기 때문이다.



때문에 많은 이들이 두 클래스의 구식도를 표현 할때 는 위와 같이 많이 한다.


사람마다 틀리겠지만, 후에 업캐스팅 다운캐스팅 개념을 위해 위와 같이 알아 놓아야 한다.


클래스 데이터 즉, 참조형을 사용할때는 아래와 같이 쓴다.


Parent parent = new Parent();


Parent 데이터형인 parent 변수는 실제 데이터인 new Parent(); 란 인스턴스가 Parent 정보를 모두 가지고 있으므로


오류가 나지 않는다.


아래의 경우는 어떨까?


Parent parent = new Child();


윗 개념으로 생각해보자.


parent변수는 Parent 자료형 데이터 모두를 원한다.


new Child(); 라는 인스턴스는 Parent 자료형 데이터를 모두를 가지고 있을까?


대답은 Yes 이다. 왜냐하면 Child 클래스는 Parent 클래스를 상속 받았기 때문이다.


따라서 성립한다. 엄연히 말하자면 데이터형은 틀리므로 아래와 같이 형변환 기호를 붙여야 한다.


Parent parent = (Parent) new Child();


하지만 위에서 말했다 시피, 변수가 원하는 정보를 인스턴스가 모두 가지고 있으므로,


컴파일러가 형변환 기호를 붙이지 않더라도 다형성 측면에서 넘어가는 것이다.


위와 같은 캐스팅을 '업캐스팅' 이라 부른다.


왜냐하면 Parent 데이터형 에 Child형 데이터를 넣어 생기는 아래와 같은 구식도 때문이다.


Parent 에 Child데이터를 넣으므로 화살표 방향이 위로 향하게 된다.


이런식으로 구조를 이해한다면 업캐스팅인 경우를 외우지 않아도 가능 할 것이다.


준비한 내용은 여기까지다.



다음 포스팅은 다음 캐스팅에 다룰 것이다.



http://mommoo.tistory.com/51 - 다운캐스팅







포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘은 캐스팅의 관해서 포스팅 한다. (형변환이라 부르기도 한다.)


캐스팅은 OOP(객체지향프로그래밍) 에서 매우 중요하다.


왜냐하면 캐스팅은 OOP의 다형성과 관련이 있기 때문이다.


자바를 통해서 설명하겠다. (어떤 언어든 상관없다.)


자바에서의 데이터형은 아래와 같이 크게 2가지로 나눌 수 있다. 


데이터형 : 기본형 , 참조형.


자바에서 기본형은 8가지다. ( boolean, int, short, byte,double, long, float, char ) 이다.


자바에서 참조형은 만들기 나름이지만, 예시를 들자면, 많이쓰는 String 정도가 되겠다.


캐스팅의 목적은 데이터를 바꾸는 것이 주목적이 아닌, 


코드를 적는 프로그래머가 이미 데이터 정보에 대해 이해한 가정하에, OOP의 다형성 측면에서 사용한다.


기본 데이터형에서의 캐스팅은 원칙적으로 데이터손실을 막고자 한다.


아래의 예시를 보자.


int a = 1.0; 


위의 예시는 컴파일 에러가 뜬다.


변수는 분명 int 정보만 원하고 있다. 1.0이라는 실제데이터는 int 정보를 이미 가지고 있고, 소수점을 표현하는


double형 데이터이다. 변수라는 것은 원하는 정보가 실제데이터에 있을 시, 문제 없이 받아 올 수 있다.


하지만 위의 예시는 왜 컴파일 에러가 뜰까?


답은 실제 데이터 1.0이라는 것이 a 변수에 들어 가면 1로 바뀌기 때문에 실제 데이터가 손실되는것을 막고자 하는 것이다.


하지만, 코드를 작성하는 프로그래머가 데이터가 손실된 다는 것을 이미 알고 있고 OOP의 다형성을 이용하고 싶을때는


아래와 같이 캐스팅을 하는 것이다. 


int a = (int)1.0;


실제데이터 앞에 (데이터 자료형) 을 붙여주면 캐스팅이 된다. 따라서 a 에는 1.0 대신 캐스팅된 1이 들어간다.


반대의 상황은 어떨까? 아래의 상황을 보자.


double b = 1;


위의 상황은 컴파일 에러가 뜨지 않는다. 하지만 의문을 가져야 한다.


분명 변수가 원하는정보는 더블형 데이터 자료형 이지만, 실제 데이터는 1이라는 int 자료형만 넣었다.


원칙으로는 변수가 원하는 정보를 충족하지 않을 시, 컴파일 에러가 떠야 한다.


하지만 컴파일 에러가 뜨지 않는 이유가 무엇일까?


그 이유는 기본형 끼리의 캐스팅이기 때문이다. 분명 실제 데이터는 1밖에 넣질 않았지만,


기본 자료형은 이미 컴파일러가 알고 있는 자료형이다. 따라서, 더블형 데이터의 형태를 추측으로 알 수 있는 것이다.


즉, 컴파일러가 자동적으로 더블형으로 바꿔주는 것이지, 원칙으론 안된다는 것을 알아야 한다.







실제로, 다음 포스팅할 다운캐스팅 같은 경우는 참조형 끼리의 형변환 이므로, 컴파일러는 참조형 데이터를 추리하지 못한다.


따라서, 윗 개념과 일맥상통하게 기본적으로 다운캐스팅은 성립되지 않는 개념이다. 


다음 포스팅때 업캐스팅과 다운캐스팅에 대해 그 의문을 풀어볼 것이다.



http://mommoo.tistory.com/41 - 업캐스팅

http://mommoo.tistory.com/51 - 다운캐스팅 



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

List와 Map의 차이 2편이다.


1편에서는 List에 대해 포스팅 했고,


오늘은 Map에 대해 포스팅한다.


아래는 1편 URL이다.


http://mommoo.tistory.com/33



Map을 이용해 저장할때는 List처럼


뭉텅이로 저장하는것이 아니라, Map에 아이템을 저장할때마다, 빈 공간을 찾아 저장한다.


따라서 List보다는 데이터 저장속도가 느릴 수 있다.  Map의 가장 큰 특징이라면,


쌍을이루는 Key와 Value값을 이용한다는 것이다.


따라서 단순한 포지션(0~10 같은 인덱션)보다는, 저장하고 싶은 데이터가 특별한 Key값을


가질때 Map을 사용하는것이 좋다. 아래의 예시는 자바언어로 작성하였다.



HashMap<String,String> hashMap = new HashMap<>();

hashMap.put("Key1" , " 키값이 Key1인 Value 입니다. ");

hashMap.put("Key2" , " 키값이 Key2인 Value 입니다. ");

hashMap.put("Key3" , " 키값이 Key3인 Value 입니다. ");

hashMap.put("Key4" , " 키값이 Key4인 Value 입니다. ");


System.out.println(hashMap.get("key1");

System.out.println(hashMap.get("key2");

System.out.println(hashMap.get("key3");

System.out.println(hashMap.get("key4");



------------- consol  -----------------


키값이 Key1인 Value 입니다.

키값이 Key2인 Value 입니다.

키값이 Key3인 Value 입니다.

키값이 Key4인 Value 입니다.


위의 예시는 key값을 String으로 데이터도 String으로 작성하였다.


만약 동일한 Key값을 사용하면 기존의 Key값을 가지고 있는 value가 사라지고


후에 저장한 valuse 값이 셋팅이 된다. key만 다르다면 value 값이 중복되도 상관 없다.


Map은 콘솔에 찍힌거와 같이 키값이 의미가 있을때 좋은 자료구조 이다.


ArrayList안에 원하는 데이터를 검색하는 경우에는 0번부터 해당 데이터가 있을때까지


검색을 해야하지만, (원하는 데이터의 index를 모르는 경우) hashMap의 경우는 


key값을 통해서 빠르게 데이터를 검색한다. 


요소의 추가 삭제는 List보다 성능이 나을때가 많다. 따라서, 검색성능은 기본적으로 Map이 좋다.



정리하자면,  Map 은빈번한 검색과, 범위데이터가 아닌 특정 데이터를 순간마다 캐치해야할 때 유리한 자료구조이다. 





'용어정리 > 프로그래밍용어' 카테고리의 다른 글

URL 이란?  (2) 2016.06.14
URI 이란?  (0) 2016.06.13
List와 Map의 차이 (1)  (0) 2016.04.26
XML 이란?  (9) 2016.01.26
상수(constant) 와 리터럴(literal)이란?  (16) 2016.01.06

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅은 List와 Map에 대해 


비교분석 해보겠다.


상호간의 공통점은 데이터를 저장하는


자료구조 인 점이다.  하지만,


똑같이 데이터를 저장하지만, 데이터를 저장하는 구조는 다르다.


먼저 List는 Memory안의 특정한 동일 공간에 뭉텅이로 저장된다.


내부구현은 배열로 되어 있기 때문이다. 때문에 알맞는 데이터 저장공간만 


있다면 데이터 저장속도는 빠르다. 


또한, 순차적으로 데이터를 저장하므로, 데이터 특징이 


포지션별로 의미가 있을 때 사용하는 것이 좋다. 


아래는 자바로 작성한 예시이다. 


List와 Map의 프로그래밍적으로 개념은 같기때문에 어떤 언어든간에


똑같이 이해하면 된다.



ArrayList<String> arrayList = new ArrayList<>();


arrayList.add("0번 아이템 입니다.");

arrayList.add("1번 아이템 입니다.");

arrayList.add("2번 아이템 입니다.");

arrayList.add("3번 아이템 입니다.");

arrayList.add("4번 아이템 입니다.");

arrayList.add("5번 아이템 입니다.");


int index = 0;

for(String tempItem : arrayList){

  System.out.println((index++)+"번 : " + tempItem);

}


-------------------Consol---------------------------


0번 : 0번 아이템 입니다.

1번 : 1번 아이템 입니다.

2번 : 2번 아이템 입니다.

3번 : 3번 아이템 입니다.

4번 : 4번 아이템 입니다.

0번 : 5번 아이템 입니다.

 

foreach문을 썻지만 , 일반 for문으로 arrayList.get(position); 메서드를 써도 무방하다.


데이터가 6개 필요하므로 배열의 크기가 6을 충족하는 메모리 공간만 있으면


그곳에 배열자체를 저장한다. (JDK 1.7 아래 버전은 디폴트 배열 크기가 10이다.)


consol 출력처럼 포지션별로 의미가 있을때 유리하다.


예를 들어 쇼핑몰 페이지에서  쇼핑몰 아이템들을 화면에 나열 한다고 생각해보자. 


단순히 저장된 아이템 전부를 화면에 나열할 필요가 있으므로, 


순차적으로 저장된 데이터를 순차적으로 화면에 배치시키면 되는것이다.


이러한 경우는 ArrayList가 좋다. 하지만,


ArrayList안에 있는 데이터를 삽입/삭제가 빈번할때, 비효율적인 경우가 있다.


추가는 단순히 ArrayList 내부 배열의 크기를 바꾸고 기존 배열의 데이터를 추가하는데 그치지만,


원하는 포지션(인덱스)의 삽입/삭제는 이야기가 다르다. 


삽입/ 삭제는 해당 포지션 아래의 데이터들을 Copy 해야한다. (새로운 배열을 만든후,


기존 배열의 값을 포지션별로 다시 채워야한다.)


기존 배열의 크기를 늘린후 삽입/삭제 데이터를 처리하고 Copy된 데이터를 다시 붙인다.


따라서 ArrayList의 size가 큰 경우는 많은 양의 요소들을 Copy해야 하므로 내부적으로 성능이


떨어질 수 있는것이다.




정리하자면, ArrayList는 이이템의 빈번한 변경 없이,


데이터를 순차적으로 받고, 특정 데이터가 아닌 원하는 데이터 범위를 순차적으로 표현할때 유리한 자료구조라 볼 수 있다.


반면에, Map 은 다르다. 무엇이 다른지는 다음 포스팅때 이어가겠다.

 





'용어정리 > 프로그래밍용어' 카테고리의 다른 글

URI 이란?  (0) 2016.06.13
List와 Map의 차이 (2)  (0) 2016.04.27
XML 이란?  (9) 2016.01.26
상수(constant) 와 리터럴(literal)이란?  (16) 2016.01.06
Wrapper class(래퍼 클래스) 란?  (0) 2015.12.24

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

프로그래밍을 하다보면 데이터 자료구조를


변환해야 할 때가 있다. 오늘 포스팅은


ArrayList or List <-> 배열(Array)로 변환하는걸 


다루어본다.



중요한건 자료구조를 바꾸는 것이지 자료형은 일치해야 한다는것이다.


아래의 예시는 가장 많이 쓰이는 String 클래스 자료형을 이용한 변환 예제이다.



1. List -> Array(배열)


ex ) for문.


ArrayList<String> arrayList = new ArrayList<>();


arrayList.add("Test1");

arrayList.add("Test2");

arrayList.add("Test3");


String[] array = new String[arrayList.size()];

int size=0;

for(String temp : arrayList){

  array[size++] = temp;

}




윗 for문 방식은 arrayList (리스트) 데이터를 for문을 통해 순서데로 String 배열에 넣는다.


아래의 방식은 List에서 제공하는 메서드를 이용한 방식이다.



ex ) List에서 제공하는 메서드 사용.



ArrayList<String> arrayList = new ArrayList<>();


arrayList.add("Test1");

arrayList.add("Test2");

arrayList.add("Test3");


String[] array = arrayList.toArray(new String[arrayList.size()]);




2. Array(배열) -> List


ex ) for문



String[] array = new String[3];


array[0] = "Test1";

array[1] = "Test2";

array[2] = "Test3";


ArrayList<String> arrayList = new ArrayList<>();

for(String temp : array){

  arrayList.add(temp);

}




1번의 for문 예시와 같은 원리이다. 아래의 방식은 Arrays에서 제공하는 메서드를 이용한다.

.

ex )Arrays 메서드 사용,


String[] array = new String[3];


array[0] = "Test1";

array[1] = "Test2";

array[2] = "Test3";


ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(array));




예시는 String으로 했지만, 모든 자료형이 가능하다. 중요한건 바꿀 자료구조끼리 자로형이 같아야한다.


원리는 for문이나 변환을 위해 제공되는 메서드나 똑같다.


하지만, 제공되는 메서드를 사용할시 코드를 간편하게 작성할 수 있는 장점이 있고, 더군다나


JAVA8 에서는 좀더 간단하게 표현 할 수 도 있다.



따라서, 알아두면 유용하게 쓰일 것이다.



'Java' 카테고리의 다른 글

JAVA - UpCasting(업캐스팅)  (9) 2016.06.07
JAVA - Casting(캐스팅)  (0) 2016.05.26
JAVA BufferedReader readLine에 관하여.  (2) 2016.04.09
Java foreach문(향상된 for문)  (0) 2016.03.30
JAVA Static이란?  (2) 2016.03.29

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

소켓프로그래밍을 하거나 파일입출력을 할때


자바가 제공하는 스트림을 사용한다.


(InputStream , OutputStream)


하지만 Byre 단위라서 영어나 숫자등은 잘 출력되는데,


단위가 2바이트인 한글은 깨져서 출력된다.


그래서 char 단위인 InputStreamReader를 쓴다.


해당 클래스를 쓰면 한글도 잘 출력되지만, 한글자씩 받아와야 하는


상황이 아니면 버퍼에 저장하여 한꺼번에 받는 방식을 많이 사용한다.


아래와 같이 코딩한다.


InputStream is = // inputStream 초기화는 상황마다 틀리므로, 초기화됬다 가정한다.


String temp;


BufferedReader buffer = new BufferReader(new InputStreamReader(is,"UTF-8");


while((temp = buffer.readLine() ) != null){


//........


}



윗 코딩 처럼 사용할때, 주의 할점이 readLine()은 개행문자가 포함되어야 내부 blocking이 풀리면서 wihle문이 실행한다는 것이다.


다시 말하자면,


BufferReader의 readLine() 를 쓸때는 inputStream 이 반드시 개행문자가 포함되어야 한다. 자바에서의 개행문자는 "\n" 이지만,


스트림에서의 개행문자는 "\r\n"이 개행문자이다. 


따라서, 보내는쪽의 데이터 뒤에 "\r\n"을 반드시 붙여야한다.


ex ) 


String tempData = "아야어여오유";


Byte[] bytes = (tempData+"\r\n").getBytes();




'Java' 카테고리의 다른 글

JAVA - Casting(캐스팅)  (0) 2016.05.26
JAVA - ArrayList에서 배열로, 배열에서 ArrayList로  (2) 2016.04.25
Java foreach문(향상된 for문)  (0) 2016.03.30
JAVA Static이란?  (2) 2016.03.29
자바 enum 열거형  (0) 2016.01.27

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

+ Recent posts