Archive for January, 2010

생성자 (Constructor)

생성자

OO언어에서 생성자는 클래스와 동일한 이름을 공유하며 방환 유형을 갖지 않는다.

컴파일러는 메서드 이름이 클래스 이름과 같다는 것을 인식하고 메서드를 생성자로 간주한다.

언제 생성자를 호출하는가?

새 객체를 만들 때 가장 먼저 발생하는 일 중 하나가 생성자를 호출하는 것이다.

Car myCar = new Car();

새로운 키워드는 Car 클래스의 새 인스턴스를 만들어서 필요한 메모리가 할당된다. 그런다음 생성자가 호출되고 인수가 매개변수 목록에 전달된다. 생성자는 개발자가 적합한 초기화에 주의할 수 있는 기회를 제공한다.

그래서 new Car() 코드는 Car 객체에 인스턴스를 만들고 생성자인 Car 메서드를 호출한다.

생성자 내부에는 무엇이 있는가?

생성자의 가장 중요한 기능 중 하나는 새로운 키워드를 만났을 때 할당된 메모리를 초기화하는 것일 것이다. 요약하면 생성자 내부에 포함된 코드는 새로 생성된 객체를 초기의, 안정적이고 안전한 상태로 설정해야 한다.

기본 생성자

클래스를 작성하고 생성자를 포함시키지 않더라도 클래스는 컴파일되어 사용할 수 있다. 클래스가 분명한 생성자를 제공하지 않을 경우 기본 생성자가 제공된다. 생성자를 직접 작성하는지 여부에 관계없이 적어도 하나의 생성자가 항상 존재한다는 것을 이해해야 한다. 생성자를 제공하지 않으면 시스템에서 대신하여 기본 생성자를 제공한다.

기본 생성자에 의존하고 다른 생성자가 추가한 클래스에 유지 관리를 수행할 경우 기본 생성자가 만들어지지 않는다. 결국 기본 생성자는 생성자를 하나도 포함하지 않은 경우에만 추가된다. 하나만 포함하는 즉시 기본 생성자가 포함되지 않는다.

메서드 오버로딩

오버로딩(Overloading)은 메서드 서명이 매번 다르기만 하면 프로그래머가 계속해서 동일한 메서드 이름을 사용할 수 있도록 한다. 서명은 메서드 이름과 매개변수 목록으로 구성된다.

서명 -> public String getRecord(int key)

서명 = getRecord(메서드이름) + int key(매개변수 목록)

public void getCar();

public void getCar(String carName);  // 다른 매개변수 목록

public void getCar(int numberOfDoor);  // 다른 매개변수 목록

상위 클래스가 생성되는 방법

상속을 상요할 때에 부모 클래스가 어떻게 생성되는지 알아야만 한다. 상속을 사용할 때 부모에 대한 모든 것을 상속한다는 점을 기억해야 한다. 그러므로 부모의 데이터와 행위 모두에 대해 속속들이 알고 있어야 한다. 속성의 상속은 매우 분명하다. 그러나 생성자가 어떻게 상속되는지는 그렇게 분명하지 않다.

  1. 생성자 내부에서 가장 먼저 벌어지는 일은 상위 클래스의 생성자가 호출되는 것이다. 상위 클래스 생성자에 대한 분명한 호출이 없다면 기본 생성자가 자동으로 호출되지만 바이트코드에서 코드를 볼 수 있다.
  2. 그런 다음 객체의 각 클래스 속성이 초기화된다. 이것들은 클래스 정의의 일부인 속성이지(인스턴스 변수) 생성자 내부의 속성이나 기타 메서드(로컬 변수)가 아니다.
  3. 그런 다음 생성자에 있는 나머지 코드가 실행된다.

객체 관점에서 생각하는 방법

OO 사고 과정을 잘 이해하기 위해 할 수 있는 세 가지 중요한 일

  • 인터페이스와 구현 간에 차이가 있다는 점을 인식
  • 보다 추상적으로 생각
  • 사용자에게 가능한 최소한의 인터페이스만 제공

객체 지속성

객체 시속성이란 객체의 상태를 저장하여 나중에 복구하여 사용할 수 있게 하는 개념이다. 지속되지 않는 객체는 범위에서 벗어날 때에 기본적으로 소멸한다. 예를 들어 객체의 상태를 데이터베이스에 저장할 수 있다.