메뉴 건너뛰기

조회 수 281 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

자바에서 익명 클래스(Anonymous Class)를 사용하는 방법에 대해 알아보겠습니다. 

interface Number
{
	public void DisplayNumber();
}

▼ 여기 Number Interface 하나가 있습니다. Number Interface를 상속받아 구현하는 Class는 DisplayNumber() Method를 구현하도록 강제합니다. 

public class Display
{
	private Number number;

	public Display(Number object)
	{
		this.number = object;
	}

	public void display()
	{
		this.number.DisplayNumber();
	}

}

▼ Display Class를 정의하였습니다. Display Class는 앞서 구현했던 Number Type의 Field를 가지고 있으며 생성자 함수를 통해 Number Interface를 상속받아 구현한 객체를 전달받아 number Field가 참조하도록 합니다. display() Method는 number 객체의 DisplayNumber() Method를 실행하는 Method입니다.

public class Test1 implements Number
{
	public void DisplayNumber()
	{
		System.out.println("12345");
	}
}

▼ 이제 Number Interface를 상속받아 구현하는 Class로 Test1 Class를 정의하였습니다. 

import java.util.*;

public class Sample
{
	public static void main(String[] args)
	{
		Display display = new Display(new Test1());

		display.display();
	}
}

▼Display의 객체를 생성하고 생성자 함수 인수로 Test1 객체를 넘겨줍니다. 그런 다음 display() Method를 호출하고 있습니다. 

 

 

자 이제 "12345"를 출력하는 것 말고 "6789"를 출력하고 싶으면 어떻게 해야 할까요? Number Interface를 상속받는 Class를 또 정의해야 할 것입니다. 

public class Test2 implements Number
{
	public void DisplayNumber()
	{
		System.out.println("6789");
	}
}
import java.util.*;

public class Sample
{
	public static void main(String[] args)
	{
		Display display = new Display(new Test2());

		display.display();
	}
}

▼ 또 다른 출력물을 만들고 싶다면? Number Interface를 상속받아 구현하는 Class를 계속 정의해야 합니다. 문제는 정의하는 Class가 재사용되는 Class도 아니며 단순히 Display 객체의 생성자 함수 인수로 사용될 뿐이기 때문에 매번 Class를 정의해주는 게 부담스럽습니다. 이때 익명 클래스를 활용하면 따로 Class를 정의하지 않고도 객체를 생성할 수 있습니다.

import java.util.*;

public class Sample
{
	public static void main(String[] args)
	{
		Display display1 = new Display(new Number(){
			public void DisplayNumber()
			{
				System.out.println("12345");
			}
		});

		display1.display();
	}
}

▼ Number Interface를 상속받는 Class를 정의하는 대신 생성자 인자로 new Number(){ 오버라이딩 해야 할 Method 구현 } 형태로 작성하였습니다. 이런 식으로 작성하게 되면 Number Interface를 상속받아 오버라이딩하는 Class를 정의해줄 필요 없이 객체 생성이 가능합니다.


안드로이드는 익명 클래스를 활용한 코드가 많습니다. 대표적으로 이벤트 리스너를 등록할 때입니다. Button의 Click 이벤트를 등록하기 위해 View.onClickListener 인터페이스의 onClick() Method를 오버라이딩하여 사용합니다. 이때 익명 클래스를 활용합니다.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn  = (Button)findViewById(R.id.btn1);
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                //Click 이벤트에 대한 처리
            }
        });
    }
}

▼ 먼저 익명 클래스를 통해 리스너를 등록하는 방법입니다. Button 객체에 이벤트를 등록하기 위해 setOnClickListener() Method를 사용하며 인자 정보로 View.OnClickListener 인터페이스의 onClick Method를 구현한 객체를 전달합니다. 만약 익명 클래스를 사용하지 않는다면? 

public class ClickListener implements View.OnClickListener{
    @Override
    public void onClick(View view)
    {
        //Click 이벤트 처리 구간
    }
}

▼ View.OnClickListener 인터페이스를 상속받아 onClick Method를 오버라이딩하는 클래스를 따로 정의를 해줘야합니다. 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn  = (Button)findViewById(R.id.btn1);
        btn.setOnClickListener(new ClickListener());
    }
}

▼ 그런다음 정의한 클래스의 인스턴스를 setOnClickListener() Method의 인자로 넘겨주면서 리스너를 등록해야 합니다.


List of Articles
번호 제목 날짜 조회 수
237 안드로이드 - RecyclerView 안에 RecyclerView 구현하기 file 2021.04.02 502
236 안드로이드 - Json 파싱하기 file 2021.04.02 851
235 안드로이드 - 타이머(Timer) 구현하기 2021.04.01 1369
234 안드로이드 - SQLiteDatabase 구현하기 file 2021.04.01 249
233 안드로이드 - 리사이클러 뷰(RecyclerView) 구현 file 2021.04.01 390
232 안드로이드 - 네비게이션 드로어(Navigation Drawer)를 활용하여 슬라이드 메뉴 구현하기 file 2021.04.01 1865
231 안드로이드 - 툴바(ToolBar)를 사용하여 앱바(App Bar) 구현하기 file 2021.04.01 455
230 안드로이드 - 프로그레스바(ProgressBar) 구현하기 file 2021.04.01 451
229 안드로이드 - AsyncTask 구현 예제 file 2021.04.01 280
228 안드로이드 - 액티비티(Activity)와 액티비티 생명 주기(Activity Life Cycle) file 2021.04.01 225
227 안드로이드 - 리스트뷰(ListView) 구현 file 2021.04.01 490
226 안드로이드 - 컨텍스트 메뉴(Context Menu) 사용 예제 file 2021.04.01 207
225 안드로이드 - 옵션 메뉴 (Option Menu) 구현 방법 file 2021.04.01 283
224 안드로이드 - 명시적 인텐트(Explicit Intent)와 암시적 인텐트 (Implicit Intent) file 2021.04.01 324
223 안드로이드 - 날짜 및 시간 정보 입력받기 (DatePickerDialog / TimePickerDialog) file 2021.04.01 1772
222 안드로이드 - setContentView()와 레이아웃 전개자(LayoutInflater) 2021.04.01 227
221 안드로이드 - AlertDialog 사용하여 알림창 띄우는 방법 총정리 file 2021.03.31 690
220 안드로이드 - SnackBar를 사용해 팝업창 띄우기 file 2021.03.31 282
219 안드로이드 - 토스트(Toast) 메시지 사용하기. file 2021.03.31 325
218 안드로이드 - 액티비티(Activity)로부터 결과 데이터 받아오기 file 2021.03.31 483
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
/ 13

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved