'2017/03/06'에 해당되는 글 2건

728x90

ArrayList
- 배열 기반, 데이터의 추가와 삭제 유용하지 못함, 순차적인 추가 삭제는 제일 빠름, 인덱스가 있어 임의의 요소에 대한 접근성이 뛰어남.
- 대량의 자료를 추가/삭제하는 경우에 내부적인 처리량이 늘어나서 상당한 성능저하를 가져온다.
- 각 데이터의 인덱스를 가지고 있기 때문에, 필요한 데이터의 접근이 한번만에 가능하다.
  많은 데이터를 한 번에 다 가져와서 여러번 참조해 쓸 때 최상의 성능을 나타낸다.
- 레퍼런스 타입의 데이터만 저장할 수 있다.
- 데이터 내용의 중복이 가능하다. null값을 허용한다.

ArrayList<String> list = new ArrayList<String>();
list.add("apple")'; // 추가
String str = list.get(2); // 데이터 가져오기
list.remove(1); // 데이터 삭제
list.set(0, "오렌지"); // 데이터 수정
int index = list.indexOf("apple"); // 인덱스 알아내기


ArrayList<Calendar_Item> list = new ArrayList<Calendar_Item>();

와 같이 String 대신에 Calendar_Item 이 오면 데이터 수정을 어떻게 해야 할까?

Calendar_Item item = new Calendar_Item();
item.setYear(year);
item.setMonth(month);
item.setDay(day);
item.setWeekday(weekday);
item.setColor(color);
item.setName(name);

item.setKey(key);

list.set(0,item);

즉, String 값 대신에 Calendar_Item item 값을 넣어주면 된다.

초보자로서 이렇게 생각하는 것이 참 어렵다.


검색으로 index 값인 0 를 찾아내는 로직이 구조상 속도가 빠르지 않는거 같다.

public int getIndexOfList(String search_key) {
    for (int temp = 0; temp < list.size(); temp++) {
        String key = list.get(temp).getKey();
        if (key != null && key.equals(search_key)) {
            return temp;
        }
    }
    return -1;
}

하나의 index 값을 찾아내는데 ArrayList 배열 전체를 순환하면서 일치하는 걸 찾아낸다.

검색으로 찾아야 할 데이터가 많다면 속도 저하는 당연히 발생할 것이다.



컬렉션 프레임웍에서는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다.

컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator 인터페이스를 정의하고, Collection 인터페이스에는 Iterator를 반환하는 iterator()를 정의하고 있다.

List list = new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}



HashMap

- Map 인터페이스의 한 종류로, key와 value 를 묶어 하나의 entry 로 저장한다는 특징을 갖는다.

- key는 중복을 허용하지 않고, value는 중복 허용한다.

  동일한 key 가 입력되면, 나중에 입력된 데이터(key, value)로 덮어 씌워진다.

- Map에 종류에는 Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap 등이 있다.

- 배열과 연결이 결합된 형태, 추가, 삭제, 검색, 접근성이 모두 뛰어남, 검색에는 최고 성능을 보인다.
HashMap<키의타입, 데이터의 타입> 해쉬테이블 이름 = new HashMap<키의 타입, 데이터의 타입>();
- 해쉬 테이블에 저장할 데이터 타입과, 키 타입 두 가지 데이터 타입을 정해야 한다.
- HashMap<String, Integer> hashtable = new hashmap<String, Integer>();
- hashtable.put("apple", new Integer(100)); // 해쉬 테이블에 데이터 저장
- Integer num = hashtable.get("apple"); // 해쉬테이블에 저장된 데이터를 읽어온다.
- hashtable.remove("apple"); // 해쉬테이블에 있는 데이터 삭제

※ 멀티쓰레드에서는 HashTable을 쓴다


* Map 인터페이스의 주요 메소드


HashMap 메소드 

설명 

put() 

- 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get() 

- 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove() 

- 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

containKey() 

- 지정한 키(Key)가 존재하는지 여부를 반환한다. 

