Map과 List에 대한 간단한 이해


List는 원소들을 가지고 있는 데이터 집합이다. 순차 자료구조로 순차적으로 메모리에 저장되는 형태이다. 쉽게 배열로 바꾸어서 생각해도 된다. 

따라서 List의 원소에 접근할 때는 index(첨자)로 접근한다.


List는 Generic이라는 옵션이 존재하는데 Generic 옵션이 설정된 List는 Generic에 해당되는 데이터 형만을 담을 수 있다.


List<Integer> myList = new ArrayList<Integer>();


위와 같이 선언된 List는 Generic 옵션으로 Integer 형을 받았다.

myList에 add할 수 있는 자료들은 Integer형의 데이터만 담을 수 있게 된다.


myList.add("data")와 같이 문자열을 넣으려 한다면 에러가 발생하게 된다.


myList.get(i)과 myList.remove(i) 메소드를 사용해서 myList 안에 있는 원소들을 인텍스로 접근, 삭제 등을 할수 있다.


Map은 List와 같은 원소들을 모아 놓은 집합이다.

List와는 달리 index(첨자)로 접근하는 것이 아니라 key로써 데이터를 제어할수 있다.

Map 또한 Generic 옵션을 설정할 수 있다.


Map<String, Object> myMap = new HashMap<String, Object>();

와 같이 Generic을 key와 data형으로 지정한다.


myMap.put("elementA", "Data_1");

과 같은 형태로 String의 key로 myMap에 저장된 Object 데이타를 제어할 수 있게 되며 Generic 형식에 따라야 한다.


put으로 저장된 데이터는 put할 때 지정했던 key로 접근이 가능하며

myMap.get("elementA")을 호출하면 저장된 "Data_1"이 반환된다.

myMap.remove("elementA")을 호출하면 해당하는 key를 가진 원소가 삭제된다.





이클립스로 코딩을 하다 보면 아래 그림과 같이 현재 변수(혹은 객체)에서 사용 가능한 메소드들 등을 보여주는 코드 힌트 기능이 매우 요긴하게 쓰인다.




보통은 자동으로 표시가 되나 필요시 특정 키를 누름으로 해당 기능을 작동하게 할 필요가 있다. 이에 대한 설정법이다.


Window - Pereferences - General - Keys 에서 필터 부분에 assist를 입력하면 해당 Command 목록이 필터링이 된다. 


그 중에서

Content Assist에 대해 Binding의 값을 F6 등과 같이 자신이 원하는 키로 설정하면 된다.





만일 위와 같이 설정해도 안되면 아래 사항을 확인해서 항목을 모두 체크 표시해 주면 된다.


Window - Pereferences - Java - Editor - Content Assist - Advanced에서

항목들을 모두 체크해 주면 된다. 아랫 쪽 것도 마찬가지로







eclipse(이클립스)의 개발 환경을 utf-8로 설정하기


이클립스의 기본 인코딩이 euc-kr로 되어 있다. 인코딩 설정을 utf-8로 바꾸는 법.


Windows - Preferences - General - Workspace - Text file encoding에 대해 utf-8로 설정





⊙ 정 프로젝트만 인코딩을 utf-8로 설정하는 법


먼저 프로젝트를 선택 - 우측 버튼 클릭 - Properties 선택 - Resources 선택 - Text file encoding을 원하는 인코딩으로 설정







안드로이드 6.0에서 Apche의 HttpClient가 import안되는 문제 해결


안드로이드가 6.0으로 업데이트 되면서 기존에 안드로이드와 서버와의 통신, 데이터 송, 수신에

사용되던 Apache의 HttpClient를 구글이 원천적으로 사용을 못하게 해 놨다. 짜증~


아래 클래스들이 서버로의 송, 수신시 필요로 하는 것들인데 원천적으로 import가 안된다.

org.apache.http.HttpEntity;

org.apache.http.HttpResponse;

org.apache.http.client.ClientProtocolException;

