내부 클래스(Inner Class)
내부 클래스는 클래스 내에 선언된 클래스로 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용한다. 내부 클래스를 사용하면 외부 클래스의 멤버들에 쉽게 접근할 수 있고, 코드의 복잡성을 줄일 수 있다. 또한 외부적으로 불필요한 데이터를 감출 수 있어 캡슐화(encapsulation)을 달성하기 유용하다.
class Outer { // 외부 클래스
class Inner {
// 인스턴스 내부 클래스
}
static class StaticInner {
// 정적 내부 클래스
}
void run() {
class LocalInner {
// 지역 내부 클래스
}
}
}
위의 코드는 외부 클래스와 그 안에 포함될 수 있는 세 가지의 내부 클래스를 보여준다. 세 가지의 내부 클래스 종류는 각각 인스턴스 내부 클래스, 정적 내부 클래스, 지역 내부 클래스로 구분할 수 있다. 기본적으로 내부 클래스는 외부 클래스 내에 선언된다는 점을 제외하면 일반 클래스와 차이점이 없다. 단지 사용시의 편의성을 고려하여 만들어진 문법 요소이다.
- 인스턴스 내부 클래스(instance inner class)
외부 클래스의 멤버변수 선언 위치에 선언(멤버 내부클래스)
외부 인스턴스 변수, 외부 전역 변수 사용 가능 - 정적 내부 클래스(static inner class)
외부 클래스의 멤버변수 선언 위치에 선언(멤버 내부클래스)
외부 전역 변수 사용 가능 - 지역 내부 클래스(local inner class)
외부 클래스의 메서드나 초기화 블록 안에 선언
외부 인스턴스 변수, 외부 전역 변수 사용 가능 - 익명 내부 클래스(anonymous inner class) (우선순위 낮아 생략)
클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스
외부 인스턴스 변수, 외부 전역 변수 사용 가능
인스턴스 내부 클래스
class Outer { //외부 클래스
private int num = 1; //외부 클래스 인스턴스 변수
private static int sNum = 2; // 외부 클래스 정적 변수
private InClass inClass; // 내부 클래스 자료형 변수 선언
public Outer() {
inClass = new InClass(); //외부 클래스 생성자
}
class InClass { //인스턴스 내부 클래스
int inNum = 10; //내부 클래스의 인스턴스 변수
void Test() {
System.out.println("Outer num = " + num + "(외부 클래스의 인스턴스 변수)");
System.out.println("Outer sNum = " + sNum + "(외부 클래스의 정적 변수)");
}
}
public void testClass() {
inClass.Test();
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
System.out.println("외부 클래스 사용하여 내부 클래스 기능 호출");
outer.testClass(); // 내부 클래스 기능 호출
}
}
// 출력값
외부 클래스 사용하여 내부 클래스 기능 호출
Outer num = 1(외부 클래스의 인스턴스 변수)
Outer sNum = 2(외부 클래스의 정적 변수)
위의 코드를 정리해보자면 인스턴스 내부 클래스는 외부 클래스의 내부에 위치해 있으며 private 접근제어자를 사용하고 있음에도 내부에서 외부 클래스의 인스턴스 변수와 정적 변수에 각각 접근하여 해당 값을 사용하고 있다. 인스턴스 내부 클래스는 반드시 외부 클래스를 생성한 이후에 사용해야 한다.
정적 내부 클래스
class Outer { // 외부 클래스
private int num = 3; // 외부 클래스의 인스턴스 변수
private static int sNum = 4;
void getPrint() {
System.out.println("인스턴스 메서드");
}
static void getPrintStatic() {
System.out.println("스태틱 메서드");
}
static class StaticInClass { // 정적 내부 클래스
void test() {
System.out.println("Outer sNum = " +sNum + "(외부 클래스의 정적 변수)");
getPrintStatic();
// num 과 getPrint() 는 정적 멤버가 아니라 사용 불가.
}
}
}
public class Main {
public static void main(String[] args) {
Outer.StaticInClass a = new Outer.StaticInClass(); //정적 이너 클래스의 객체 생성
a.test();
}
}
//출력값
Outer sNum = 4(외부 클래스의 정적 변수)
스태틱 메서드
정적 내부 클래스는 인스턴스 내부 클래스와 동일하게 클래스의 멤버 변수 위치에 정의하지만, static 키워드를 사용한다.
지역 내부 클래스
지역 내부 클래스는 클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스이다. 지역 내부 클래스도 지역 변수와 유사하게 메서드 내부에서만 사용 가능하기 때문에 일반적으로 메서드 안에서 선언 후 바로 객체를 생성해서 사용한다. 아래의 코드에서 지역 내부 클래스 LocalInClass가 메서드 안에서 선언되고, 생성된 후에 정의된 메서드를 호출하여 외부 클래스의 변수들을 출력하고 있는 것을 확인 할 수 있다.
class Outer { //외부 클래스
int num = 5;
void test() {
int num2 = 6;
class LocalInClass { //지역 내부 클래스
void getPrint() {
System.out.println(num);
System.out.println(num2);
}
}
LocalInClass localInClass = new LocalInClass();
localInClass.getPrint();
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
outer.test();
}
}
//출력값
5
6
'공부 > 전자컴퓨터공학' 카테고리의 다른 글
Java 캡슐화란? 자바 기초 배우기 (0) | 2024.05.27 |
---|---|
Java 상속(Inheritance) 이란? 자바 기초 배우기 (0) | 2024.05.27 |
생성자(Constructor)란? 자바 기초 배우기 (0) | 2024.05.26 |
필드(Field)와 메서드(Method) 자바 기초 배우기 (0) | 2024.05.26 |
Java 클래스(Class) & 객체(Object) 자바 기초 배우 (0) | 2024.05.23 |