클래스명(매개변수) {
// 생성자의 기본 구조
}
public class Person {
String name, address;
int age;
public Person() {} // 1번 생성자
public Person(String name, int age) { // 2번 생성자
this.name = name;
this.age = age;
}
public Person(String name, int age, String address) { // 3번 생성자
this.name = name;
this.age = age;
this.address = address;
}
}
클래스명() {}
// 예시
Person() {}
class Person {
private String name;
private String address;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("홍길동", 20);
System.out.println("제 이름은 " + p.getName() + "이고, 나이는 " + p.getAge() + "입니다.");
}
}
생성자에서 다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유는?
- 생성자 내에서 초기화 작업 도중 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화 할 것이다. 이로 인해 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있다.
class Person {
private String name;
private String address;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, String address) {
this(name, age);
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class Test {
public static void main(String[] args) {
Person person1 = new Person("홍길동", 20, "서울시");
}
}
class Person {
private String name;
private String address;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, String address) {
this(name, age);
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
class OuterClass {
class InnerClass {
// 인스턴스 내부 클래스
}
static class StaticInnreClass {
// 정적 내부 클래스
}
void main() {
class LocalInnerClass {
// 지역 내부 클래스
}
}
}
종류 | 선언 위치 | 사용 가능한 변수 |
---|---|---|
인스턴스 내부 클래스(Instance inner class) | 외부 클래스의 멤버변수 선언 위치에 선언(멤버 내부 클래스) | 외부 인스턴스 변수, 외부 전역 변수 |
정적 내부 클래스(Static inner class) | 외부 클래스의 멤버변수 선언 위치에 선언(멤버 내부 클래스) | 외부 전역 변수 |
지역 내부 클래스(Local inner class) | 외부 클래스의 메서드나 초기화 블럭 안에 선언 | 외부 인스턴스 변수, 외부 전역 변수 |
익명 내부 클래스(Anonymous inner class) | 클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스 | 외부 인스턴스 변수, 외부 전역 변수 |
class Car { // 외부 클래스
private String model; // 외부 클래스 인스턴스 변수
private static int maxFuel; // 외부 클래스 정적 변수
private Blackbox blackbox; // 내부 클래스 자료형 변수 선언
public Car() {
blackbox = new Blackbox();
}
class Blackbox { // 인스턴스 내부 클래스
String model;
int recordTime = 0; // 내부 클래스의 인스턴스 변수
void Blackbox() {
model = null;
recordTime = 0;
}
void print() {
System.out.println(model);
System.out.println(maxFuel);
System.out.println(recordTime);
}
}
}
class Car { // 외부 클래스
private String model; // 외부 클래스 인스턴스 변수
private static int maxFuel; // 외부 클래스 정적 변수
static void printTest() {
System.out.println("Car 클래스");
}
void printTest2() {
System.out.println("인스턴스 메서드");
}
static class Blackbox { // 정적 내부 클래스
void print() {
System.out.println(maxFuel);
printTest();
}
}
}