안드로이드 설계/코드 노하우

         안드로이드사이드 운영자


                  한동호




           www.androidside.com
안드로이드 개발 단계




 아이디어        기획   개발   테스트        릴리즈




        설계                   코드
좋은 설계에 집중하라.
설계



좋은 설계에 집중하라.

  변경이 유연한 설계를 하라.

    초반부터 성능을 고려하지 말라.

       필요한 기능에 집중하라.
설계시 꼭 지켜야 할 5가지
설계시 꼭 지켜야 할 5가지

1. UI 스레드는 UI만 처리하게 하라.
설계시 꼭 지켜야 할 5가지

2. 사용자를 방해하지 말라.
설계시 꼭 지켜야 할 5가지

3. 다양한 화면 해상도를 지원하라.
다양한 화면 해상도를 지원하는 방법 4가지


1) wrap_content, fill_parent와 DIP를 사용하라.


layout_width="100dip“

= 100 pixels on an HVGA@160 density
= 150 pixels on a WVGA@240 density

* 사용자가 보기에는 거의 동일한 크기로 보여짐
다양한 화면 해상도를 지원하는 방법 4가지


2) AbsoulteLayout을 사용하지 말아라.
   1.5에서 deprecated된 클래스


* FrameLayout과 이 레이아웃의
layout_margin 속성으로 동일한 화면을 구성할 수 있음
다양한 화면 해상도를 지원하는 방법 4가지


3) 코드에서 픽셀로 크기를 지정하지 말아라.
   안드로이드는 내부적으로 픽셀을 기본 단위로 사용



* 필요하다면 DIP를 PIXEL로 변경해야 함
다양한 화면 해상도를 지원하는 방법 4가지


4) 화면 해상도에 맞게 다양한 리소스를 제공하라.




* 다양하게 제공할 수 없을 경우에는 HDPI를 제공함
다양한 화면 해상도를 지원하는 방법



텍스트를 지정할 때 사용해야 하는 단위는?

SP : 사용자 설정에 따라 텍스트 크기 변경됨.
     (Scale-independent pixel)

DP : 사용자 설정에 따라 텍스트 크기 변경되지 않음.
    (Density-independent pixel)
설계시 꼭 지켜야 할 5가지

4. 네트워크는 항상 느리다고 가정하라.



                3G




                 WiFi
설계시 꼭 지켜야 할 5가지

5. 다양한 하드웨어에 대비하라.

  터치스크린

  키보드

  센서
좋은 코드를 작성하라.
좋은 코드를 작성하라.



모바일 기기에서 어떤 코드가 좋은 코드일까?

  CPU

  메모리

  가독성
코드



좋은 코드를 작성하라.

  필요한 기능을 최대한 간결히 작성하라.

    클래스/메소드/변수 이름을 명확히 하라.

      코드를 어렵게/복잡하게 작성하지 말아라.
코드 작성시 알아둬야 할 10가지
1. 객체는 최대한 적게 생성하라.
1. 객체는 최대한 적게 생성하라.


static 메소드를 사용해서 객체 생성을 줄일 수 있다.


int myNum = Integer.valueOf("123").intValue();




int myNum = Integer.parseInt("123");
1. 객체는 최대한 적게 생성하라.


반복문에서는 객체 생성을 줄여야 한다.
String result = "";

for (int i = 0; i < 10; i++) {
   String temp = new String("" + i);
   result += temp;
}




StringBuffer result = new StringBuffer();

for (int i = 0; i < 10; i++) {
   result.append("" + i);
}
1. 객체는 최대한 적게 생성하라.


객체를 재사용한다.

StringBuffer total = new StringBuffer();
total.append("PRE");
//....
total = new StringBuffer();
total.append("AFTER");




StringBuffer total = new StringBuffer();
total.append("PRE");
//....
total.setLength(0);
total.append("AFTER");
2. 불필요한 코드는 제거하라.
2. 불필요한 코드는 제거하라.


    쓸데없는 캐스팅을 줄여야 한다.

                                                       String val = null;

