내부 클래스 (Inner Class)
내부 클래스(inner class)란 하나의 클래스 내부에 선언된 또 다른 클래스를 의미한다.
보통 사용자 클래스 자료형이 필요하면, 메인 클래스 외부에 선언하거나, 따로 독립적인 클래스 파일을 만들어 불러와 사용해 왔다. 내부 클래스는 대신 클래스 내에 선언되어 사용되며, 내부에 정의된다는 점을 제외하고는 일반적인 클래스와 다르지 않다. 우리가 어느 클래스에 변수나 상수가 필요하다면 클래스 멤버로서 클래스 내에서 선언하여 사용해 왔듯이, 선언 주체를 변수에서 클래스로 바꾼다면 그것이 내부 클래스인 것이다.
이처럼 내부 클래스는 보통 두 클래스가 서로 긴밀한 관계가 있거나, 하나의 클래스또는 메소드에서만 사용되는 클래스일 때 이용되는 기법이라고 보면 된다.
Tip
내부(inner) 클래스는 중첩(nested) 클래스로 분류되기도 한다.

// Creature 클래스는 내부 클래스들의 외부 클래스
class Creature {
int life;
// Animal 클래스는 Creature 클래스의 내부 클래스
class Animal {
}
// Insect 클래스는 Creature 클래스의 내부 클래스
class Insect {
}
public void method() {
Animal animal = new Animal();
Insect insect = new Insect();
// ...
}
}Copy
내부 클래스의 장점
1. 클래스를 논리적으로 그룹화
클래스가 여러 클래스와 관계를 맺지 않고 하나의 특정 클래스와만 관계를 맺는다면, 외부에 클래스를 새로 작성하는 것이 아닌 내부 클래스로 작성할 수 있다.
이런 경우 내부 클래스와 외부 클래스를 함께 관리하는 것이 가능해 유지보수 면에서나 코드 이해성 면에서 편리해진다.
또한 내부 클래스로 인해 새로운 클래스를 생성하지 않아도 되므로 패키지를 간소화할 수 있다.
코드로 예시를 들어보자.
평소대로라면 아래처럼 외부 혹은 다른 파일로 클래스를 선언해놓고, 인스턴스화 하여 사용해왔을 것이다.
class Creature {
int life;
public void method() {
Animal animal = new Animal(); // Animal 객체는 오로지 Creature 클래스의 메소드 내에서만 사용된다고 가정
// ...
}
}
// 외부에 선언된 클래스
class Animal {
}Copy
그런데 만일 Animal 클래스 자료형이 오로지 Creature 클래스의 메소드 내에서만 선언되어 사용된다면, Animal 클래스를 Creature 클래스 내부로 넣어줌으로써 보다 코드 자원의 이해에 도움이 된다. (한눈에 자원 상관 관계 파악에 도움됨)
문제에서는 Ant 클래스를 Main클래스 내부에 정의하여 문제를 해결하였다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
public class Main {
static ArrayList<Ant> list = new ArrayList<>();
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
String ns = sc.next();
String ms = sc.next();
int second = sc.nextInt();
for(int i=ns.length()-1; i>=0; i--) {
list.add(new Ant(ns.charAt(i),1));
}
for(int i=0; i<ms.length(); i++) {
list.add(new Ant(ms.charAt(i),2));
}
while(second-- > 0) {
for(int i=0; i<list.size()-1; i++) {
Ant now = list.get(i);
Ant next = list.get(i+1);
if(now.num != 2 && now.num!=next.num) {
list.set(i,next);
list.set(i+1, now);
i++;
}
}
}
for(int i=0; i<list.size();i++) {
System.out.print(list.get(i).ch);
}
}
public static class Ant{
char ch;
int num;
public Ant(char ch,int num) {
this.ch = ch;
this.num = num;
}
}
}
'Study > 코딩스터디_TIL' 카테고리의 다른 글
[java 스터디] TreeMap 개념 및 백준 20291번 문제풀이 (0) | 2025.02.17 |
---|---|
[java 스터디] 문제풀이 28107번 java 백준-회전초밥 (0) | 2025.02.14 |
[java 스터디] 문제풀이 11286번 java 백준 (0) | 2025.02.13 |
[java 스터디] 문제풀이 Result506. Relative Ranks (0) | 2025.02.11 |
[java 스터디] 우선순위 큐 (0) | 2025.02.10 |