Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Static
- 네트워크
- reactor
- 데이터통신
- mongodb
- AWS
- Elk
- Lombok
- html
- mybatis
- socket
- Heap
- javascript
- HTTP
- redis
- network
- Java
- NoSQL
- cache
- nodejs
- VCS
- git
- libuv
- github
- Linux
- reactive
- r
- ajax
- spring
- effective
Archives
- Today
- Total
빨간색코딩
중첩클래스를 알아보자 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스) 본문
일반클래스는 Package member class 라고들 하며, 아래 항목에서 제외했다. 구글링해보면 클래스간에 관계나 큰 틀에서의 구조를 안잡고 나열하는 식이 많은 것 같다ㅋㅋ
1. 중첩 클래스는 왜 쓰는가?
- 클래스들의 논리적인 그룹을 나타낼 때 쓴다. 주로 model 객체에서 상위모델과 하위모델이 있을 때 쓰는 것 같다. (Static Nested Class 를 많이 씀)
- 향상된 캡슐화
- 좋은 가독성과 유지보수성
2. 중첩 클래스의 종류
3. 내부클래스 (Inner Class)
- 내부클래스로서 일반클래스 내부에 생성된다. Non-Static Nested Class 라고도 불린다.
- 밖에 있는 클래스는 내부클래스를 멤버변수처럼 사용할 수 있다. 사용하려면 new로 인스턴스를 만들어야한다.
- 내부클래스는 자신의 밖에 있는 클래스의 자원을 직접 사용할 수 있다.
모양새
class Outer {
변수;
메소드;
public class Inner {
}
}
객체 생성
Outer 객체1 = new Outer();
Outer.Inner 객체2 = 객체1.new Inner();
클래스 파일 생성
컴파일하면 각각 아래와 같이 생긴다.
- Outer.class
- Outer$Inner.class
4. 정적 중첩클래스 (Static Nested Class)
- 위의 내부클래스와 비슷하나, static 으로 선언한다. 정확히는 Static Nested Class 라고 한다.
- 밖에 있는 클래스의 변수와 메소드 중에 static이 붙은 것들은 사용할 수 있다.
내부클래스와의 차이
- 내부클래스는 밖에 있는 클래스의 자원을 마음대로 사용할 수 있지만, 중첩클래스는 static 키워드가 안붙었다면 사용할 수 없다.
- Outer 클래스의 객체가 없어도 Inner 클래스의 객체 생성이 가능하다. (하단에 객체생성법 참고)
모양새
class Outer {
변수;
메소드;
public static class Inner {
}
}
객체 생성
Outer.Inner 객체 = new Outer.Inner();
5. 지역 클래스(Method Local Inner Class)
- 메소드 내부에 클래스를 정의하는 경우이다. 마치 메소드 내의 지역변수처럼 쓰인다.
- 메소드 내부에서 new 한 뒤 사용해야 한다. 메소드 밖에서 사용할 수 없다(지역변수 룰)
모양새
class Outer {
변수;
메소드1;
메소드2() {
지역변수;
class Inner {
}
}
}
클래스 파일 생성
컴파일하면 각각 아래와 같이 생긴다.
- Outer.class
- Outer$숫자Inner.class
6. 익명클래스(Anonymous Inner Class)
- 익명클래스는 인스턴스 이름이 없다. new 와 동시에 부모클래스를 상속받아 내부에서 오버라이딩해서 사용한다.
- 매개변수로 사용할 수도 있다.
- 익명클래스 내부의 변수나 메소드는 익명클래스의 밖에서 사용이 불가능하다.
- 주로 익명클래스는 이럴때 사용 : 상속은 받아야하지만, 한번만 사용할 것이라서 extends 문법을 굳이 사용안함
- 익명클래스 내부에 생성자X
- 익명클래스 외부의 자원은 final 키워드가 붙은 것만 사용할 수 있다.
- 아래 모양새에서 보듯이 Inner 클래스가 이미 선언되어있어야 한다. Inner 클래스를 바로 상속받고 오버라이딩해서 쓰는 구조이다.
모양새
Class Inner {
변수;
메소드;
}
class Outer {
변수;
메소드1;
메소드2() {
지역변수;
new Inner() {
override된 내용들..
}
}
}
클래스 파일 생성
컴파일하면 각각 아래와 같이 생긴다.
- Outer.class
- Outer$숫자.class
'Java' 카테고리의 다른 글
가변인자(variable_argument) (0) | 2018.06.26 |
---|---|
JDBC (ODBC와 차이, 아키텍처, JdbcTemplate) (0) | 2018.04.11 |
최상위 객체 Object 클래스(주요 메소드, finalize 이슈) (0) | 2018.04.02 |
tomcat에서 PUT, DELETE request body 파싱 문제 (0) | 2018.04.01 |
apache commons (StringUtils) (0) | 2018.02.25 |
Comments