본문 바로가기
✏️Java 공부/Java의 정석

[Java 공부/Java의 정석] Chapter.07 : 객체지향 프로그래밍 2 - 7 (내부 클래스)

by 코코의 주인 2022. 7. 9.

 객체지향 프로그래밍의 마지막 글이 될 거 같다.

 내부 클래스는 클래스 내에 선언된다는 점을 제외하고는 일반적인 클래스와 다르지 않다.

 내부 클래스는 사용빈도가 높지 않으므로 내부 클래스의 기본 원리와 특징을 이해하는 정도로도 충분하다.


내부 클래스

 내부 클래스는 클래스 내에 선언된 클래스이다. 클래스에 다른 클래스를 선언하는 이유는 두 클래스가 서로 긴밀한 관계에 있기 때문이다.

 한 클래스를 다른 클래스의 내부 클래스로 선언하면 두 클래스의 멤버들 간에 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점을 얻을 수 있다.

내부 클래스의 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드의 복잡성을 줄일 수 있다.(캡슐화)
class A {	//외부 클래스
    ...
    class B {	//내부 클래스
    	...
    }
}

이 때 내부 클래스인 B는 외부 클래스인 A를 제외하고는 다른 클래스에서 잘 사용되지 않는 것이어야 한다.


내부 클래스의 종류와 특징

 내부 클래스의 종류는 변수의 선언위치에 따른 종류와 같다. 내부 클래스는 마치 변수를 선언하는 것과 같은 위치에 선언할 수 있으며, 변수의 선언 위치에 따라 구분된다.

내부 클래스 툭징
인스턴스 클래스
(instance class)
외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다.
스태틱 클래스
(static class)
외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static멤버처럼 다루어진다. 주로 외부 클래스의 static멤버, 특히 static메서드에 사용될 목적으로 선언된다.
지역 클래스
(local class)
외부 클래스의 멤서드나 초기화블럭 안에 선언하며, 선언된 영역 내부에서만 사용될 수 있다.
익명 클래스
(annoymous class)
클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(일회용)

내부 클래스의 선언

 내부 클래스의 선언위치는 변수의 선언위치와 동일하다. 변수가 선언된 위치에 따라 변수의 종류가 달라지듯 내부 클래스도 이와 마찬가지로 선언된 위치에 따라 나뉜다.

 각 내부 클래스의 선언위치에 따라 같은 선언위치의 변수와 동일한 유효범위(scope)와 접근성(accessibility)을 갖는다.

class Outer {
    class InstanceInner {}	//인스턴스 클래스
	static class StaticInner {}	//스태틱 클래스
    
    void method() {
    	class LocalInner {}	//로컬 클래스
    }
}

내부 클래스의 제어자와 접근성

 인스턴스 클래스와 스태틱 클래스는 외부 클래스의 멤버변수와 같은 위치에 선언되며, 또한 멤버변수와 같은 성질을 갖는다. 따라서 내부 클래스는 외부 클래스의 멤버와 같이 간주되며 인스턴스 멤버와 static멤버 간의 규칙이 내부 클래스에도 똑같이 적용된다.

 내부 클래스도 클래스이기 때문에 abstract이나 final과 같은 제어자를 사용할 수 있을 뿐만 아니라, 멤버변수들처럼 private, protected와 같은 접근제어자도 사용이 가능하다.


익명 클래스

 익명 클래스는 다른 내부 클래스들과는 달리 이름이 없다. 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회용 클래스이다.

 이름이 없기 때문에 생성자도 가질 수 없으며, 조상 클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다.

public class annonymousClass {

    Object iv = new Object() {  //익명 클래스
        void method(){};
    };
    static Object cv = new Object() {   //익명 클래스
        void method() {};
    };
}

총평

 드디어 객체지향 프로그래밍 챕터를 끝낼 수 있었다. 생각보다 시간이 너무 오래 걸렸다.

 사실 목적이 자바의 객체지향 프로그래밍에 대해 공부하는 게 주 목적이었기 때문에 뒷내용들은 혼자 빠르게 훑어보려고 한다.

 언젠가 기회가 되면 다시 정리를 하지 않을까 싶다.

 자바의 정석 좋은 책이니까 기회 되면 읽어보는 것도 좋을 거 같다.

댓글