ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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을 상속받는 클래스가 해당 클래스에서만 사용되고 다른 클래스에서는 사용되지 않는 경우이다.

    반응형

    댓글

Designed by Tistory.