Java Inner/Nested Class

자바 는 클래스 안에 클래스 선언 시 기본Inner 클래스가 됨

public class Main {
    private int outer = 0;
    class Main2{
        public void getValue(){
            System.out.println(outer);
        }
    }
}

이런식으로 외부 클래스의 **변수**를 참조할 수 있음


반면에,

static 예약어로 선언하면 Nested 클래스가 됨

public class Main {
    private int outer = 0;
    static class Main2{
        public void getValue(){
						// Non-static field 'outer' cannot be referenced from a static context
            System.out.println(outer);
        }
    }
}

이런식으로 외부 클래스의 **변수**를 참조할 수 없음


해결하려면,

**외부 클래스 객체**를 **생성자**로 넘겨주면 됨

public class Main {
    private int outer = 0;
    static class Main2{
        public void getValue(Main main){
            System.out.println(main.outer);
        }
    }
}

이런식으로 외부 클래스의 **변수**를 참조할 수 있음


Kotlin Inner/Nested Class

**코틀린**은 클래스 안에 클래스 선언 시 기본 Nested 클래스가 됨

class Main{
    private val outer : Int = 0
    class Test2{
        private fun getValue(){
						//Unresolved reference: outer
            println(outer)
        }
    }
}

이런식으로 외부 클래스의 **변수**를 참조할 수 없음


반면에,

inner 예약어로 선언하면 Inner 클래스가 됨

class Main{
    private val outer : Int = 0
    inner class Test2{
        private fun getValue(){
            println(outer)
        }
    }
}

이런식으로 외부 클래스의 **변수**를 참조할 수 있음


물론,

**자바**처럼 **외부 클래스 객체**를 **생성자**로 넘겨주면 해결 가능함

class Main{
    private val outer : Int = 0
    class Test2(private val main : Main){
        private fun getValue(){
            println(main.outer)
        }
    }
}

이런식으로 외부 클래스의 **변수**를 참조할 수 있음


그럼 왜?


Java Inner 문제점


RecyclerView

ViewHolder

Nested 클래스로 정의하는 것이 좋음

  1. 뷰 홀더를 **여러 어댑터**에서 참조하여 사용할 경우 Outer 클래스를 매번 새로 생성할 필요가 없음
  2. **onCreateViewHolder**가 여러번 만들어질때 묵시적으로 Outer 클래스를 참조하게 됨