클래스의 구조와 생성자
클래스 구조
객체의 속성와 행위를 추상화하여 클래스에 정의된 것이 변수와 메서드임
Java
// 클래스 정의
class Person {
String name; // 인스턴스 변수
int age;
static char sex; // 클래스 변수
increaseAge() { }; // 메서드
sleep() { };
}
// 객체 생성
// 클래스명 참조변수 = new 생성자호출;
Person p1 = new Person();
Person p2 = new Person();
1. 멤버 변수
변수는 클래스 변수와 인스턴스 변수로 구분됨
Java
// 인스턴스 변수
p1.name = "capo"; // p1 객체에만 영향미침
p1.age = 100;
p2.name = "joy";
p2.age = 26;
// 클래스 변수
p1.sex = 'f'; // p1, p2는 물론이고 Person 클래스로 생성하는 모든 객체에 영향미침(꼭 객체를 생성해서 접근해야하는 것은 아님)
클래스 변수
static
- 클래스의 상태
- 클래스가 로딩될 때 메모리의
class area
에 단 한번 생성됨. 즉, 같은 클래스 객체는 같은 클래스 변수를 공유함. 또한 인스턴스 변수와 달리 객체 생성(new
) 시 heap 영역에 생성되지 않음.
인스턴스 변수
- non-static
- 객체의 상태
- 객체 생성(
new
) 시 메모리의heap 영역
에 생성되는 인스턴스 변수. 즉, 객체별 다른 값을 가짐.
2. 멤버 메서드
클래스 메서드
static
- 클래스 관점에서의 행위
- 객체 생성 및 식별하지 않고도 실행할 수 있는 작업들
- 메서드 내부에서 클래스 멤버만 사용하면 클래스 메서드임
인스턴스 메서드
- non-static
- 객체 관점에서의 행위
- 객체 생성 및 식별을 해야만 실행할 수 있는 작업들
- 메서드 내부에서 인스턴스 멤버를 사용하면 인스턴스 메서드임
인스턴스 메서드(멤버)에서는 클래스 멤버에 접근하여 이용할 수 있음. 단, 반대는 불가능함. (인스턴스 멤버에 접근하여 이용하기 위해서는 객체를 생성해야 하므로)
-클래스 멤버 사용
-
클래스 멤버
클래스명.멤버변수
클래스명.멤버메서드()
-
인스턴스 멤버
- 객체생성
객체참조변수명.멤버변수
객체참조변수명.멤버메서드()
3. 생성자
객체 생성 시 초기화를 담당하는 특별한 메서드. 객체 초기화의 다양성을 제공함.
4. 중첩 클래스(Nested Class, Inner Class)
내부 클래스에서는 외부 클래스의 멤버를 참조 없이 접근할 수 있음
5. 초기화자(Initializer)
자동 실행되는 블럭
Static Initializer
static { }
- 클래스가 메모리에 로드될 때 자동 실행
- static 변수 초기화가 필요할 때 사용
Instance Initializer
{ }
- 객체 생성(
new
)할 때마다 자동 실행 - 클래스의 생성자가 인스턴스 초기화자의 거의 대부분의 역할을 대신할 수 있음
생성자
객체 생성 시 초기화를 담당하는 특별한 메서드
작성규칙
- 생성자는 클래스명과 같아야함
- 키워드
new
와 항상 같이 사용됨 ->new 생성자()
형태 -> 객체 생성 시new 클래스명()
은 잘못된 설명임.new
뒤에는 클래스명과 동일한 생성자가 오는 것! - 반환형(return type)이 없음(void도 안씀)
- 이름은 같지만 매개변수가 다른 생성자를 여러개 중복정의(Overloading)할 수 있음 -> 생성자 오버로딩의 이점 : 상황에 따라 객체 생성과 초기화를 다양하게 할 수 있음
- 명시적으로 작성하지 않을 경우 컴파일러에 의해 기본 생성자가 제공됨
- 자식 클래스에서 부모 클래스 생성자 상속 불가능(생성자는 클래스명과 같아야한다는 규칙에 어긋남)
Java
// 클래스 정의
class Person {
String name; // 인스턴스 변수
int age;
char sex; // 클래스 변수
increaseAge() { }; // 메서드
sleep() { };
// 기본 생성자
Person() { }
// 생성자 오버로딩1
Person(String name, int age) {
this.name = name;
this.age = age;
}
// 생성자 오버로딩2
Person(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
}
Person p0 = new Person();
Person p1 = new Person("capo", 100);
Person p2 = new Person("joy", 26, 'f');
this 예약어
non-static 영역에서만 사용 가능(this가 자기 자신 객체를 가리키므로 객체를 생성하지 않는 static에서는 사용 불가능)
-
지역 변수와 멤버 변수 구분
this.____
형태- 멤버 변수가 현재 클래스에 없으면 부모 클래스에서 찾음
-
생성자 안에서 현재 클래스의 또 다른 생성자를 메서드처럼 호출하는 경우
this( )
형태- 생성자 오버로딩의 경우 사용
JavaPerson(String name, int age){ this.name = name; // 지역변수(매개변수)와 멤버변수 구분 this.age = age; } Person(String name, int age, boolean isHungry){ this(name, age); // 다른 생성자 호출하는 형태 this.isHungry = isHungry; }