위의 사이트를 공부해보자!
뷰모델은 Object클래스를 extend한 클래스이다.
그러므로 Object클래스를 알아야 할 것인데... 우선 이게뭔지 알아보자
kotlin in action 이라는 책을 참고했다.
Object는 클래스를 정의하면서 동시에 인스턴스(객체)를 생성한다고 한다.
용도로는
1).객체선언 : 싱글턴을 정의한다
2).동반 객체 : 인스턴스 메소드는 아니지만 팩토리 메소드를 담을 때 쓰인다.
3).무명 내부 클래스 대신에 쓰인다.
1. 객체 선언
클래스 선언과 그 클래스에 속한 단일 인스턴스의 선언을 합친 선언이다. 이 말은 클래스를 정의하고 그 클래스의 인스턴스를 만들어서 변수에 저장하는 모든 작업을 한 문장으로 처리하는 것.
인스턴스 : 객체 지향 프로그래밍(OOP)에서 인스턴스(instance)는 해당 클래스의 구조로 컴퓨터 저장공간에서 할당된 실체를 의미한다. 여기서 클래스는 속성과 행위로 구성된 일종의 설계도이다. OOP에서 객체는 클래스와 인스턴스를 포함한 개념이다.
(이해가 갈듯 말듯 한데, 그냥 이 정도로 이해하고 가야겠다.. 나중에 더 잘 알게 되겠지)
이렇게 만들어진 싱글턴 객체는 객체 선언문이 있는 위치에서 생성자의 호출 없이 즉시 만들어 진다. 그러므로 생성자 정의가 필요 없다.
생성자의 정의가 필요없다는 말은 그 객체안에는 생성자로 사용되는 데이터를 저장할 필요가 없다는 말이다. 다음과 같은 책에서 알려주는 객체를 이해해 보자
1 2 3 4 5 6 |
object CaseInsensitiveFileComparator : Comparator<File>{ override fun compare(p0: File?, p1: File?): Int { return p0.path.comparTo(p1.path,ignorCase = true) } } println(CaseInsensitiveFileComparator.compare(~~,~~)) |
1) 상속을 할 수 있다.
2) 생성자를 정의 안해준다 -> 객체내부에 데이터를 저장 할 필요가 없다.
3) 클래스 안에서 객체를 선언할 수도 있다.
2.동반객체
코틀린 클래스 안에는 정적인 멤버가 없다고 한다. java 의 static 을 지원하지 않는데, 대신에 패키지 수준의 최상위 함수와 객체 선언을 활용한다.
static이라는 것을 찾아보면 같은 윤씨집안의 가계도의 성=윤 이라는 것처럼
객체의 성이 변하지 않는 경우에 일반적인 방식을 사용하여 만들경우 각 객체마다 '성'이 들어갈 데이터 공간이 필요하다. 하지만 이것을 static변수로 만들어 주어 메모리 할당에 이득을 볼 수 있다고 한다.
내식대로 정리해 보자면 , 결국 static과 위에 설명했던 객체선언을 통해 하나의 데이터공간에 저장을 하므로 데이터할당으로 이득을 볼 수 있고, 윤->박이 되더라도 그 변경 사항이 모두에게 공유되는 것?인가.
다시 본론으로 돌아와서, 최상위 함수의 활용을 권장하지만, 최상위 함수는 private로 표시된 클래스 멤버에 접근 할 수 없다. 그래서 클래스의 인스턴스와 관계없이 호출해야 하지만, 클래스 내부 정보에 접근해야하는 함수가 필요할 경우에는 중첩된 객체 선언의 멤버함수로 정의한다.
이러한 객체를 만들때는
companion object라는 표시로 만든다.
이러한 동반 객체는 자신을 둘러싼 클래스의 모든 private 멤버에 접근할 수 있다.
위와 같은 예제에서 nickname에 접근 할 수 없지만, companion object를 통해서 접근 할 수 있다. 맞나..
위와 같이 직접적으로 User의 nickname에 접근 할 수 없다.
3. 객체식 : 무명 내부 클래스를 다른 방식으로 작성
객체 선언과 같지만 객체의 이름을 정의하지 않고 생성가능하다.
이때 무명 객체는 싱글턴이 아니므로 객체 식이 쓰일 떄마다 새로운 인스턴스가 생성된다.
'안드로이드 jetpack > 뷰모델 viewmodel' 카테고리의 다른 글
3. 간단한 Viewmodel 따라하기 (0) | 2019.11.19 |
---|---|
2.ViewModel이란.. : 네이버 블로그 (0) | 2019.11.19 |
위의 사이트를 공부해보자!
뷰모델은 Object클래스를 extend한 클래스이다.
그러므로 Object클래스를 알아야 할 것인데... 우선 이게뭔지 알아보자
kotlin in action 이라는 책을 참고했다.
Object는 클래스를 정의하면서 동시에 인스턴스(객체)를 생성한다고 한다.
용도로는
1).객체선언 : 싱글턴을 정의한다
2).동반 객체 : 인스턴스 메소드는 아니지만 팩토리 메소드를 담을 때 쓰인다.
3).무명 내부 클래스 대신에 쓰인다.
1. 객체 선언
클래스 선언과 그 클래스에 속한 단일 인스턴스의 선언을 합친 선언이다. 이 말은 클래스를 정의하고 그 클래스의 인스턴스를 만들어서 변수에 저장하는 모든 작업을 한 문장으로 처리하는 것.
인스턴스 : 객체 지향 프로그래밍(OOP)에서 인스턴스(instance)는 해당 클래스의 구조로 컴퓨터 저장공간에서 할당된 실체를 의미한다. 여기서 클래스는 속성과 행위로 구성된 일종의 설계도이다. OOP에서 객체는 클래스와 인스턴스를 포함한 개념이다.
(이해가 갈듯 말듯 한데, 그냥 이 정도로 이해하고 가야겠다.. 나중에 더 잘 알게 되겠지)
이렇게 만들어진 싱글턴 객체는 객체 선언문이 있는 위치에서 생성자의 호출 없이 즉시 만들어 진다. 그러므로 생성자 정의가 필요 없다.
생성자의 정의가 필요없다는 말은 그 객체안에는 생성자로 사용되는 데이터를 저장할 필요가 없다는 말이다. 다음과 같은 책에서 알려주는 객체를 이해해 보자
1 2 3 4 5 6 |
object CaseInsensitiveFileComparator : Comparator<File>{ override fun compare(p0: File?, p1: File?): Int { return p0.path.comparTo(p1.path,ignorCase = true) } } println(CaseInsensitiveFileComparator.compare(~~,~~)) |
1) 상속을 할 수 있다.
2) 생성자를 정의 안해준다 -> 객체내부에 데이터를 저장 할 필요가 없다.
3) 클래스 안에서 객체를 선언할 수도 있다.
2.동반객체
코틀린 클래스 안에는 정적인 멤버가 없다고 한다. java 의 static 을 지원하지 않는데, 대신에 패키지 수준의 최상위 함수와 객체 선언을 활용한다.
static이라는 것을 찾아보면 같은 윤씨집안의 가계도의 성=윤 이라는 것처럼
객체의 성이 변하지 않는 경우에 일반적인 방식을 사용하여 만들경우 각 객체마다 '성'이 들어갈 데이터 공간이 필요하다. 하지만 이것을 static변수로 만들어 주어 메모리 할당에 이득을 볼 수 있다고 한다.
내식대로 정리해 보자면 , 결국 static과 위에 설명했던 객체선언을 통해 하나의 데이터공간에 저장을 하므로 데이터할당으로 이득을 볼 수 있고, 윤->박이 되더라도 그 변경 사항이 모두에게 공유되는 것?인가.
다시 본론으로 돌아와서, 최상위 함수의 활용을 권장하지만, 최상위 함수는 private로 표시된 클래스 멤버에 접근 할 수 없다. 그래서 클래스의 인스턴스와 관계없이 호출해야 하지만, 클래스 내부 정보에 접근해야하는 함수가 필요할 경우에는 중첩된 객체 선언의 멤버함수로 정의한다.
이러한 객체를 만들때는
companion object라는 표시로 만든다.
이러한 동반 객체는 자신을 둘러싼 클래스의 모든 private 멤버에 접근할 수 있다.
위와 같은 예제에서 nickname에 접근 할 수 없지만, companion object를 통해서 접근 할 수 있다. 맞나..
위와 같이 직접적으로 User의 nickname에 접근 할 수 없다.
3. 객체식 : 무명 내부 클래스를 다른 방식으로 작성
객체 선언과 같지만 객체의 이름을 정의하지 않고 생성가능하다.
이때 무명 객체는 싱글턴이 아니므로 객체 식이 쓰일 떄마다 새로운 인스턴스가 생성된다.
'안드로이드 jetpack > 뷰모델 viewmodel' 카테고리의 다른 글
3. 간단한 Viewmodel 따라하기 (0) | 2019.11.19 |
---|---|
2.ViewModel이란.. : 네이버 블로그 (0) | 2019.11.19 |