Inner클래스
오늘은 공부할때만 보고 실제로 언제 사용하는지는 잘 몰랐던 Inner클래스에대해 알아보겠습니다.
Inner클래스란?
먼저, Inner클래스(내부클래스)란
어떤 클래스 내부에 정의된 또다른 클래스를 의미합니다. 즉, 한 클래스가 다른 클래스의 멤버처럼 존재하는 구조입니다. 주로 캡슐화를 강화하거나 외부 클래스와의 논리적 관계를 나타낼 때 사용됩니다.
Inner클래스는 크게 4가지로 나뉘어집니다.
1. 인스턴스 Inner 클래스 (Non-static Inner Class)
2. 정적 Inner 클래스 (Static Nested Class)
3. 지역 클래스 (Local Class)
4. 익명 클래스 (Anonymous Class)
테스트 코드에서 Inner 클래스를 사용할지 여부는 상황에 따라 다릅니다. 주로 단위 테스트와 관련된 특정 시나리오에서만 사용되며, 일반적으로 널리 쓰이진 않습니다. 다만 테스트 코드의 가독성과 유지보수를 위해 필요할 때 활용할 수 있습니다.
Inner 클래스가 테스트 코드에서 사용되는 경우
1. Helper 클래스 (테스트용 보조 클래스)
- 테스트 내에서 특정 기능이나 상태를 지원하기 위해 보조 클래스를 생성해야 할 때 Static Inner Class를 사용할 수 있습니다.
- 예시: 더미 데이터 생성기, Mock 객체, 테스트 전용 설정 클래스.
class ExampleTest {
@Test
public void testSomething() {
// Helper 클래스 사용
TestHelper helper = new TestHelper();
int result = helper.add(2, 3);
assertEquals(5, result);
}
// Static Inner Class: 테스트 보조 클래스
static class TestHelper {
int add(int a, int b) {
return a + b;
}
}
}
2. 특정 테스트 시나리오를 위한 Inner 클래스
- 테스트에서 특정 조건이나 상황을 시뮬레이션하기 위해 Inner 클래스를 사용할 수 있습니다.
- 주로 테스트 코드의 범위를 제한하고 가독성을 높이기 위해 활용됩니다.
class OuterTest {
@Test
public void testOuterFunctionality() {
InnerClass inner = new InnerClass();
assertEquals("Inner", inner.getName());
}
// 테스트용 Inner 클래스
class InnerClass {
String getName() {
return "Inner";
}
}
}
- 위와 같이 Inner 클래스를 테스트 내부에 선언하면, 테스트와 관련된 코드만 집중할 수 있습니다.
3. 익명 Inner 클래스 (Anonymous Inner Class)
- 테스트 시 특정 인터페이스나 클래스를 빠르게 구현해야 할 때 익명 Inner 클래스를 사용할 수 있습니다.
- 주로 Mock 객체를 즉시 생성할 때 활용합니다.
interface Calculator {
int calculate(int a, int b);
}
@Test
public void testAnonymousInnerClass() {
Calculator calc = new Calculator() {
@Override
public int calculate(int a, int b) {
return a + b;
}
};
assertEquals(5, calc.calculate(2, 3));
}
4. Nested 테스트 클래스 (JUnit 5)
JUnit 5에서는 @Nested 어노테이션을 통해 Inner 테스트 클래스를 명확히 구분하고 구조화할 수 있습니다.
- 상황: 테스트 클래스가 큰 경우 테스트 그룹을 나누고 싶을 때 유용합니다.
import org.junit.jupiter.api.*;
class ParentTest {
@Test
void parentTest() {
System.out.println("Parent Test");
}
@Nested
class ChildTest {
@Test
void childTest() {
System.out.println("Child Test");
}
}
}
결과:
- Parent Test 실행
- Child Test 실행
Inner 클래스를 사용할 때의 장단점
장점
- 코드 캡슐화: 테스트와 관련된 코드를 한 곳에 묶어 가독성을 높일 수 있습니다.
- 편의성: 테스트용 보조 클래스나 Mock 객체를 빠르게 정의할 수 있습니다.
- 구조화: @Nested 클래스를 통해 테스트 그룹을 명확히 나눌 수 있습니다.
단점
- 과도한 사용: 남용하면 테스트 코드가 복잡해지고 이해하기 어려울 수 있습니다.
- 재사용성 부족: Inner 클래스는 외부 클래스에 종속되므로 재사용하기 어렵습니다.
- 가독성 저하: 너무 많은 Inner 클래스가 존재하면 테스트 코드의 흐름이 분산될 수 있습니다.
결론
테스트 코드에서 Inner 클래스는 주로 Helper 클래스, Nested 클래스 또는 Mock 객체 생성 시 사용됩니다. 하지만 과도하게 사용하면 테스트 코드가 복잡해지므로 필요할 때만 사용하는 것이 좋습니다.
- Static Inner Class: 보조 기능 제공 (예: 헬퍼, 설정 클래스).
- @Nested 클래스: 테스트 그룹화 (JUnit 5 이상).
- 익명 Inner 클래스: 즉시 구현이 필요할 때.
테스트 코드를 더 간결하고 명확하게 유지하는 것이 중요하며, 테스트 용도에 맞게 적절히 사용하는 것이 핵심입니다.
반응형
'서버&백엔드 > 🔥 JAVA' 카테고리의 다른 글
JAVA | POJO로 개발한다는 무슨말일까? (0) | 2024.12.18 |
---|---|
JAVA | Record란 무엇일까 (0) | 2024.12.18 |
JAVA | 이진트리 구현 (0) | 2024.11.26 |
Stream | String문자열 내부 정렬 (0) | 2024.11.21 |
Java | Map과 FlatMap 차이 (0) | 2024.11.20 |