q1은 중첩 클래스인데 어떻게 findViewById에 접근이 가능함?
메인액티비티 클래스 안에 그냥 멤버로 된거임? }이거 리스너 클래스 앞에 없어서 되는거 같고
q2는 inner클래스 안에서 textview 객체 선언 안해서 그런거 같은데 내부 클래스는 외부속성 가능하다며
메인 액티비티랑 상속 관계가 아니라서 그런거임?
q3는 q1처럼 메인 액티비티 클래스 안에 있어서 textView에 접근이 가능했던 거임 ?
q1은 중첩 클래스인데 어떻게 findViewById에 접근이 가능함?
메인액티비티 클래스 안에 그냥 멤버로 된거임? }이거 리스너 클래스 앞에 없어서 되는거 같고
q2는 inner클래스 안에서 textview 객체 선언 안해서 그런거 같은데 내부 클래스는 외부속성 가능하다며
메인 액티비티랑 상속 관계가 아니라서 그런거임?
q3는 q1처럼 메인 액티비티 클래스 안에 있어서 textView에 접근이 가능했던 거임 ?
군대 갔다오니 대가리가 멍청해졌다 제발 도와줘
호옹 맞아맞아
일단 q2는 안드로이드 스튜디오 켜서 직접 타이핑하고 에러 검색해 보면 바로 알 수 있으니 검색해봐라. 대충 검색해본 거랑 경험 위주로 말함 q1) findViewById()는 AppCompatActivity 클래스에 있는 static하지 않은 함수임. 사실 AppCompatActivity가 상속하는 클래스를 타고타고 올라가다보면 결국 Activity를 상속받기 때문에 그냥 findViewById()는 Activity 클래스에 있는 함수라고 보면 되는데 이런 특징 때문에 액티비티가 아닌 곳(MyListener)에서 쓰려면 View나 Activity를 상속해야 됨. 그래서 q1의 코드는 에러가 날 수 없는 코드임. 단 MyListener가 상속하는 클래스를 Activity로 바꾸면 생성자를 써야 됨
q2) 저 코드를 실제로 치면 Unresolved reference: textview 에러가 나오는데 자바는 내부적으로 외부 클래스 정보의 참조를 암시적으로 가질 수 있게 설계되서 중첩 클래스에서 외부 클래스의 변수에 접근할 수 있음. 근데 코틀린은 외부 클래스 참조를 암시적으로 갖고 있지 못하게 설계되서 외부 클래스의 변수(즉 자원)를 사용할 수 없음. 그래서 외부 클래스인 메인 액티비티의 함수인 onCreate에 백날 findViewById() 만들어봤자 MyListener에선 사용 못함. inner class 안에 다시 findViewById()를 만들거나 메인 액티비티에서 참조를 가져올 수 있게 만들면 사용 가능함. 이건 코틀린의 nested class 검색하면 1분 안에 바로 알 수 있음
q3) activity_main.xml은 MainActivity.kt와 setContentView()로 연결돼 있으니까 당연히 activity_main.xml의 onCreate에서 findViewById()로 접근할 수 있기 때문에 에러 안 남. 코틀린 파일에서 변수명 바꾸거나 XML에서 이름 바꾸면 당연히 에러남
형님.. 정말 감사합니다.. 새벽에 감동먹었습니다. 형님이 써주신거 계속 보면서 이해하겠습니다.