오늘은 getColor 메서드에 대해 포스팅 합니다.


getColor 메서드는 안드로이드 value폴더에 colors.xml에 저장된


컬러값들을 가져오는 메서드입니다.


colors.xml에 저장할 시, 마치 전역변수처럼 값들을 호출 할 수 있기때문에


자주 쓰입니다. 쓰는법은 아래와 같습니다.


int color = context.getResource().getColor(R.color.자신의ID값); 


만약 액티비티 메서드 안이라면, 이미 context정보가 있기때문에


int color = (this).getResource().getColor(R.color.자신의ID값);


이렇게 쓰입니다. 하지만 API23에서 getColor 메서드는 depercated 되었습니다.


따라서 getColor 메서드 대신 아래의 메서드를 사용하여 deprecated에 대응해야 합니다.


int color = ContextCompat(context,R.color.자신의ID값);


마찬가지로 액티비티 메서드 안 이라면, context 대신에 this를 쓰면 되겠지요.





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

Buy me a coffeeBuy me a coffee

해당 메서드는 액티비티를 상속 받았을시 사용가능하다.


비슷한 메서드로는 startActivity가 있다. 해당 메서드는 매개변수로 intent를 받는다.


기존 액티비에에서 새로운 액티비티를 생성할시 사용한다. 이때 기존 액티비티의 정보를


새로운 액티비티로 전달 할 시 intent객체에 putExtra 메서드로 정보들을 전달한다. 


오늘 알아볼 메서드 startActivityForResult는 메서드 이름에서도 알 수 있드시, 액티비티를 생성한 후


생성한 액티비티가 종료됬을시, 기존 액티비티에게 신호를 주기 위한 메서드 이다.


처음 액티비티의 이름을 MainActivity, 생성할 액티비티 이름을 SubActivity라 칭하겠다.


startActivityForResult 메서드의 매개변수는 intent와,


하나의 메인 액티비티에서 여러개의 액티비티를 실행 시켰을 경우 구분지을 int형 변수 


이렇게 2개를 받는다. 신호를 받은 후 처리 하는곳은 onActivityResult 메서드 이다. 


사용방법은 이렇다. 


MainActivity.java


....


...

Intent intent = new Intent(MainActivity.this,SubActivity.class);

intent.putExtra("code", 1);    //이런식으로 액티비티에 정보를 보낸다.

startActivityForResult(intent , 0);


@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data){

super.onActivityResult(requestCode, resultCode, data);


// ....... 여기서 하고싶은 행위를 작성하면 된다.


}



SubActivity.java


....


...


@Override

protected void onDestroy(){      //액티비티가 종료될 때의 메서드

super.onDestroy();

setResult( 0 ); // 여기에 넣는 int형 정수는 MainActivity의 onActivityResult안에서 requestCode로 들어간다.

}




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

Buy me a coffeeBuy me a coffee




  안드로이드 UI의 상태나 가벼운 정보등은 SharedPreference(이하 S.P로 칭한다.)를 사용한다. 


db와 달리 번거롭지않고 사용하기 간편하기 때문이다. 


하지만 단점이 있다. xml형태로 저장하므로, 데이터 누적이 많아 지면 DB에 비해 성능이 떨어진다.


성능이 떨어지는 이유는 당연 인덱싱 문제가 아닐까 싶다. db같은 경우는 query로 손쉽게 원하는 데이터를 뽑아와


작업하지만, S.P 방식은 데이터 전부를 뽑아와 key값을 하나 하나 비교하기 떄문이라고 생각한다.


즉, 사용목적에 따라 두가지 기능(S.P , DB)을 적절히 사용 할 필요가 있겠다.


이번 포스팅은 db를 사용 할 것이다. 안드로이드는 SQLite이라는 내부 db를 제공해준다.


기본적인 셋팅은 아래와 같다.


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) {

}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
onCreate(db);
}

} 


SQLiteOpenHelper클래스를 상속받은 자신의 클래스를 만든다.


필수적으로 부모생성자와, onCreate, onUpgrade 이렇게 3가지를 적어줘야 한다.


필수 부모 생성자로 Context, 디비명, 커서, 버전을 아규먼트로 넘겨줘야한다.


여기서 Context는 안드로이드의 Context정보를 의마하고, 디비명은 자신의 데이터베이스 파일명을 의미한다.


커서는 db데이터를 다룰 때 쓰는데, 


자신의 만든 커스텀 커서가 있을경우 선언해주고 기본 커서를 사용할 경우는 null로 해준다.


마지막 매개변수는 버전이다. 같은 디비명이라도 버전이 틀리면 다른 디비로 간주 할 수 있다.


