클래스의 구조와 생성자

클래스 구조

객체의 속성행위를 추상화하여 클래스에 정의된 것이 변수메서드

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에서는 사용 불가능)

  1. 지역 변수와 멤버 변수 구분

    • this.____ 형태
    • 멤버 변수가 현재 클래스에 없으면 부모 클래스에서 찾음
  2. 생성자 안에서 현재 클래스의 또 다른 생성자를 메서드처럼 호출하는 경우

    • this( ) 형태
    • 생성자 오버로딩의 경우 사용
    Java
    Person(String name, int age){
        this.name = name;  // 지역변수(매개변수)와 멤버변수 구분
        this.age = age;
    }
    
    Person(String name, int age, boolean isHungry){
        this(name, age);  // 다른 생성자 호출하는 형태
        this.isHungry = isHungry;
    }