오늘 포스팅은 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

오늘 포스팅 할 내용은 자바의 enum 예약어 이다.


자바에는 크게 2개의 데이터 타입이 존재한다. 기본형과 참조형.


enum은 두개의 데이터 타입중 참조형이다.


enum은 참조형이지만, int 형 같은 기본 자료형 처리와 같은 성능을 발휘한다.


따라서 내부 처리속도가 빠를뿐더러, 코드 가독성을 높이고 의미를 부여할 수 있는 장점이 있다.


간단한 enum예시는 아래와 같이 쓴다.


public enum Units {Marine,SCV,Zergling};
Units unit = Units.Marine; // 마린을 선택할경우.
switch(unit){
  case Marine:
  break;
  case SCV :
  break;
  case Zergling :
  break;
}


예제와 같은 분기 로직을 처리 할때 사용자 입장에서 코드 가독성과 의미가 부여됬음을 쉽게 알 수 있다.


Enum에 대해 좀 더, 자세한 사항을 알고 싶다면 아래의 포스팅을 읽기를 권한다.




자바 Enum 자료형 1편 - http://mommoo.tistory.com/57



'Java' 카테고리의 다른 글

Java foreach문(향상된 for문)  (0) 2016.03.30
JAVA Static이란?  (2) 2016.03.29
JAVA - 익명클래스(Anonymous class)란?  (3) 2016.01.20
JAVA의 삼항연산자  (4) 2015.12.11
JAVA의 생성자 (2)  (2) 2015.11.17

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

Buy me a coffeeBuy me a coffee



제목은 자바의 삼항연산자라고 적었지만.


이 삼항연산자는 언어 불문하고 자주 쓰이는 코드다.


삼항연산자를 쓰는 이유는 딱 하나이다. 어렵지 않은 알고리즘의 다수줄의 코드를


가독성 좋게 한 두줄로 바꿔줄 수 있기 때문이다.


아래의 예시를 보자.



if(a>b){
		result = 111;
	}else{
		result = 222;
	}


어렵지 않은 코드이다. a가 클시 result에는 111이 들어가고 b가 클시, result에는 222가 들어간다.


문제가 뭐냐면... 귀찮다 분명 어렵지 않은 알고리즘이지만, 


다른 코드들이랑 쓰다보면 눈에 안들어 올 것이다.


위코드를 아래와 같이 바꿀 수 있다.



result = (a>b)?111:222;


이런식으로 쓴다. result의 값은 위 위의 코드와 동일하게 들어간다. 


변수 = (참이나 거짓이나오는 부울린) ? (참일경우 들어가는 값 ) : (거짓일 경우 들어가는 값);


위의 경우는 int형 변수 result를 썻지만. 좀더 응용하면 여러 변수들을 상황에 맞게 쓸 수 있다.


예를들어, 자바의 JFrame 에서 visible을 컨트롤 한다고 생각해보자.



frame.setVisble((frame.isVisible())?false:true);



이해가 가는가? 삼항연산자의 리턴값을 변수에 넣지 않고 바로 setVisible안에 넣은것이다.


따라서 저 코드는 visible 이 트루 일때는 frame을 안보이게하고. 


visible이 거짓 일때는 frame 을 다시보이게 하는 코드라 할 수 있겠다.




 

 

'Java' 카테고리의 다른 글

JAVA Static이란?  (2) 2016.03.29
자바 enum 열거형  (0) 2016.01.27
JAVA - 익명클래스(Anonymous class)란?  (3) 2016.01.20
JAVA의 생성자 (2)  (2) 2015.11.17
JAVA의 생성자 (1)  (0) 2015.11.12

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

Buy me a coffeeBuy me a coffee



mommoo.tistiory.com/3 ( Java의 생성자 (1) )



저번 포스팅의 2탄이다. 1탄은 위의 경로로 가서 보면 된다.


저번 포스팅의 예제를 사용해 생성자의 사용법에 대해 설명하겠다. 


public class Test{
        
	public int num;
	public String str;

	public Test(int num,String str){
		this.num = num;
		this.str = str;
	}