for (int i = 0; i < vect.size(); i++) {                for (int i = 0; i < vect.size(); i++) {
   if ( ((String) vect.get(i)).equals("1")) {             val = (String) vect.get(i);
       //처리
   } else if ( ((String) vect.get(i)).equals("2")) {       if ( val.equals("1")) {
       //처리                                                    //처리
   } else if ( ((String) vect.get(i)).equals("3")) {       } else if (val.equals("2")) {
       //처리                                                    //처리
   }                                                       } else if (val.equals("3")) {
}                                                              //처리
                                                           }
                                                       }
3. 구현 타입을 사용하라.
3. 구현 타입을 사용하라.




List list1 = new ArrayList();
List list2 = new Vector();
Map map1 = new Hashtable();




ArrayList list1 = new ArrayList();
Vector list2 = new Vector();
Hashtable map1 = new Hashtable();
4. 메소드는 정적 메소드로 선언하라.
4. 메소드는 정적 메소드로 선언하라.


class State {
   int currentNum;

    public int getMaxNum() {
      return 100;
    }
}




class State {
   int currentNum;


    publicstatic int getMaxNum() {
      return 100;
    }
}
5. 클래스 내에서는 Getter와 Setter를 사용해서 변수에 접근하지 말아라.
5. 클래스 내에서는 Getter와 Setter를 사용해서 변수에 접근하지 말아라.




class Person {
   int age;
                                       class Person {
     private int getAge() {               int age;
        return age;
     }                                     public int getPersonAge() {
                                             if (age < 0) return 0;
     public int getPersonAge() {             else return age;
         if (getAge() < 0) return 0;       }
         else return getAge();         }
     }
}
6. 값이 고정된 변수는 상수로 선언하라.
6. 값이 고정된 변수는 상수로 선언하라.



static int intVal = 42;

static String strVal = "Hello, world!";




static final int intVal = 42;

static final String strVal = "Hello, world!";
7. enum은 되도록 사용하지 말아라.
7. enum은 되도록 사용하지 말아라.



enum Season {
    SPRING(1), SUMMER(2),
                               class WINTER {
    FALL(3), WINTER(4);          class FALL {
                                   class SUMMER { num;
                                   private final int
                                     class SPRINGint num;
                                     private final {
                                       private final int num;
    private final int num;               private final int num;
                                   private WINTER(int num){
                                     private FALL(int num){
                                       this.num = num;
                                       private SUMMER(int num){
    private Season(int num){             this.num = num;
                                         private SPRING(int num){
                                   }       this.num = num;
       this.num = num;               }      this.num = num;
                                       }
    }                                    }
                                   public int getNum() {
                                     public int getNum() {
                                       return num;
                                       public int getNum() {
    public int getNum() {                return num;
                                         public int getNum() {
                                   }       return num;
      return num;                    }      return num;
                               }       }
    }                            }       }
                                   }
}                                    }
8. 부동소수형은 되도록 사용하지 말아라.
8. 부동소수형은 되도록 사용하지 말아라.


정수형이 부동소수형보다 일반적으로 2배 더 빠르다.



 부동 소수형                 정수형


 float                  int

 double                 long
9. 네티브 코드는 되도록 사용하지 말아라.
9. 네티브 코드는 되도록 사용하지 말아라.


JNI – Java Native Interface

자바에서 C/C++를 호출하기 위한 메커니즘


자바보다 더 나은 속도를 위해 사용됨.
하드웨어를 제어하는 용도로 사용됨.


디바이스에 따라 호홖되지 않을 수 있음.

디버깅을 하는 것이 쉽지 않음.
10. 자바의 코드 노하우가 반드시 안드로이드의 코드 노하우는 아니다.
10. 자바의 코드 노하우가 반드시 안드로이드의 코드 노하우는 아니다.




가독성을 위해 중첩 클래스를 사용하지 마라.