containsValue() 

- 지정한 값이 존재하는지 여부를 반환한다. 

size() 

- Map의 요소 개수를 반환한다. 

isEmpty() 

- Map이 비어 있는지의 여부를 반환한다. 



*



출처: http://hyeonstorage.tistory.com/230 [개발이 하고 싶어요]

* Map 인터페이스의 주요 메소드


HashMap 메소드 

설명 

put() 

- 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get() 

- 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove() 

- 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

containKey() 

- 지정한 키(Key)가 존재하는지 여부를 반환한다. 

containsValue() 

- 지정한 값이 존재하는지 여부를 반환한다. 

size() 

- Map의 요소 개수를 반환한다. 

isEmpty() 

- Map이 비어 있는지의 여부를 반환한다. 



*



출처: http://hyeonstorage.tistory.com/230 [개발이 하고 싶어요]

* Map 인터페이스의 주요 메소드


HashMap 메소드 

설명 

put() 

- 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get() 

- 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove() 

- 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

containKey() 

- 지정한 키(Key)가 존재하는지 여부를 반환한다. 

containsValue() 

- 지정한 값이 존재하는지 여부를 반환한다. 

size() 

- Map의 요소 개수를 반환한다. 

isEmpty() 

- Map이 비어 있는지의 여부를 반환한다. 




출처: http://hyeonstorage.tistory.com/230 [개발이 하고 싶어요]

* Map 인터페이스의 주요 메소드

HashMap 메소드 

설명 

put(Object Key, Object Value)

 - 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get(Object Key)

 - 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove(Object Key)

 - 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

boolean containsKey(Object Key)

출처: http://vaert.tistory.com/107 [Vaert Street]

boolean containsKey(Object Key)

 - 지정한 키(Key)가 존재하는지 여부를 반환한다. 

boolean containsValue(Object Value)

 - 지정한 값이 존재하는지 여부를 반환한다. 

clear()

 - HashMap에 저장된 모든 객체를 제거한다

Object clone()

 - 현재 HashMap을 복제하여 반환한다.
    newmap = (HashMap)map.clone();

newmap = (HashMap)map.clone();

출처: http://vaert.tistory.com/107 [Vaert Street]

int size() 

 - HashMap에 저장된 요소의 개수를 반환한다. 

isEmpty() 

 - Map이 비어 있는지의 여부를 반환한다. 

Collection values()

 - HashMap에 저장된 모든 값을 컬렉션 형태로 반환한다.


HashTable과 HashMap의 차이는 null 값을 허용하는데에 있다.
HashTable은 null 값을 허용하지 않지만, HashMap은 null 값을 허용한다.

HashMap의 경우 동기화를 지원하지 않지만 Hashtable은 동기화를 지원하여 다중 스레드 환경에서 사용하면 된다.
보통은 HashMap을 활용하고 동기화가 필요한 시점에서는 Java 5부터 제공하는 ConcurrentHashMap을 사용하는 것이 더 좋은 방법이라 표현한다.
HashMap은 저장된 요소들의 순회를 위해 Fail-Fast Iterator를 반환한다.
Hashtable은 같은 경우 Enumeration을 반환한다.


there are many differences between HashMap and Hashtable classes that are given below.

HashMapHashtable

1) HashMap is non synchronized. It is not-thread safe and can't be shared between many threads without proper synchronization code.

Hashtable is synchronized. It is thread-safe and can be shared with many threads.

2) HashMap allows one null key and multiple null values.

Hashtable doesn't allow any null key or value.

3) HashMap is a new class introduced in JDK 1.2.

Hashtable is a legacy class.

4) HashMap is fast.

Hashtable is slow.

5) We can make the HashMap as synchronized by calling this code
Map m = Collections.synchronizedMap(hashMap);

Hashtable is internally synchronized and can't be unsynchronized.

6) HashMap is traversed by Iterator.

Hashtable is traversed by Enumerator and Iterator.

7) Iterator in HashMap is fail-fast.