	public void print(){
		System.out.println("num은"+num+"입니다. , str은"+str+"입니다.");
	}

	public static void main(String str[]){
		Test test = new Test(10,"홍길동");
		new Test(9,"활빈당");
	}
}

main 함수에서 new 키워드를 통해 Test클래스를 사용했다. 생성자 함수가 2개의 매개변수를 요구 하므로


Test클래스를 생성할 때, 두가지 정보를 넣었다.(이름,나이)


main 함수안에 첫번째 줄은 test 라는 참조변수에 생성한 Test클래스의 정보를 담았고


두번째 줄은 Test클래스를 생성만 할 뿐 변수에 담지는 않았다.


결과적으로 말하자면, 둘다 new 키워드를 통해 클래스를 호출 했고 둘다 생성자( public void Test(int num,String str) )가


실행이 된다. 거꾸로 말하자면, new 키워드를 통해 클래스를 호출만 하면 생성자는 무조건 실행이 된다는 것이다.


따라서, 생성자는 프로그래머가 생각하기에, 자신이 만든 프로그램(클래스)이 메모리에 적재 될 시,


반드시 해야할 일 을 코드로 작성하는 공간이라 생각하면 되겠다.


클래스 안에는 반드시 생성자가 정의 되어야 한다. 하지만 아래와 같은 코드를 보자.



public class Test{

	public int num;
	public String str;

	public static void main(String str[]){
		Test test = new Test();
	}

위의 클래스는 생성자가 보이지 않는다.


분명히 클래스는 생성자가 존재해야 한다고 말했지만, 컴파일 오류가 발생하지 않고, 실행도 잘된다.


이유가 무엇일까? 


정답은 사용자가 생성자를 따로 적지 않았을 시, 자바 컴파일러가 우리가 만든 Test 클래스에


Test(){}; 라는 생성자를 (디폴트 생성자) 저절로 넣어준다. 


즉 결국엔 생성자가 있는것 처럼 된것이다.


그렇다면, 우리가 매개변수가 있는 생성자를 따로 적어 주었을시, 자바 컴파일러가 Test(){}라는 디폴트 생성자를 넣어줄까?


답은 아니오다. 우리가 따로 생성자를 적어주었을시, 우리가 적은 생성자를 메인 생성자로 판단하고 디폴트 생성자를 넣어주지 않는다.


아래의 코드는 오류가 발생한다.

public class Test{ public int num; public String str; public Test(int num){ this.num = num; } public static void main(String str[]){ Test test = new Test();//매개변수가 하나 필요하다... }

그렇다면, 위의 코드의 오류를 고치는 방법은 무엇이겠는가? 제일 간단한 방법은


Test클래스를 호출할때 매개변수를 하나 입력하는 것이다.


다른 방법도 있다. 혹, 오버로딩을 아는 사람이라면, 쉽게 이해 할 수 있을 것이다.


생성자를 하나더 만드는 것이다.


public class Test{ public int num; public String str; public Test(){}; public Test(int num){ this.num = num; } public static void main(String str[]){ Test test = new Test(); }


이렇게 생성자를 하나 더 만들어 주면 된다.


main에서 Test클래스를 생성할 때, 매개변수가 없는 클래스를 생성 하였으므로 매개변수가 없는 생성자를 찾아가 클래스를  생성한다.



여기까지가 준비한 내용이다. 


다른 개념을 추가적으로 덧 붙여 생성자를 설명하면 말 할 내용은 더 길어진다.(예를들어, 상속) 


때문에, 생성자의 모든 부분을 다루진 않았지만 어느정도 생성자에 관해 알게되었을 것이라고 예상한다.





'Java' 카테고리의 다른 글

JAVA Static이란?  (2) 2016.03.29
자바 enum 열거형  (0) 2016.01.27
JAVA - 익명클래스(Anonymous class)란?  (3) 2016.01.20
JAVA의 삼항연산자  (4) 2015.12.11
JAVA의 생성자 (1)  (0) 2015.11.12

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

Buy me a coffeeBuy me a coffee

+ Recent posts