parcelable, serializable, reflaction

2019. 10. 29. 09:43카테고리 없음

Serializable

  • implements Serial~ 로 구현
  • 다른 액티비티로 데이터 전달하기 위해 사용
  • reflection방법을 사용해 직렬화함

reflection

public class Car{
    public void drive(){

    }
}
public class Main{
    public static void main(String[] args){
        Object car = new Car();
        car.drive(); // 컴파일 에러
    }
}

reflection 잘못사용예

일반적으로 로그를 프린트할 때 클래스 이름을 알아내기 위해서 다음과 같이 Class 클래스를 많이 사용하게 됩니다.



this.getClass().getName()


이 방법을 사용한다고 해서 성능에 많은 영향을 미치지는 않습니다. 다만 getClass를 할 때 Class 객체를 만들고, 그 객체의 이름을 가져오는 메소드를 수행하는 시간과 메모리를 사용할 뿐입니다. 다음은 reflection을 잘못 사용한 예입니다.



public String checkClass(Object src) {
    if(src.getClass().getName().equals("java.math.BigDecimal")) {
    }
}


해당 객체의 클래스 이름을 알아내기 위해서 getClass().getName() 메소드를 호출하여 사용했습니다. 이렇게 사용할 경우 응답 속도에 그리 많은 영향을 주지는 않지만, 많이 사용하면 필요 없는 시간을 낭비하게 됩니다. 이러한 부분이 필요할 때에는 다음과 같이 수정하는 것이 좋습니다.



public String checkClass(Object src) {
    if(src instanceof java.math.BigDecimal) {
        // 데이터 처리
    }
    // 이하 생략
}


instanceof를 사용하면 소스가 훨씬 간략해지게 됩니다. 이부분이 많이 호출된다면 성능면에서도 향상을 가져올 수 있습니다.



출처: https://12bme.tistory.com/129 [길은 가면, 뒤에 있다.]

Parcelable

  • implements Parcelable
  • 이 녀석은 IPC ( Inter Process Communication ) 에 최적화됨
  • Serialize보다 속도가 빠름
  • 프로그래머가 직접 바로 셋팅함

BookData book = new BookData(); // 각 필드에 값을 넣어줌

Intent i = new Intent(this, ShowBook.class);
i.putExtra("bookInfo", book);
startActivity(i);

인텐트를 받을 ShowBook.java에서는 다음과 같이 Parcelable 오브젝트를 복구하면 된다.

Bundle bundle = getIntent().getExtras();
BookData book = bundle.getParcelable("bookInfo");

ArrayList인 경우는 Intent를 만들어 보내는 쪽에서는 다음과 같이 하면 된다.

ArrayList<BookData> bookList = new ArrayList<BookData>();
...
// bookList.add() 메소드를 사용해서 bookList에 BookData 엔트리를 추가
...

Intent i = new Intent(this, BookList.class);
i.putParcelableArrayListExtra("myBooks", bookList);
startActivity(i);

BookList.java (인텐트에 의해 호출되는 액티비티)에서는 다음과 같이 오브젝트를 복구하면 된다.

ArrayList<BookData> bookList;
...
Intent i = getIntent();
bookList = i.getParcelableArrayListExtra("myBooks");