오늘은 안드로이드 SharedPreference에 대해 포스팅 합니다.


안드로이드 에서는 데이터 관리를 어떻게 할까?


크게 4가지 방법이 있다.


첫째는 SQLITE,


둘째는 I/O,


셋째는 서버를 거친 DB,


넷째는 오늘 포스팅 할 SharedPreference가 있다.


SharedPreference는 XML 방식을 채택하기 때문에,


데이터 로딩이 느릴 수 있다. XML 방식이 왜 느린지


알고 싶다면 아래 URL을 참고하라.


http://mommoo.tistory.com/17


기본적으로 쉐어프리퍼런스는 Map 과 같은 형태의 자료구조라 생각하면 편하다.


아래의 예제를 보자.


Preference 생성 (this 는 액티비티 정보. 액티비티 안이 아닐때는 context. 으로 접근해야함)


SharedPreferences shared

1 . sharedPreferences = getSharedPreference("name",0);


2.  sharedPreferences = getSharedPreference(0);


3.  sharedPreferences = PreferenceManager.getDefaultSharedPreference(this);



1번 방법은 쉐어프리퍼런스 저장 폴더에 name.xml 이름의 파일로 저장이 된다. 다른 이름도 얼마든지 가능하다.


2번 방법은 현재 액티비티의 이름으로 xml 파일이 저장된다.


3번 방법은 환경설정에 저장된 값으로 쉐어프리퍼런스를 가져오는 방법이다.


가져올 Preference가 없다면 새로 생성해준다.



Preference 값 호출


SharedPreferences.Edit editor = sharedPreference.edit();


editor.getInt(key값,디폴트값);

editor.getLong(key값,디폴트값);

editor.getBoolean(key값,디폴트값);

editor.getString(key값,디폴트값);

editor.getFloat(key값,디폴트값);


key값은 무조건 String 이다. 또한,


get하는 데이터형에 맞게 디폴트값을 설정해야 한다.


예를들어 getInt는 getInt("key",0); 이런식으로 말이다.



Preference 값 저장


SharedPreferences.Edit editor = sharedPreference.edit();


editor.putInt(key값, 디폴트값);

editor.putLong(key값, 디폴트값);

editor.putBoolean(key값, 디폴트값);

editor.putString(key값, 디폴트값);

editor.putFloat(key값, 디폴트값);

editor.commit();


중요한 것은 commit() 메서드를 써야 xml에 저장이 된다는 점이다.


값 호출 처럼 key값은 String이고 디폴트값은 자료형에 맞게 써야한다.



Preference 값 삭제


SharedPreferences.Edit editor = sharedPreference.edit();


1. editor.remove("key");


2. editor.clear();


editor.commit(); 


값 저장과 같이 commit(); 메서드를 사용해야 적용된다.


1번 방법은 key값에 맞는 value가 지워지고


2번 방법은 xml 데이터 전체가 지워진다.





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

Buy me a coffeeBuy me a coffee

4월~5월 지금까지


졸업준비 하느라 너무 바빳습니다.


어찌어찌 졸업 준비가 끝나가,


서비스 중인 과기DAY 마이너 


업데이트를 하게되었습니다.


생각보다 많은분이 피드백을 해주신 덕분에


개선점과 좋은점에 대해 알게 되었구요,


덕분에 아래와 같이 개선했습니다.!



* 개선 사항.


  1. 식단표 카드를 누를 시, "식단표 보기" 버튼이 작아 불편했던 문제


  - 작은 버튼은 안녕! 카드를 누를 시 식단표가 나옵니다.



  2. 식단리스트 오류 문제.


 -학교 홈페이지의 식단표 리스트를 가져오는 것이라... 

  학교 홈페이지 웹을 올리시는 분이 실수 하는 경우, 제가 실수하는 경우

  등 생각보다 변수가 많아서 앱 초반에는 크고 작은 버그가 많았는데요,

  (최근에도 '과기인' 이라는 과기대 커뮤니티에서 버그를 찾아주셨습니다.)

  이번에도 찾게된 버그를 고치게 됨으로 써, 안정화 단계에 머물게 된것 같습니다.


   3. 전화번호부 기능 - 카드 접기가 하드웨어 뒤로가기 키로만 종료 되던 문제.

   피드백 요구에 따라 카드 밖 화면을 터치했을시,

   종료되게끔 개선했습니다!.