클래스는 되도록 작게 생성하라.                 x
오늘의 내용을 한 마디로 정리하자면…..




           작은 차이가 큰 차이를 만듭니다.
감사합니다.
   한동호

안드로이드 설계코드 노하우 및 개발방법

  • 1.
    안드로이드 설계/코드 노하우 안드로이드사이드 운영자 한동호 www.androidside.com
  • 2.
    안드로이드 개발 단계 아이디어 기획 개발 테스트 릴리즈 설계 코드
  • 3.
  • 4.
    설계 좋은 설계에 집중하라. 변경이 유연한 설계를 하라. 초반부터 성능을 고려하지 말라. 필요한 기능에 집중하라.
  • 5.
  • 6.
    설계시 꼭 지켜야할 5가지 1. UI 스레드는 UI만 처리하게 하라.
  • 7.
    설계시 꼭 지켜야할 5가지 2. 사용자를 방해하지 말라.
  • 8.
    설계시 꼭 지켜야할 5가지 3. 다양한 화면 해상도를 지원하라.
  • 9.
    다양한 화면 해상도를지원하는 방법 4가지 1) wrap_content, fill_parent와 DIP를 사용하라. layout_width="100dip“ = 100 pixels on an HVGA@160 density = 150 pixels on a WVGA@240 density * 사용자가 보기에는 거의 동일한 크기로 보여짐
  • 10.
    다양한 화면 해상도를지원하는 방법 4가지 2) AbsoulteLayout을 사용하지 말아라. 1.5에서 deprecated된 클래스 * FrameLayout과 이 레이아웃의 layout_margin 속성으로 동일한 화면을 구성할 수 있음
  • 11.
    다양한 화면 해상도를지원하는 방법 4가지 3) 코드에서 픽셀로 크기를 지정하지 말아라. 안드로이드는 내부적으로 픽셀을 기본 단위로 사용 * 필요하다면 DIP를 PIXEL로 변경해야 함
  • 12.
    다양한 화면 해상도를지원하는 방법 4가지 4) 화면 해상도에 맞게 다양한 리소스를 제공하라. * 다양하게 제공할 수 없을 경우에는 HDPI를 제공함
  • 13.
    다양한 화면 해상도를지원하는 방법 텍스트를 지정할 때 사용해야 하는 단위는? SP : 사용자 설정에 따라 텍스트 크기 변경됨. (Scale-independent pixel) DP : 사용자 설정에 따라 텍스트 크기 변경되지 않음. (Density-independent pixel)
  • 14.
    설계시 꼭 지켜야할 5가지 4. 네트워크는 항상 느리다고 가정하라. 3G WiFi
  • 15.
    설계시 꼭 지켜야할 5가지 5. 다양한 하드웨어에 대비하라. 터치스크린 키보드 센서
  • 16.
  • 17.
    좋은 코드를 작성하라. 모바일기기에서 어떤 코드가 좋은 코드일까? CPU 메모리 가독성
  • 18.
    코드 좋은 코드를 작성하라. 필요한 기능을 최대한 간결히 작성하라. 클래스/메소드/변수 이름을 명확히 하라. 코드를 어렵게/복잡하게 작성하지 말아라.
  • 19.
  • 20.
    1. 객체는 최대한적게 생성하라.
  • 21.
    1. 객체는 최대한적게 생성하라. static 메소드를 사용해서 객체 생성을 줄일 수 있다. int myNum = Integer.valueOf("123").intValue(); int myNum = Integer.parseInt("123");
  • 22.
    1. 객체는 최대한적게 생성하라. 반복문에서는 객체 생성을 줄여야 한다. String result = ""; for (int i = 0; i < 10; i++) { String temp = new String("" + i); result += temp; } StringBuffer result = new StringBuffer(); for (int i = 0; i < 10; i++) { result.append("" + i); }
  • 23.
    1. 객체는 최대한적게 생성하라. 객체를 재사용한다. StringBuffer total = new StringBuffer(); total.append("PRE"); //.... total = new StringBuffer(); total.append("AFTER"); StringBuffer total = new StringBuffer(); total.append("PRE"); //.... total.setLength(0); total.append("AFTER");
  • 24.
  • 25.
    2. 불필요한 코드는제거하라. 쓸데없는 캐스팅을 줄여야 한다. String val = null; for (int i = 0; i < vect.size(); i++) { for (int i = 0; i < vect.size(); i++) { if ( ((String) vect.get(i)).equals("1")) { val = (String) vect.get(i); //처리 } else if ( ((String) vect.get(i)).equals("2")) { if ( val.equals("1")) { //처리 //처리 } else if ( ((String) vect.get(i)).equals("3")) { } else if (val.equals("2")) { //처리 //처리 } } else if (val.equals("3")) { } //처리 } }
  • 26.
    3. 구현 타입을사용하라.
  • 27.
    3. 구현 타입을사용하라. List list1 = new ArrayList(); List list2 = new Vector(); Map map1 = new Hashtable(); ArrayList list1 = new ArrayList(); Vector list2 = new Vector(); Hashtable map1 = new Hashtable();
  • 28.
    4. 메소드는 정적메소드로 선언하라.
  • 29.
    4. 메소드는 정적메소드로 선언하라. class State { int currentNum; public int getMaxNum() { return 100; } } class State { int currentNum; publicstatic int getMaxNum() { return 100; } }
  • 30.
    5. 클래스 내에서는Getter와 Setter를 사용해서 변수에 접근하지 말아라.
  • 31.
    5. 클래스 내에서는Getter와 Setter를 사용해서 변수에 접근하지 말아라. class Person { int age; class Person { private int getAge() { int age; return age; } public int getPersonAge() { if (age < 0) return 0; public int getPersonAge() { else return age; if (getAge() < 0) return 0; } else return getAge(); } } }
  • 32.
    6. 값이 고정된변수는 상수로 선언하라.
  • 33.
    6. 값이 고정된변수는 상수로 선언하라. static int intVal = 42; static String strVal = "Hello, world!"; static final int intVal = 42; static final String strVal = "Hello, world!";
  • 34.
    7. enum은 되도록사용하지 말아라.
  • 35.
    7. enum은 되도록사용하지 말아라. enum Season { SPRING(1), SUMMER(2), class WINTER { FALL(3), WINTER(4); class FALL { class SUMMER { num; private final int class SPRINGint num; private final { private final int num; private final int num; private final int num; private WINTER(int num){ private FALL(int num){ this.num = num; private SUMMER(int num){ private Season(int num){ this.num = num; private SPRING(int num){ } this.num = num; this.num = num; } this.num = num; } } } public int getNum() { public int getNum() { return num; public int getNum() { public int getNum() { return num; public int getNum() { } return num; return num; } return num; } } } } } } } }
  • 36.
    8. 부동소수형은 되도록사용하지 말아라.
  • 37.
    8. 부동소수형은 되도록사용하지 말아라. 정수형이 부동소수형보다 일반적으로 2배 더 빠르다. 부동 소수형 정수형 float int double long
  • 38.
    9. 네티브 코드는되도록 사용하지 말아라.
  • 39.
    9. 네티브 코드는되도록 사용하지 말아라. JNI – Java Native Interface 자바에서 C/C++를 호출하기 위한 메커니즘 자바보다 더 나은 속도를 위해 사용됨. 하드웨어를 제어하는 용도로 사용됨. 디바이스에 따라 호홖되지 않을 수 있음. 디버깅을 하는 것이 쉽지 않음.
  • 40.
    10. 자바의 코드노하우가 반드시 안드로이드의 코드 노하우는 아니다.
  • 41.
    10. 자바의 코드노하우가 반드시 안드로이드의 코드 노하우는 아니다. 가독성을 위해 중첩 클래스를 사용하지 마라. 클래스는 되도록 작게 생성하라. x
  • 42.
    오늘의 내용을 한마디로 정리하자면….. 작은 차이가 큰 차이를 만듭니다.
  • 43.