java
2022.09.05 java 생성자, 내부 클래스
Han_5ung
2022. 9. 7. 00:08
생성자(Constructor)
- 인스턴스 변수를 원하는 값으로 초기화할 수 있는 메서드
특징
- 생성자의 이름은 반드시 클래스의 이름과 같아야 한다
- 리턴 타입이 없으나 void는 아님
- 하나의 클래스가 여러 개의 생성자를 가질 수 있다.
- 생성자 오버로딩 가능
생성자 선언
클래스명(){ //매개변수가 없는 생성자
...바디...
}
클래스명(매개변수){ //매개변수가 있는 생성자
...바디...
}
ex)
Class Person{
Person(){
System.out.println("사람입니다");
}
Person(String name){
System.out.println("이름 : " + name);
}
Person(String job, int age){
System.out.println("직업 : " + job + "나이 : " + age);
}
}
this & this()
this
- 인스턴스가 자기 자신을 참조함
- this 참조 변수를 사용하여 인스턴스 변수에 접근할 수 있음
class Person{
String name; //인스턴스 변수
String job;
int age;
public Person(String name; String job; int age){ //매개변수
this.name = name;
this.job = job;
this.age = age;
}
}
- this.인스턴스 변수 = 매개변수;
- 외부에서 받아온 매개변수값이 인스턴스 변수에 할당
this()
- 자신이 속한 클래스에서 다른 생성자를 호출
- 생성자 내부에서만 사용 가능
- 반드시 생성자의 첫 줄에 위치
class Person{
String name; //펭귄
String job; //백수
int age; //100
public Person(){
this("펭귄","백수",100); //아래 생성자 호출
}
public Person(String name; String job; int age){
this.name = name;
this.job = job;
this.age = age;
}
}
- 인스턴스 변수 name, job, age에 각각 펭귄, 백수, 100이라는 값이 할당됨
내부 클래스(Inner Class)
- 클래스 내부에 선언된 또 다른 클래스
장점
- 내부에서 외부 클래스 멤버에 손쉽게 접근할 수 있음
- 코드의 캡슐화
- 코드의 복잡성을 줄일 수 있음
종류
- 인스턴스 내부 클래스
- 정적 내부 클래스
- 지역 내부 클래스
- 익명 내부 클래스
인스턴스 내부 클래스
class Outer{ //외부 클래스
class Inner{ //내부 클래스
}
}
- 반드시 외부 클래스를 생성한 이후에 사용
- 외부 클래스의 접근 지정자의 멤버에 접근 가능
정적 내부 클래스
- 주로 외부 클래스의 클래스 메서드로 사용
- static 키워드 사용
class Outer{
private int num = 3; //사용 불가
private static int sNum = 4; //사용 가능
void getPrint(){
System.out.println("인스턴스 메서드"); //사용 불가
}
static void getPrint(){
System.out.println("정적 메서드"); //사용 가능
}
static class Inner{ //정적 내부 클래스
void test{
System.out.println("sNum : " + sNum);
getPrintStatic(); //num과 getPrint()는 정적 멤버가 아니라서 사용 불가능
}
}
- static 변수, 메서드 사용 가능
지역 내부 클래스
- 외부 클래스의 메서드나 초기화 블록에 선언된 클래스
- 선언된 블록 내부에서만 사용 가능
class Outer{
void test(){ //메서드
...바디...
class LocalInner{ //지역 내부 클래스
void getPrint(){
System.out.println("지역 내부 클래스입니다")
}
}
}
LocalInner localInner = new LocalInner();
localInner.getPrint(); //호출
}
//출력값
지역 내부 클래스입니다