본문 바로가기
안드로이드

[안드로이드] final을 쓰는 이유

by 딩박사 2023. 1. 13.
반응형

* 본 포스팅은 필자가 개인적으로 학습한 내용정리 및 리뷰를 위해 포스팅합니다.


  • ViewFlipper를 사용하여 촬영한 사진을 보여주고 여기에 사진의 저장기능을 추가하는 코드의 일부분이다.

 

// 호출할 다이얼로그 함수를 정의.
public void callFunction(ArrayList<Bitmap> bitmaps) {
//커스텀 다이얼로그를 정의하기 위해 Dialog클래스 생성
final Dialog dlg = new Dialog(context);
//액티비티의 타이틀바를 숨김
dlg.requestWindowFeature(Window.FEATURE_NO_TITLE);
dlg.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
//커스텀 다이얼로그의 레이아웃 설정
dlg.setContentView(R.layout.pictureview_dialog);
//커스텀 다이얼로그 노출
dlg.show();
//ViewFlipper 객체 참조
flipper = (ViewFlipper)dlg.findViewById(R.id.flipper);
viewpicture_dialog_count = (TextView) dlg.findViewById(R.id.viewpicture_dialog_count);

- 위 코드는 앞서 촬영한 Bitmap의 사진을 flipper로 띄우는 과정의 일부분의 코드이다.



//저장기능 추가
viewpicture_dialog_imagesave.setOnClickListener(new View.OnClickListener() {
	@Override
    public void onClick(View view) {
    	AlertDialog.Builder builder = new AlerDialog.Builder(context);
        builder.setTitle("사진저장");
        builder.setMessage("사진을 저장 하시겠습니까?);
        builder.setPositiveButton("저장", new DialogInterface.OnClickListener() {
        	public void onClick(DialogInterface dialog, int which) {
            	imageView.setImageBitmap(bitmaps.get(flipper.getDisplayedChild()));
                dlg.dismiss();
            }
        });
        builder.setNegativeButton("취소", new DialogInterface.OnClickListener() {
        	public void onClick(DialogInterface dialog, int which) {
            }
        });
        builder.show();
    }
});

- flipper내의 저장 버튼을 눌렀을 때의 실행 코드이다.

 

  • callFunction()의 내부에 포함되어 있으며 받아온 bitmaps를 이용하려 했지만 imageView.setImageBitmap 내에서 bitmaps가 에러가 발생한다. 알아보니 이유는 간단했다
  • bitmaps는 전역변수도 아니고 onClick()의 지역변수도 아니다.
  • onClick()은 callFunction()이 실행될 때 실행되는 것이 아니라 클릭 이벤트가 발생 시 실행할 메서드로 등록할 뿐이다.
  • 에러의 발생이유는 bitmaps가 callFunction()이 리턴되면 사라지는 변수일 뿐이었다. 값을 참조할 수 없다
  • 하지만 여기서 bitmaps에 final을 붙이게 되면 변경 불가능한 상수가 되므로 존재하여 읽을 수 있게 된다.

 

public void callFunction(final ArrayList<Bitmap> bitmaps)
 
 

 

 

 

결론

리스너 내부에서 사용되거나 변수의 데이터 유지에 관하여 한번더 확인하고 final이라는 개념에 대해서 다시 한번 알게 되었다. 

 

반응형

댓글