Enumerator in Hashtable is not fail-fast.

8) HashMap inherits AbstractMap class.

Hashtable inherits Dictionary class.



ArrayList 다음에 <T>,<String>,<Integer>,<Class명> 라고 쓰여진 형식을 많이 보았을 것이다.

이 <>를 제네릭(Generics)이라 하는데, 이 <>안에 어떠한 타입을 선언해주어 해당 ArrayList, List 등이 사용할 객체의 타입을 지정해준다는 뜻이다. 이는 다룰 객체의 타입을 미리 명시하여 객체의 형변환을 사용할 필요없게 하며, 내가 사용하고 싶은 데이터 타입만 사용할 수 있게 해주는 효과가 있다.


ArrayList 의 제네릭스로 HashMap<String,String> 을 사용한 예제다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;

public class ArrayList_EX01 {

    public static void main(String[] args) {
        ArrayList <HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
        HashMap<String, String> map = new HashMap<String,String>();
        map.put("1", "고양이");
        map.put("3", "송아지");
        map.put("2", "강아지");
        //key, value로 String의 값들을 넣어준다.
        list.add(map);

        for(int i = 0; i < list.size(); i++){
            // ArrayList 사이즈 만큼 for문을 실행한다.
            System.out.println("list 순서 " + i + "번쨰");
            for( Entry<String, String> elem : list.get(i).entrySet() ){
                // list 각각 HashMap받아서 출력한다.
                System.out.println( String.format("키 : %s, 값 : %s", elem.getKey(), elem.getValue()) );
            }
        }

    }
}


'안드로이드 > Java 문법' 카테고리의 다른 글

[Java] 정보은닉과 캡슐화  (0) 2017.10.16
자바 기본 데이터형과 크기  (0) 2017.10.11
Java 클래스(Class) ★★★★★  (0) 2017.05.04
Java foreach 문  (0) 2017.03.01
자바 배열과 기본 문법  (0) 2016.07.11
블로그 이미지

Link2Me

,
728x90

동영상 강좌를 수강하면서 보니까 Android Studio 2.1.2 버전과 2.2.3 버전의 단축키 사용법이 좀 다른가보다.

동영상 강좌에서는 단축키를 사용해서 코드를 생성하는 방법이 나오지 않는다.

오프라인 강의를 통해서 Android Studio 강의를 들었던 단축키 사용법이 없다.


Android Eclipse 기반으로 작년도 6월에 잠깐 연습을 해보고 나서 회사 업무때문에 Android 독학하는 것이 어렵다는 생각에 포기하고 있다가 올해 2월에 야간 강의를 들으면서 다시 Android Studio 연습하면서 간단하게 정리를 해두려고 한다. 전문적인 개발이 아니다보니, 업무를 이것저것 하다보면 금새 잊어버리게 된다.







7번까지 실행하고 나면 자동으로 아래 화면이 만들어진다.



여기까지가 기본적인 Android Studio 사용법을 위한 준비과정이다.

이제 Layout 부분과 MainActivity.java 파일에 내용을 추가하면 된다.


Exercise_app1.zip


Android Studio 파일은 실행파일을 생성하고 나면 파일 사이즈가 상당히 커서 파일을 전부 올릴 수가 없다.

그래서 핵심적인 것만 첨부한다.

이 첨부된 코드를 보면서 필요한 부분을 복사해서 붙여넣기 해가면서 테스트하면 된다.


Java 의 정석 책도 같이 보고 있다.

DoIt 안드로이드 앱 프로그램 책의 동영상 강좌에 보면, Java 를 몰라도 Anroid 배울 수 있다고 설명한다.

하지만 Java 에 대한 기본개념이 약하면 응용력이 생길수 없다.

PHP도 잘 하는 것은 아니지만 프로그램을 좀 해보면서 느끼는 것은 배열 다루는 것이 정말 중요하다는 걸 많이 배웠다. Java 에서는 Class 개념과 배열, ArrayList 에 대한 개념이 강해야 할 거 같아서 Java 정석 책을 병행 공부중이다.