org.apache.http.client.HttpClient;

org.apache.http.client.methods.HttpPost;

org.apache.http.entity.StringEntity;

org.apache.http.impl.client.DefaultHttpClient;

org.apache.http.util.EntityUtils;


https://developer.android.com/intl/ko/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client


따라서 HttpClient를 사용해야할 상황에서는 좀 난감해 진다.

구글 API Reference상에서 설명조차 제공이 안된다.

안드로이드 스튜디오를 사용하는 경우라면 해당 해법들이 검색하면 제법 나오는데

이클립스 상황에서는 땀난다...


해법은 다음 3개의 jar 파일을 libs폴더에 복사해 두면 이제부터 Ctrl-Shift-O로 정상적으로 import가 된다.


httpclient-4.4.1.jar

commons-logging-1.2.jar

httpcore-4.4.1.jar


혹은 구글 API Reference 문서에서 추천하는 방식인 HttpURLConnection을 사용하는 방식도 있겠다.





이클립스의 몇 가지 유용한 단축키


Ctrl-Shift-O

⇒ 이클립스에서 클래스 자동으로 import 시키기


Alt-Shift-O

⇒ 특정 변수가 사용된 위치를 손쉽게 파악하게 하는 토글 기능

특정 변수가 사용된 위치를 찾기 위해서 Ctrl-F로 검색할 변수명을 입력해서 찾을수도 있으나

이클립스는 해당 변수를 마우스롤 클릭하면 해당 변수가 사용된 위치를 아래 그림과 같이 표시해 준다.

그런데 이게 정상적으로 작동이 안될 때가 있다. 

이때 Alt-Shift-O를 누르면 정상적으로 작동이 된다.

아래 그림에서 화면 우측 하단의 작은 회색 사각형이 해당 변수가 사용된 위치이다.







자바 제네릭스(Generics)에 대해서 - T[], List<T> 등의 의미


ArrayAdapter의 두 생성자를 보면 다음과 같이 되어있다.

그런데 세 번째 매개인자의 데이터 타입이 T[] objects로 되어 있다.


ArrayAdapter(Context context, 

                    int textViewResourceId, T[] objects)

⇒ T[] objects가 의미하는 것은 어떤 배열이 여기에 올수 있다는 뜻이다.

T[]가 의미하는 것은 배열은 배열인데 data type은 어떤 data type도 가능하다는 뜻이다.


ArrayAdapter(Context context, 

                         int textViewResourceId, List<T> objects)

⇒ List<T> objects가 의미하는 것은 이 매개 인자의 자리에 List라는 interface의 객체가 올수 있다는 뜻이다. 

List<T>이므로 List가 담는 내용물의 data type은 T타입이므로 사용자가 정의하는 data type 뭐든지 올수 있다. 


그런데 List라는 interface를 보면 List를 implements한(상속받은) 하위 클래스들이 있는데 이들 중 어느 하나가 올수 있다는 뜻이다. 

대표적으로 ArrayList<E>가 올수 있다는 뜻이다.


public interface List implements Collection<E>

java.util.List<E>


Known Indirect Subclasses

AbstractList<E>, AbstractSequentialList<E>, ArrayList<E>, CopyOnWriteArrayList<E>,

LinkedList<E>, ObservableArrayList<T>,ObservableList<T>, Stack<E>, Vector<E>




안드로이드에서 외부 Font를 사용할려면 assets/fonts라는 폴더를 만들어서 여기에 글꼴을 복사해 놓아야 가능하다.

TextView 3개를 만들어 여기에 각각 다른 글꼴을 적용할려면 Typeface(android.graphics.Typeface) 클래스를 이용하면 간단히 구현된다.


Typeface 클래스의 객체를 구하는 방식은 아래의 static 메소드들 중 하나의 방식으로 처리된다.