onCreate메서드는 혹, 자신이 호출하는 db명이 없는 경우 호출된다. 즉 새로운 디비를 만들때 


CREATE DB명 느낌보다는, db이름을  생성자에의 아규먼트로 넣어 실행했을 경우에


db명이 없을경우 onCreate메서드가 호출되고, db명이 있는경우는 호출하지 않는다.


따라서 db안의 table을 onCreate안에다가 관리하면 편하다.


onUpgrade메서드는 db명은 있지만 버전이 다른 경우에 호출돤다. 


즉 자신이 만든 db에 새로운 table을 추가한다거나


삭제같은 경우가 있을때, 자신의 디비의 버전을 올려주고 메서드 안에다가 새로운 작업을 하면 되겠다.


필자 같은 경우에 필요한 DB 정보는 id와 pass 데이터다. id와 pass 칼럼을 가지는 테이블을 작성해보겠다.


다음 포스팅때 마저 하겠다.




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

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

 오늘은 XML ( eXtensible Markup Language) 에 대해 포스팅 하겠다.


필자가 XML을 처음 본곳은 안드로이드 프로그래밍을 처음 접했을 때 이다.


안드로이드 프로그래밍은 기본적으로 JAVA언어를 채택하여 기능들 을 JAVA로 


작성을 하지만, 스마트폰화면에 보여지는 View 부분을 xml을 통해 코딩할 수 있다.


이때 당시만 하더라도, xml이 뭔지 모르고 사용했었다. 하지만 xml은 안드로이드 뿐 아니라,


여러방면으로 사용된다.(특히 웹에서 많이 사용된다.)



 XML이 뭔지 알아보자. 


먼저 풀네임을 먼저 해석 해보자. eXtensible Markup Language  => 확장될수 있는 표시 언어


이정도로 해석가능 할 것이다. Markup Language의 예로는 우리가 아는 언어인 HTML이 있다.


XML 과 HTML 로 예를들어 XML을 설명하려고 한다.


같은 Markup Language라, 생긴건 비슷하지만 큰 차이점이 존재한다. HTML의 태그는 이미 약속한 태그들만


사용 가능하다. 예를들어 <h1></h1> => 글자크기를 키우는 태그.   와 같이 이미 만들어서 제공되는 태그만


사용해야 한다. 하지만, XML 태그는 사용자임의로 만들 수 있다. 


그렇다면 XML 태그는 왜 사용자가 임의로 만들게 했는지 생각을 해봐여한다. 


XML는 어떠한 데이터를 설명하기 위해 이름을 임의로 지은 태그로 데이터를 감싼다. 


즉 태그로 데이터 설명을 하는것이다. 이 부분에서 데이터의 표시(Markup)가 되고,


더 필요한 데이터가 생길시 태그추가나, 태그안의 내용을 추가할수 있다는 특징이 있다.(Extensible)


아래의 예를 보자.


<? xml version="1.0"?>

<컴퓨터언어>

<C언어> C       </C언어>

<C언어> C++    </C언어>

<C언어> C#     </C언어>

<JAVA> java     </JAVA>

<JAVA> android </JAVA>

</컴퓨터언어>


컴퓨터언어라는 태그아래 C언어 태그와 JAVA 태그가 있으며 각 태그에 맞는 메타 정보들이 배치되어 있다.


이런식으로 XML은 우리가 필요한 정보들을 받거나 줄 수 있는 데이터형태를 제공해준다.


만약 HTML로 저러한 정보를 작성하려 했다 하면 어떨까? 


C,C++ 과 같은 메타 정보등은 얻을 수 야 있겠지만, 데이터를 설명해주는 정보는 없을 것이다.



 이와 같이 xml은 정보들을 태그로써 마크하여 필요한 내용을 안에 적는 양식이다. 


안드로이드를 해본 사람이라면 안드로이드의 xml도 똑같이 이해해보길 바란다. 이해가 갈 것이다.


위 글을 다 읽을 시간이 없는 독자를 위해 간단하게 정리하자면 아래와 같다.


* 텍스트 기반이며 간결한 데이터형이다.


* 웹에서 디스플레이 표준을 HTML로 한것처럼 데이터의 표준으로 만들기 위한 노력이 있음.


* 마크업언어(HTML)가 아니라 마크업언어를 정의하기 위한 언어이다.


* 자신의 어플리케이션에 적합하게 작성 가능 하다. 