public class MainActivity extends AppCompatActivity

- C++에서는 여러 클래스로부터 상속받은 다중상속을 허용하지만, 자바에서는 단일 상속만을 허용한다.


접근제어자

- private : 같은 클래스 내에서만 접근이 가능하다.

- protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다.

- public : 접근 제한이 전혀 없다.


==== MainActivity.java ====

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import static android.R.attr.data;

public class MainActivity extends AppCompatActivity {

    public static final int REQUEST_Code = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn = (Button) findViewById(R.id.btn_01);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // new 액티비티로 전환
                Intent intent = new Intent(getApplicationContext(),NewActivity.class);
                intent.putExtra("name","mike");
                startActivityForResult(intent,REQUEST_Code);
            }
        });

        // 버튼의 배경색 지정
        btn.setBackgroundColor(Color.parseColor("#FF00FF"));
    }

    // new 액티비티에서 응답을 받았을 때 처리사항
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == REQUEST_Code){
            Toast.makeText(getBaseContext(), "요청코드:"+resultCode, Toast.LENGTH_SHORT).show();

            if(resultCode == Activity.RESULT_OK){
                String name = data.getExtras().getString("name");
                Toast.makeText(getBaseContext(), "응답이름:"+name, Toast.LENGTH_SHORT).show();
            }
        }
    }
}




==== NewActivity.java ===

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class NewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new);

        Intent intent = getIntent();
        String name = intent.getExtras().getString("name");
        Toast.makeText(getApplicationContext(), "onCreate 호출됨:"+name, Toast.LENGTH_SHORT).show();

        Button btn = (Button) findViewById(R.id.backBtn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "돌아가기 버튼이 눌렸어요.", Toast.LENGTH_LONG).show();
                close();
            }
        });
    }

    // Back 키를 눌렀을 때 액티비티를 닫고 메인화면으로 이동
    public boolean onKeyDown(int keyCode, KeyEvent key){
        if(keyCode == key.KEYCODE_BACK){
            close();
            return true;
        }
        return false;
    }

    protected void close(){
        // 응답값을 전달하기 위한 인텐트 생성
        Intent resultIntent = new Intent();
        resultIntent.putExtra("name","Link2me");

        // 응답값을 전달
        setResult(Activity.RESULT_OK,resultIntent);
        finish(); // 액티비티 닫기(현재 화면을 종료)
    }
}



keyCode

 상수 설명 
 KEYCODE_DPAD_LEFT  왼쪽 이동키
 KEYCODE_DPAD_RIGHT  오른쪽 이동키
 KEYCODE_DPAD_UP  위쪽 이동키
 KEYCODE_DPAD_DOWN  아래쪽 이동키
 KEYCODE_DPAD_CENTER  이동키 중앙의 버튼
 KEYCODE_A  알파벳 A (B부터는 KEYCODE_B 방식)
 KEYCODE_0  숫자 0 (1부터는 KEYCODE_1 방식)
 KEYCODE_CALL  통화
 KEYCODE_ENDCALL  통화종료
 KEYCODE_HOME  홈
 KEYCODE_BACK  뒤로
 KEYCODE_VOLUME_UP  볼륨증가버튼
 KEYCODE_VOLUME_DOWN  볼륨감소버튼


==== activity_main.xml ====

본인이 생성하는 부분과 달라지는 부분이 뭔지부터 알아보자면 색깔이 표시된 부분이 다르다.

Android Studio 2.2.3 에서는 자동완성 기능이 워낙 뛰어나서 코드 작성이 정말 편하다.

개념을 잘 이해하고 있다면 쉽게 코드를 작성할 수가 있겠더라.


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.a05rg.app4.MainActivity">

    <Button
        android:id="@+id/btn_01"
        android:layout_centerInParent="true"
        android:text="new activity make"
        android:textAllCaps="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

블로그 이미지

Link2Me

,