* 기능 추가 사항



  1. 앱에서 공지사항이 있을 시, 보여드립니다.! 

     공지 다시 띄우지 않기. 에 체크를 하시면, 

     새로운 공지가 게시되게 전까진 안뜹니다.




  2. 개발자 메세지 기능이 생겼습니다. 

     예기지 못한 버그나, 

     급히 알려야 할 사항이 있을시

     메세지를 통해서 알릴 예정입니다! 

     마찬가지로 공지 다시 띄우지 않기 

     기능이 포함되어 있습니다.


     

.     


    3. 최근 공지 사항을 다시 볼 수 있습니다! 

      (개발자 메세지는 다시 띄우지 않는다에, 체크시 새로운 메세지가 나오기 전까진 못봅니다!).

      SETTING 탭에서 확인 할 수 있습니다~. 

* 기타 사항.


  교통정보를 볼 수 있는 컨텐츠 개발이 거의 끝났습니다. 이런 저런 이유로

  아직 업데이트를 못 하고 있는데, 교통정보 업데이트가 끝나면 학우들이 많이

  사용하지 않을 까 싶습니다 ...^^; (7호선, 1227, 1224, 1141, 마을버스3,13,4 정보)

  


  또한 CALENDAR 탭의 달력은 개인일정 + 학교일정을 관리 할 수 있는 컨텐츠를

  제공하는 곳인데, 이런 저런 사정에 개발이 늦어 지고 있습니다.

   

   

  준비한 공지사항은 여기까집니다!.


  공지를 읽어주신 고마운 분들! 


  5월 남은 기간 동안 잘 지내셨으면 합니다. 


  감사합니다!


'과기DAY > Notice' 카테고리의 다른 글

개인정보 처리 방침  (0) 2018.05.15
과기DAY - 2.0v 업데이트  (2) 2016.11.06
과기DAY - 1.7v 업데이트  (0) 2016.07.03

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

Buy me a coffeeBuy me a coffee

오늘 포스팅은 많이 쓰이는 View 중 하나인


WebView에 대해서다.


인터넷을 볼 수 있는 브라우저를


안드로이드 view 형태로 본다고 생각하면 된다.


간단하게 쓰는법에 대해 알아볼 것 이다.


View 공간을 먼저 정해야 하므로 아래와 같이 Xml을 코딩한다.


notice_webView_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingLeft="50dp"
android:paddingRight="50dp"
android:paddingTop="100dp"
android:paddingBottom="100dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>

FrameLayout의 패딩값으로 webView의 크기를 정했다.


아래는 java 코딩이다.


MainActivity.java

WebView webView = findViewById(R.id.webView);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://www.naver.com");

간단한 코딩으로 네이버를 열어볼 수 있다.



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

Buy me a coffeeBuy me a coffee

재학중인 대학교를 졸업하기 위해서는, 공인 영어성적이 필수다. 


졸업하기 위해 오픽 시험을 치뤘다.


Self-Assessment 의 난이도는 3-3 으로 설정했고,


말인지 방군지 막 내뱉고 왔다.


정신없이 진행해 15문제 다 기억하진 못했다. 


내가 기억하는 문제는 아래와 같다.


1. 자기소개 하기.


2. 당신이 살고있는 곳은 어디이며, 살고있는곳을 설명해주세요.


3. 가족들이랑 모여서 무엇을 합니까? 또 얼마나 많이 합니까? 설명해주세요.


4. 좋아하는 카페에 대해서 그 이유와 구체적인 설명을 해주세요.


5. 좋아하는 카페는 언제 찾았습니까? 또 자주가는 이유가 무엇입니까? 얼마나 자주갑니까?


6. 취미생활로 음악감상을 골랐는데, 음악듣는걸 왜 좋아합니까?

   좋아하는 가수나, 밴드에 대해서 설명해주세요.


7. 음악 듣는건 언제부터 좋아하게 되었습니까?


8. 좋아하는 레스토랑은 어디에 위치해 있으며, 레스토랑은 어떤 메뉴를 제공하는지 상세히 설명해주세요.


9. 집에서 가장 좋아하는 방은 어디입니까? 또 개인 방을 가지고 있습니까? 묘사해주세요.


10. 가정하기를, 저는(면접관 Eva) 제가 좋아하는 콘서트를 가게 되었습니다. 저에게 질무 몇가지를 해주세요. 


