강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

강인준님의 프로필 이미지
강인준

작성한 질문수

Java 클래스 추가만으로 기존 클래스 객체 생성하기

작성

·

278

0

A 유닛, B 유닛... 등 유닛들의 목록을 만들어 놓고 랜덤으로 고른 유닛들로 아군/적군을 만들어서 서로 공격하게 만드는 코드를 짜는 중인데

구현 조건 중 하나가 기존 코드는 수정하지 않고 오로지 클래스만 추가해서 X, Y, Z, 유닛을 목록에 추가하게 하는거거든요?

아마 기존 유닛 클래스의 자식 클래스를 만들고 메소드 오버라이딩하라는 의도 같단 생각이 들기는 한데

그렇게 해도 결국 자식 메소드 호출하려면 자식 객체를 따로 만들든 부모 객체를 자식 타입으로 바꾸는 문법을 쓰든 기존 코드를 수정해야만 하는거 아닌가 싶어서요 ㅜ

오로지 클래스 추가만으로 해당 조건 만족하는게 가능한건가요? 가능하다면 어떻게 가능할까요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

님께서 짜고 계신 코드에서 특히 객체 지향 프로그래밍의 다형성 개념이 중요하게 작용합니다. 자식 클래스를 만들어 부모 클래스 타입으로 관리함으로써, 자식 클래스의 객체를 생성하지 않고도 새로운 유닛을 목록에 추가하는 것이 가능합니다. 이를 위해선, 유닛을 생성하고 관리하는 팩토리 패턴을 사용하거나, 서비스 로케이터 패턴, 또는 리플렉션을 이용하여 동적으로 인스턴스를 생성하는 방법이 있습니다.

예를 들어, 팩토리 메소드 내에서 클래스 이름을 기반으로 자식 객체를 생성하고, 이를 부모 타입으로 반환하는 방법을 사용할 수 있습니다. 자바의 Class.forName()과 같은 리플렉션 기능을 사용하여 문자열로 된 클래스 이름으로 해당 클래스의 인스턴스를 생성하고, 이를 원래의 코드에서 활용하는 것이죠.

가령 기존 유닛 목록을 관리하는 부분이 있다면, 해당 유닛 목록을 자동으로 갱신하는 로직을 추가 클래스에 구현해 두고, 새로 추가되는 유닛 클래스는 이를 활용하도록 하면 됩니다. 그렇게 할 경우 기존 코드의 수정 없이도 새로운 유닛을 목록에 추가하는 요구사항을 만족시킬 수 있습니다.

자바에서는 클래스 이름을 기반으로 객체를 생성하는 방법은 다음과 같습니다:

Class<?> clazz = Class.forName("클래스이름");
Object unit = clazz.getConstructor().newInstance();

이를 이용하여 팩토리 클래스 내에서 유닛 객체를 생성하고 이를 목록에 추가하는 로직을 구성할 수 있습니다. 단, 리플렉션을 사용할 때는 해당 클래스 이름에 해당하는 클래스가 존재해야 하며, no-argument 생성자가 존재해야 한다는 것을 염두에 두어야 합니다.

이렇게 구현하기 위해선 클래스가 로딩될 때 유닛 목록에 자동으로 등록하는 정적 블록(static block)이나 초기화 코드가 포함될 수 있으며, 이는 별도의 등록 절차 없이도 새로 구현되는 유닛 클래스가 작동할 수 있도록 합니다.

이 방법을 사용하면 기존 코드를 수정하지 않고도 클래스만 추가하여 유닛 목록을 확장할 수 있습니다.

강인준님의 프로필 이미지
강인준

작성한 질문수

질문하기