티스토리 뷰
▶내부 클래스(Inner Class) & 익명 클래스(Anonymous Class)
🔎 내부 클래스(Inner Class) ?
내부 클래스(inner class)란 하나의 클래스 내부에 선언된 또 다른 클래스를 의미합니다.
이러한 내부 클래스는 외부 클래스(outer class)에 대해 두 개의 클래스가 서로 긴밀한 관계를 맺고 있을 때 선언할 수 있는데요!
📌 내부 클래스 문법
class Outer { // 외부 클래스
...
class Inner { // 내부 클래스
...
}
...
}
📌 내부 클래스의 장점
내부 클래스를 사용하면 다음과 같은 장점을 가질 수 있습니다.
1. 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있게 됩니다.
2. 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킵니다.
3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있습니다.
❓ 캡슐화, 은닉화
외부 클래스가 메모리에 할당되어야 내부 클래스를 객체화할 수 있기 때문에 클래스를 숨기기 위해
내부 클래스를 사용하기도 합니다.
이를 캡슐화 또는 은닉화라고 합니다.
🔎 익명 클래스(Anonymous Inner Class)
익명 클래스는 내부 클래스의 한 종류입니다.
익명 클래스(Anonymous Inner Class)는 다른 내부 클래스와는 달리 이름을 가지지 않는 클래스를 의미합니다.
익명 클래스는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성하는 일회용 클래스입니다.
→ 이름이 없는 클래스, 구현되지 않은 필드를 구현하기 위해서 일회성을 생성되는 클래스
주로 interface로 만들어놓은 틀을 바로 채울 때 익명 클래스를 사용하는데요.
→ 인터페이스를 바로 구현하기 위해 사용
아래 코드를 살펴봅시다.
public interface Game {
public abstract void play();
public abstract void exit();
}
public class Computer {
public static void main(String[] args) {
Game rpg = new Game() {
@Override
public void play() {
System.out.println("게임 스타트");
}
@Override
public void exit() {
System.out.println("게임 오버");
}
};
rpg.play();
}
}
코드에서 아래와 같은 블록을 하나의 클래스로 볼 줄 알아야 합니다.
아래 해당 부분이 바로 익명 클래스 부분인데요.
바로 인터페이스에서 선언한 구현되지 않은 메소드들에 대해 바로 오버라이딩하고 있습니다.
그런데 인터페이스를 공부할 때 선언이 되지 않았기 때문에 바로 메모리에 할당하지 못한다고 했었습니다.
❓ Game()은 익명 클래스를 메모리에 할당
Game()이라는 생성자가 익명 클래스를 메모리에 올리면서 주소값을 가져오는 것인데요.
자세하게는 Game이라는 인터페이스를 메모리에 올리는 것이 아니라
익명 클래스를 통해 구현한 구현체를 메모리에 올려서 주소값을 가져오는 것입니다.
❓ 익명 클래스 업캐스팅
인터페이스에 대해서 알아보았을 때 인터페이스를 상속 받음으로써 그 틀을 무조건 오버라이딩하여 사용한다고 했었습니다.
이때 "상속"이라는 단어에 집중해야 하는데요.
다시말해서 위 코드에서 선언한 익명 클래스는 Game 인터페이스를 상속 받은 것입니다.
즉, 익명 클래스는 자식 클래스가 되면 Game 인터페이스는 부모가 되는 것입니다.
이 말은, 익명 클래스는 자식 클래스의 타입 + 부모 타입을 가지고 있습니다.
Game rpg = new Game() { ... };
따라서 위 코드 부분을 다시 살펴보면 자식(익명 클래스)이 부모 타입으로 선언이 되었습니다.
그러므로 이 부분은 업캐스팅 되었다고 볼 수 있습니다.
❓ 익명 클래스에서 무언가를 더 선언할 필요가 없다
방금 익명 클래스를 통해 인터페이스를 바로 구현하는 과정은 업캐스팅 과정이라고 했습니다.
따라서 자식이 부모 타입이 되는 것입니다.
캐스팅 때 알아보았을 때 자식이 더 큰 개념이기 때문에 업캐스팅 될 때 이 넘치는 부분을 숨기면서 업캐스팅 된다고 했습니다.
결론은, 익명 클래스 안에 더 선언을 해 봤자 숨겨지기 때문에 사용할 수 없습니다.
또한 익명 클래스이기 떄문에 일회성이므로 다운 캐스팅까지 생각할 수가 없는 것이죠.
'백엔드 > Java' 카테고리의 다른 글
[Java] 마커 인터페이스(Marker Interface)에 대해 알아보자 (0) | 2023.02.03 |
---|---|
[Java] 자바 어댑터(Adapter) 패턴 (0) | 2023.02.03 |
[Java] 인터페이스(interface)에 대해 알아보자 (0) | 2023.02.02 |
[Java] 추상 클래스(Abstract Class) (0) | 2023.02.02 |
[Java] Casting - 업캐스팅(Up Casting)과 다운캐스팅(Down Casting) (0) | 2023.02.02 |
- Total
- Today
- Yesterday
- 자바스크립트
- 자바
- Python
- react-query
- TypeScript
- 머신러닝
- 프로젝트 회고
- jest
- CSS
- rtl
- 자바스크립트 기초
- 파이썬
- 타입스크립트
- 프론트엔드
- 리액트 훅
- 스타일 컴포넌트 styled-components
- frontend
- 딥러닝
- 데이터분석
- HTML
- 프론트엔드 기초
- 프론트엔드 공부
- testing
- styled-components
- 디프만
- next.js
- 인프런
- 리액트
- react
- JSP
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |