객체를 생성하는 역할을 하는 클래스의 구성 요소로서, 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다.
new 키워드를 이용해 객체를 생성할 때 호출된다.
생성자의 조건
오버로딩이 가능하므로 한 클래스내에 여러 개의 생성자가 존재할 수 있다.
this() 메서드이다.this() 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용한다.this() 메서드를 사용하기 위해서는 크게 두 가지의 조건이 있다.this() 메서드는 반드시 생성자의 내부에서만 사용할 수있다.this() 메서드는 반드시 생성자의 첫 줄에 위치해야 한다.this 키워드이다.this는 인스턴스 자신을 가르키며, 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this를 통해서 인스턴스 자신의 변수에 접근할 수 있다. 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(외부 클래스의 정적 변수)
정적 내부 클래스
내부 클래스가 외부 클래스의 존재와 무관하게 정적 변수를 사용할 수 있게 할때 사용한다.
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 num = " +sNum + "(외부 클래스의 정적 변수)");
getPrintStatic();
// num 과 getPrint() 는 정적 멤버가 아니라 사용 불가.
}
}
}
public class Main {
public static void main(String[] args) {
Outer.StaticInClass a = new Outer.StaticInClass(); //정적 이너 클래스의 객체 생성
a.test();
}
}
//출력값
Outer num = 4(외부 클래스의 정적 변수)
스태틱 메서드
지역 내부 클래스