(어플리케이션은 앱을 뜻하는 용어가 아니다. http://mommoo.tistory.com/11 참고.)



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

List와 Map의 차이 (2)  (0) 2016.04.27
List와 Map의 차이 (1)  (0) 2016.04.26
상수(constant) 와 리터럴(literal)이란?  (16) 2016.01.06
Wrapper class(래퍼 클래스) 란?  (0) 2015.12.24
API란?  (0) 2015.12.17

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

Buy me a coffeeBuy me a coffee

오늘은 자바의 익명클래스(Anonymous Class) 혹 무명클래스 에 관해 포스팅을 할 것이다.


익명클래스는 말 그대로 익명의 성질을 가진 클래스라는 뜻이다. 즉 이름이 없는 클래스라고 불리우는데,


'이름이 없는' 이란 의미를 잘 생각해봐야 한다. 아래의 예시를 보자.


public class Test{
    private int num = 1;
    public int getNum(){
        return this.num;
    }
    public void setNum(int num){
        this.num = num;
    }
}

Test란 클래스이다. 멤버변수 num 을 private로 접근을 제어한 후,


게터와 세터로 멤버변수를 접근할 수 있도록 만들었다.



    Test t1 = new Test();

평상시 처럼 인스턴스를 사용할땐 위와 같이 사용한다. 


여기서의 인스턴스 (new Test())는 클래스 이름 'Test'라고 불리운다.


즉 우리가 노말하게 쓰는 인스턴스는 '이름이 있는 클래스' 인것이다.


그렇다면 '이름이 없는 클래스'는 무엇을 의미하는 것 일까? 


위에서 설명한 이름이 있는 클래스의 반대 경우이다. 


즉 Test와 같은 클래스이름 자체가 없는 클래스를 의미한다. 아래의 예시를 보자.


     Test t1 = new Test(){
         public int num = 10;
         @Override
         public int getNum(){
             return this.num;
         }
     };                

바로 위의 소스코드랑은 비슷하면서도 다른점이 있다. 다른점은 인스턴스 옆에 블럭이 있다는 점이겠다.


언뜻 보면 new Test()라는 소스코드 때문에 이 인스턴스는 Test의 이름을 가질 것 같지만,


결코 아니다. 이 인스턴스야 말로 정말 어떠한 이름도 없는 인스턴스 인 것이다.


해당 주장이 맞는 주장인지 근거를 제시해보겠다.


먼저, 해당 인스턴스의 블럭안에는 @Override 어노테이션 주석이 존재한다. 즉, 원래의 Test 클래스에


존재하던 getNum 메서드가 아닌 재정의된 메서드 인점,


또한, 이 인스턴스의 this.num을 출력했을 경우 10이 나온다는 점이다. 


오히려 이 인스턴스는 Test 클래스를 상속받은 클래스라고 바꿔 말해도 될 것이다. 


평소에 자바언어를 사용하는 사용자라면, 상속을 어떻게 쓰는지 알 것이다.


클래스명 extends 상속받을 클래스     구조로 사용하는데 위의 소스 코드는 클래스명이 존재 하지 않고


무명의 어떠한 클래스가 부모클래스로 부터(Test) 상속을 받은 인스턴스 인 것이다.


즉 이름이 없으므로 생성자를 선언 할 수도 없는것이다.


왜 이름이 없는 클래스라고 불리우는지 감이 잡히는가?



익명클래스에 대해 간단하게 알아보았다. 현재 함수형 프로그래밍이 유행하고 있다.


자바에서는 함수를 일급객체로 취급하지 못하지만, 위에서와 같이 익명클래스를 사용하면


메서드 자체는 못넘기되 메서드를 감싼 익명클래스를 넘길 수 는 있다. 


즉, 익명클래스로 자바도 함수형 프로그래밍 흉내를 낼 수 있다고 생각한다.



'Java' 카테고리의 다른 글

JAVA Static이란?  (2) 2016.03.29
자바 enum 열거형  (0) 2016.01.27
JAVA의 삼항연산자  (4) 2015.12.11
JAVA의 생성자 (2)  (2) 2015.11.17
JAVA의 생성자 (1)  (0) 2015.11.12

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

Buy me a coffeeBuy me a coffee

제이쿼리로 이미지 슬라이더를 만들어보자. 완성 결과물은 아래 동영상과 같다.




디자인은 신경쓰지 않았다, 원형 이미지가 왼쪽,오른쪽 버튼을 누를 시 이동하며 커지는 형식의 슬라이더이다. 


간단한 네비게이션도 제공하게끔 만들었다.(이미지 아래의 원형 index와 해당 이미지의 title)


이미지 슬라이더를 만들기 앞서, css와 html부터 살펴보자.


    


body 태그는 아래의 내용을 작성한다.


    


위의 태그까지 빠짐 없이 적었다면, 헤더(빨간색), 내용이 들어갈 컨테이너(파란색),

푸터(노란색), 푸터안에있는 네비게이션 공간(초록) 이렇게 4개로 공간이 분할된 걸 볼 수 있다.


태그를 동적으로 사용하기 위해 <div> 태그로 분할을 하였으며, 앞으로도 


동적 태그는 div태그만을 쓸 예정이다. css를 설명하자면, body 태그안에 있는 div 태그들의 class이름


에 맞춰 스타일을 정의 한 것이다. class이름을 쓸때는 css에 .(클래스이름) id이름을 쓸때는 #(id이름) 이렇게


접근하면 되겠다. 다음 포스팅에서 계속 이어 나가겠다.




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

Buy me a coffeeBuy me a coffee


 상수(constant)리터럴(literal)에 대해 들어본적이 있는가?


만약, 프로그래밍을 어느정도 해왔던 사람이면 한번쯤은 들어봤을만한 용어 들 이다.


하지만 두 용어를 같은 의미로 사용하는 사람들이 많다. 


하지만, 엄연히 따지자면 확실한 차이점이 존재한다.


오늘은 두 용어에 대해 정확한 뜻을 포스팅 하고자 한다. 



상수(Constant)란?



  먼저 상수와 리터럴 둘 다, 변하지 않는 값(데이터)를 의미한다. 


코드적으로 말하자면, 상수는 변하지 않는 변수를 뜻한다.


상수는 숫자만 넣어야 한다고 오해하는 사람들이 많은데,


앞서 말했듯이, 상수는 변하지 않는 변수를 뜻하는 것이다.


즉 상수에 넣는 데이터는 숫자가 올 수 도 있지만,


클래스나 구조체 같이 기본형에서 파생된 객체나 유도형같은 데이터를 넣을 수 있다. 


상수는 데이터가 변하지 않아야 한다고 했다. 그래서 


참조변수를 상수로 지정 할 때, 참조변수에 넣은 인스턴스 안의 데이터 까지도 변하지 않는 줄 착각 할 수 있지만,


참조변수가 상수(참조변수 메모리의 주소값이 변하지 않는다라는 의미)지, 


그 주소가 가리키는 데이터들까지 상수라는 의미가 아니다.


프로그래밍에서 상수를 쓸때는 C,C++,C#은 const , Java는 final 제어자를 쓴다.


Java언어로 예를 들어보자.


즉 Test라는 클래스를 만들었다면, 


final Test t1 = new Test();


t1 = new Test();


는 불가 하지만,


t1.num = 10;


이렇게 클래스 안의 데이터를 변경해도 상관이 없다는 의미이다.



리터럴(Literal)이란?



  리터럴은 데이터 그 자체를 뜻 한다. 


변수에 넣는 변하지 않는 데이터를 의미하는 것이다.


아래의 예제를 보자.


int a = 1;


int 앞에 final를 붙일 시 , a는 상수가 된다. 여기서의 리터럴은 1이다.


즉, 1과 같이 변하지 않는 데이터(boolean, char, double, long, int, etc...)를 리터럴(literal)이라고 부른다.


그렇다면 인스턴스(클래스 데이터)가 리터럴이 될 수 있을까?


답은 아니오다. 만약 인스턴스안에 있는 값들을 변경하지 않는다면 모를까,


보통의 인스턴스는 동적으로 사용하기 위해 작성되므로.


리터럴이 될 수가 없다. 왜냐하면 값이 언제 바뀔지 모르는 것이기 때문이다.


하지만 프로그래밍 에서 객체 리터럴이란 표현을 들어본적이 있을 것이다.


데이터가 변하지 않도록 설계를 한 클래스를 불변 클래스라 칭한다.(immutable class)


해당 클래스는 한번 생성하면 객체 안의 데이터가 변하지 않는다. 변할 상황이면 새로운 객체를 만들어준다.


자바의 String, Color 같은 클래스가 이와 같은 예이다. 


따라서 우리는 "abc" 와 같은 문자열을 자바에서는 '객체 리터럴' 짧게는 '리터럴' 이라고 표현 하는것이다.




여기까지가 준비한 상수와 리터럴의 내용이다. 


정리하자면 상수는 변하지 않는 변수를 의미하며(메모리 위치) 메모리 값을 변경할 수 없다.


리터럴은 변수의 값이 변하지 않는 데이터(메모리 위치안의 값)를 의미한다. 


보통은 기본형의 데이터를 의미하지만, 특정 객체(Immutable class , VO class)에 한에서는 리터럴이 될 수 있다.




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

List와 Map의 차이 (2)  (0) 2016.04.27
List와 Map의 차이 (1)  (0) 2016.04.26
XML 이란?  (9) 2016.01.26
Wrapper class(래퍼 클래스) 란?  (0) 2015.12.24
API란?  (0) 2015.12.17

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

Buy me a coffeeBuy me a coffee

+ Recent posts