-
[Java] 내부 클래스Java 2022. 5. 18. 10:18반응형
클래스 안에 선언된 클래스를 내부 클래스라고 한다.
어느 위치에 선언 되느냐에 따라 4가지 형태가 있을 수 있다.
내부 클래스를 사용하는 이유 ?
-다중 상속의 문제점을 해결하는 하나의 방안이 될 수 있다.
-코드의 복잡성을 줄일 수 있다(캡슐화)
1. 클래스 안에 인스턴스 변수
필드를 선언하는 위치에 선언되는 경우 - 중첩클래스, 인스턴스 클래스
public class Test { class Cal { // 필드를 선언하는 위치에 클래스를 선언 public void plus() { value++; } } public static void main(String[] args) { test t = new t(); t.Cal cal = t.new Cal(); cal.plus(); } }2.정적 중첩 클래스 or 스태틱 클래스
1번과 비슷하지만, 필드가 정적인 필드
public class test2 { static class Cal{ int value = 0; public void plue() { value++; } } public static void main(String[] arge) { test.Cal cal = new t.Cal(); cal.plus(); } }2번째줄 Cal 은 정적인 필드와 같기때문에 1번과 사용하는 방법이 조금 다르다.
1은 test 를 먼저 생성한 다음 접근 했어야 하는데, 2번같은경우 스테틱이기 때문에 생성 할 필요가 없다.
(바로 접근해서 사용함)
3.지역 중첩 클래스 or 지역 클래스
public class test { public void exec() { class Cal { int valu = 0; public void plus(){ value++; } } Cal cal = new Cal(); cal.plus(); System.out.println(cal.value); } public static void main(String[] args) { test3 t = new test3(); t.exec(); } }Cal은 메소드 안에서 밖에 사용할 수 없다.
메소드 안에서도 클래스를 지역변수로 선언해서 사용 가능
4. 익명 중첩 클래스
익명 클래스라고 불리며, 내부 클래스 이기도 하다.
추상클래스를 사용하기 위해서는 반드시 이 클래스를 상속받을 자식 클래스가 해당 메소드를 구현해야 하는데,
//추상클래스 Action public abstract class Action{ public abstract void exec(); } //추상클래스 Action을 상속받은 클래스 MyAction public class MyAction extends Action{ public void exec(){ System.out.println("exec"); } } //MyAction을 사용하는 클래스 ActionExam public class ActionExam{ public static void main(String args[]){ Action action = new MyAction(); action.exec(); } } //MyAction을 사용하지 않고 Action을 상속받는 익명 클래스를 만들어서 사용하도록 수정해 보도록 하겠습니다. public class ActionExam{ public static void main(String args[]){ Action action = new Action(){ public void exec(){ System.out.println("exec"); } }; action.exec(); } }- 생성자 다음에 중괄호 열고 닫고가 나오면, 해당 생성자 이름에 해당하는 클래스를 상속받는 이름없는 객체를 만든다는 것을 뜻한다.
- 괄호 안에는 메소드를 구현하거나 메소드를 추가할 수 있다. 이렇게 생성된 이름 없는 객체를 action이라는 참조변수가 참조하도록 하고, exec()메소드를 호출.
- 익명클래스를 만드는 이유는 Action을 상속받는 클래스를 만들 필요가 없을 경우이다.
- Action을 상속받는 클래스가 해당 클래스에서만 사용되고 다른 클래스에서는 사용되지 않는 경우이다.
반응형'Java' 카테고리의 다른 글
[Java] API - String 클래스 (0) 2022.05.19 [Java] 헷갈리는 문자열 함수 정리 (substring, split, charAt, indexOf, lastIndexOf) (0) 2022.05.18 [Java] 인터페이스 default 메소드 (0) 2022.05.18 [Java] 추상클래스 abstract (0) 2022.05.17 [Java] 열거형(Enum) (0) 2022.05.17