static Typefacecreate(String familyName, int style)
Create a typeface object given a family name, and option style information.
static Typefacecreate(Typeface family, int style)
Create a typeface object that best matches the specified existing typeface and the specified Style.
static TypefacecreateFromAsset(AssetManager mgr, String path)
Create a new typeface from the specified font data.
static TypefacecreateFromFile(String path)
Create a new typeface from the specified font file.
static TypefacecreateFromFile(File path)
Create a new typeface from the specified font file.
static TypefacedefaultFromStyle(int style)
Returns one of the default typeface objects, based on the specified style


        TextView txt = (TextView)findViewById(R.id.myFont);

        Typeface face = Typeface.createFromAsset(getAssets(), "fonts/arial.ttf");

        txt.setTypeface(face);

        

        TextView txt2 = (TextView)findViewById(R.id.myFont2);

        Typeface face2 = Typeface.createFromAsset(getAssets(), "fonts/FORTE.TTF");

        txt2.setTypeface(face2);

        

        TextView txt3 = (TextView)findViewById(R.id.fontKOR);

        Typeface face3 = Typeface.createFromAsset(getAssets(), "fonts/HYPORM.TTF");

        txt3.setTypeface(face3);

        

Typeface를 이용한 글꼴 적용은 View의 paint에서도 사용이 가능하다.




HTML에 있는 링크(a 태그의 링크)를 새로운 창에서 여는 법이다.


링크를 클릭했을 때 브라우저의 현재 창에서 링크가 열리지 않고

새로운 창에서 열리도록 해야 할때가 있다.



새로운 창에서 열기 위해서는 <a> 태그의 target 속성을 이용하면 된다.


이때 target속성의 값(value)은 반드시 _blank이어야 한다.


새 창에서 열도록 할때의 잇점은 방문자로 하여금 자신의 사이트에 머물도록 하는 방편이 될 것이다.


아래는 코드 조각이다.



<a href="http://uljavajoe.blogspot.kr">구글에 개설한 블로그</a> (현재 창에서 열기)

<p>

<a href="http://uljavajoe.blogspot.kr" target="_blank">구글에 개설한 블로그</a> (새 창에서 열기)





FragmentTransaction의 replace() 메소드를 통해 동적으로 Fragment 교체하기

교체하는 코드는 다음과 같다.


FragmentManager fragmentManager =
                                       getFragmentManager();
FragmentTransaction fragTransaction = 

                          fragManager.beginTransaction();
MyFragment mFrag = new MyFragment();

fragTransaction.add(R.id.layout, mFrag);

//아래 코드 실행되는 시점에 

//MyFragment가 비로소 실행된다.

fragTransaction.commit(); 



☞ FragmentManager

⇒ Activity안에 있는 Fragment와 상호 작용 및 관리(Activity에 추가, 교체...)를 위한 클래스

이 클래스의 객체는 Activity의 메소드 중 getFragmentManager()를 통해 얻을 수 있다.


☞ fragTransaction.add(R.id.layout, mFrag);

⇒ 새로운 Fragment인 mFrag를 R.id.layout이라는 곳에 추가하는 기능.

R.id.layout이 들어있는 xml파일이 다음과 같다면


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:id="@+id/layout"

    android:orientation="vertical" >


    <Button

        android:id="@+id/btn"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:textSize="30sp"

        android:text="확 인"

        android:onClick="mClick"

        />

</LinearLayout>



fragTransaction.add(R.id.layout, mFrag)과 유사한 것이 replace() 메소드이다.

아래 코드는 R.id.content_frame에 있는 기존의 Fragment를 제거한 후 

두 번째 매개인자인 fragment를 R.id.content_frame에 집어 넣는 기능이다.


fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();




이클립스(eclipse)의 Show View의 항목들이 보이지 않을 때


이클립스의 Window - Show View - No Applicable View만 보이고

Show View의 여러 하위 항목들이 보이지 않을 때 해결하는 방법이다.


Window - Open Perspective - Java를 클릭하면 해결된다.


+ Recent posts