[이 포스팅에서 다루는 내용]
ㅡ 동반객체 개념과 사용법 잡기
ㅡ 팩토리 메서드 (팩토리 패턴) 개념
- 팩토리 패턴 사용 이유 (+팩토리 클래스 이야기)
- 동반객체의 팩토리 메서드
ㅡ 프래그먼트에서의 동반객체
동반객체 개념과 사용법 잡기
어떤 클래스 내부의 멤버들을 이용하려면 해당 클래스를 인스턴스화 해야 한다.
그러나 인스턴스화 여부와 상관 없이 사용하고 싶은 멤버도 만들 수 있다. 즉, 객체를 생성하지 않고 접근할 수 있는 변수, 메서드 등을 선언하고 싶을 때가 있을 것이다.
이때 그러한 멤버에다가 자바에서는 static 키워드를 붙인다. 다만 코틀린에는 static 키워드는 없다. 자바의 static 키워드를 통한 정적 멤버, 정적 메서드는 코틀린에 없다. 대신 동반객체(companion object)라는 것을 만들어서 그 동반객체 블록 안에 변수(필드)와 메서드를 선언하면 언제든 접근 가능한 멤버들을 선언할 수 있다. 멤버가 동반 객체의 일부로 선언되면 자바의 static 멤버처럼 사용가능하다.
동반객체 안에 있는 멤버를 부르려면, 'ClassName.membername'과 같은 형식으로 클래스 이름을 통해 접근할 수 있다. 클래스 객체를 생성하지 않더라도!
다음 내용의 출처는 여기이다.
위 사진의 내용을 보면, TestClass라는 클래스에 companion object를 만들고 거기에 상수와 메서드를 정의했다. 그리고 호출은 클래스를 인스턴스화 하지 않고 클래스 이름인 TestClass만으로 동반 객체의 멤버에 접근할 수 있다.
(참고: 동반 객체는 클래스 내에 하나만 선언 가능하다.)
팩토리 메서드(팩토리 패턴) 개념 참고링크
ㅡ생성자로 직접 객체를 생성하는 것이 아니라 메서드를 통해 객체를 생성하는 코딩 패턴이다.
ㅡ객체를 만들어내는 부분을 서브클래스에 위임하는 패턴이라고도 정의한다.
ㅡ객체를 만들어내는 공장(Factory)을 만드는 패턴
팩토리 패턴 사용 이유 (팩토리 클래스 이야기)
참고자료: 이 사이트 좋다. (팩토리 클래스 활용 예시- 자바)
팩토리 패턴을 사용하는 이유는 클래스간의 결합도를 낮추기 위해서이다. 결합도란, 클래스에 변경점이 생겼을 때 얼마나 다른 클래스에도 영향을 주는가이다. 팩토리 패턴을 사용하면 객체 생성을 서브클래스에 위임함으로써 직접 객체를 생성하는 것을 방지할 수 있다. 이는 보다 효율적인 코드 제어를 가능케 하며 결합도를 낮춘다.
(팩토리 클래스는 뭐 새로운 개념이 아니고, 그냥 생성자를 호출하는 기능이 있는 팩토리메서드가 존재하는 클래스를 부르는 것이다.)
위 자료링크에서는 자바로 팩토리 클래스를 구현한 예시를 보여주었다. 어떤 팩토리클래스를 상속받는 두 종류의 팩토리 클래스 안에 생성자를 오버라이드한 팩토리 메서드가 있다. 좋은 예시를 들어주셔서 한번 읽어보는 것을 추천한다. 팩토리 클래스가 어떻게 이용되는지 이해하기 쉬워진다.
RobotFactory 클래스에서 createRobot(String name)이라는 Robot 타입의 추상 메서드를 정의했다.
그리고 이 RobotFactory 클래스를 다른 하위 클래스 SuperRobotFactory 클래스가 상속받도록 하고, 위 createRobot 메서드를 오버라이드하여 메서드의 인자로 들어오는 name의 케이스를 나누어 return new SuperRobot() 혹은 return new PowerRobot()하게 했다. 팩토리 클래스의 메서드 createRobot(String name)를 통하여 생성자를 간접적으로 호출해 객체를 생성할 수 있게 구현한 모습이다.
이렇게 팩토리 메서드를 이용하여 생성자 호출을 팩토리 클래스의 업무로 넘긴다면, 메인 프로그램에서는 어떤 객체가 생성되었는지 신경쓰지 않고 단지 팩토리메서드의 결과로 반환된 객체를 사용만 하면 된다. 메인 프로그램의 구성이 간단해지고, 또 다른 기능의 새로운 팩토리가 추가되더라도 메인 클래스에서 변경할 코드가 최소화되고 단순해진다.
팩토리 패턴을 이용하면 목적에 맞는 객체생성을 도울 수 있다. 어떤 클래스의 객체생성은 여러 종류의 생성자를 통해 할 수 있는데, 만약 생성자가 많아지면 객체 생성이 헷갈릴 수 있다. 이때 팩토리 패턴을 사용하면 메서드나 클래스에 목적이 분명한 이름을 붙이고 그 이름을 부름으로써 생성자 호출의 헷갈림을 방지한다. 읽고 쓰기도 편하고...
동반객체의 팩토리 메서드
참고자료: 여기 동반객체 설명 캡쨩
코틀린에서는 코틀린에만 있는 동반 객체 개념으로 이러한 팩토리 메서드를 구현할 수도 있다.
동반 객체 안에 생성자를 호출하는 팩토리 메서드를 정의할 수 있는데, 이때 private인 생성자까지 호출할 수 있다. 이 동반객체를 통해 최상위(패키지 수준) 함수, 객체 선언을 하는 것이기 때문이다. 즉, 동반 객체의 멤버는 클래스 선언과 관계없는 최상위 멤버라서 클래스의 private멤버에 접근가능하다. 마치 자바에서 멤버에 static 키워드를 붙이면 클래스 선언 없이 해당 멤버에 접근가능한 것과 유사하게!
동반 객체 안에 생성자 사용목적을 뚜렷하게 알 수 있도록 메서드 이름을 정하여서 해당 생성자를 호출하는 메서드를 만들어 놓는다면 헷갈릴 염려 없이 생성자 호출이 가능하다. 즉, 동반 객체 안 생성자를 호출하는 메서드를 만듦으로써 생성자가 많은 클래스 객체를 생성할 때 어떻게 생성자를 선택할 지 헷갈리지 않게 할 수 있다.
아래 예시를 보면 코틀린의 동반 객체에 대한 감이 확 올 것이다. 예시의 출처는 여기이다.
+주의점: 다만 이러한 동반 객체의 내용들은 "오버라이드가 불가능"하므로, 해당 클래스의 상속이 필요한 경우라면 생성자를 정의해야 한다.
프래그먼트에서의 동반객체
프래그먼트를 생성하면 자동으로 동반 객체 컴포넌트가 생성된다. 프래그먼트는 특수한 제약 때문에 팩토리 메서드를 정의해여 인스턴스를 생성해야 한다. (팩토리 메서드는 위에서 설명했다.) 프래그먼트를 다뤄 본 경험이 있다면 newInstance() 메서드를 보았을 것이다. 다음 예시를 보자.
예시1 출처: 여기
예시2 출처: 여기
'JAVA' 카테고리의 다른 글
안드로이드 - 챕터10, 지도와 GPS (0) | 2021.01.28 |
---|---|
안드로이드 생존코딩(오준석) - 챕터9 전자액자 Fragment 상세설명 - 안드로이드 스튜디오 4.1 (0) | 2021.01.25 |
[안드로이드 스튜디오] Layout 개념 기본 정리 / View binding (0) | 2021.01.20 |
안드로이드 - ViewPager2를 이용한 슬라이더 학습 (0) | 2021.01.19 |
쓰다 만 전자액자 포스팅 with 감격의 순간 ㅠㅅㅠ (0) | 2021.01.18 |