11. 가정하기를, 당신은 수업에 늦었습니다. 

    그래서 당신의 친구에게 전화를 해야할 상황입니다. 이에 맞는 질문 몇개를 답해보세요.


12. 가정하기를 당신이 매우 중요한 퀴즈를 치루지 못했습니다.

    그래서 교수님에게 전화를 해야할 상황입니다. 이에 맞는 질문 몇개를 답해보세요.


13. 당신의 집근처가 어릴적부터 지금까지 어떻게 바뀌었는지 묘사해보세요.


14. 당신의 소중한 순간에 대해서 설명해보세요. 누굴만났는지, 무엇을 듣고있었는지, 어딜 갔는지 등

     최대한 상세하게 설명해보세요.


Survey의 선택에 따라 질문내용은 바뀌겠지만, 문제 스타일이 저렇다 라는걸 알기엔 충분한거 같다.


즉 자신이 조합 할 수 있는 문장을 미리 준비해가 잘 활용하는것이 현명한 것 같다.


왜냐하면 Survey에서 선택항목이 15개였는데 그중 3~5개 밖에 나오질 않았다.


따라서, 주제별로 스크립트를 준비하는 것은 비추이다. 


또한 오픽 채점기준에 있기를,암기한 티가 났을 경우는 Novice 성적을 준다고 한다.


--------------------------------------------------------------------------------------------------------

5월 16일 작성 



오픽 성적이 나왔습니다.


IM1 등급을 받게되었구요. 덕분에 졸업걱정은 문제없겠네요. 공부기간은 길진 않았습니다.(3일)


공부방법이 궁금하신 분은 댓글 달아주세요.



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

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

안드로이드 SQLite 2편이다.


1편은 아래의 링크로 가면 된다.


http://mommoo.tistory.com/20


1편에서는 SQLite를 쓰기위한 준비사항 과 개념에


관하여 다루었다.


이번 포스팅은 직접 사용 해볼 것이다.


내가 필요한 Column은 id와 pass 값이다.


테이블의 이름은 Info 로 할것이다.


해당 테이블을 만들기 위해


아래와 같이 코딩한다.


public class MommooDB extends SQLiteOpenHelper {
public MommooDB(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE Info"+"(id Text primary key, pass Text);";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
onCreate(db);
}
}


Info라는 db파일을 처음 접근할때 onCreate 메서드가 실행되고,


그 결과로 Info 테이블이 생성 될 것이다.


해당 쿼리문은 id 와 pass 를 문자열로 저장하고 id를 primary key로 지정하는 쿼리문이다.


사용하는 방법은 아래와 같다. 간단하게 insert 와 select를 해볼 것 이다.


ex ) insert



MommooDB mommooDB = new MommooDB(this,"Info",null,1);
SQLiteDatabase database = mommooDB.getWritableDatabase();
String id = "Mommoo";
String pass = "mm";
String sql = "insert into Info values('"+id+"','"+pass+"')";
database.execSQL(sql);



혹시, 버전을 바꾸고 싶으면 생성자안 4번째 인자만 바꿔주면 된다. ( 버전은 1이상만 가능)


ex) select


select를 할때는 일반적으로 아래와 같이 커서 클래스를 쓴다. 


MommooDB mommooDB = new MommooDB(this,"Info",null,1);
SQLiteDatabase database = mommooDB.getReadableDatabase();
String sql = "select * from Info where id='Mommoo'";
Cursor cursor = database.rawQuery(sql,null);
while(cursor.moveToNext()){
String id = cursor.getString(0);
String pass = cursor.getString(1);
}


cursor.moveToNext() 메서드를 통해, 테이블의 튜플 갯수만큼 루프를 돈다.


상황에 맞게 코딩하면 되겠다.





insert문은 mommooDB.getWritableDatabase(); 를 사용했고 select 문은 mommooDB.getReadableDatabase(); 를 사용했는데,


메서드명 에서도 알 수 있드시, 쓰기모드 읽기모드 이다. insert는 db값을 입력시켜야 하므로 쓰기모드를 사용했고,


select는 디비 튜플값만 불러오면 되므로 읽기모드를 사용한것이다.


위와같이 데이터베이스를 사요한 후 에는 꼭 아래와 같이 close를 해준다.



mommooDB.close();
database.close();
cursor.close();



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

Buy me a coffeeBuy me a coffee

+ Recent posts