DAY - 15
생성자에서 다른 생성자 호출하기( this, this() )
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다. 단 다음의 조건을 충족시켜야 한다.
1. 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
말 자체가 어려울 수 있으니 우선 this는 미래에 생성될 객체의 주소값.. 이렇게 정의한다.
매우 중요하니 this가 무엇인지 이해가 가지 않을 때는 위의 12글자를 머리속에 박아둬야한다.
만약 위의 예제에서 매개변수를 활용한 생성자에서 매개변수가 인스턴스변수인 color와 같은 color가 아니라 다른 이름이었다면 this를 쓰지 않아도 된다.
추가적으로.. 코드를 작성할 때 필드(변수) > 생성자 > 메서드 이 순서로 작업하는 것이 보기에 좋다.
변수의 초기화
변수를 선언하고 처음으로 값을 저장하는 것을 우리는 초기화라고 했었다.
이는 경우에 따라서 필수적이기도 하고 선택적이기도 하지만 가능하면 선언과 동시에 적절한 값으로 초기화 하는 것이 바람직하다.
하지만 우리가 이제까지 사용했던 지역변수는 무조건 사용전에 초기화해야 한다.
멤버변수, 즉 클래스변수와 인스턴스변수 와 배열은 초기화하지 않으면 그 기본값이 들어가는데, boolean타입은 false를 그 기본값으로 하며 참조형변수는 null, 나머지 기본자료형들은 전부 0을 그 기본값으로 한다.
멤버변수의 초기화방법 으로는 3가지 방법이 있는데
1. 명시적 초기화는 지역변수를 초기화하는 방법과 같다.
2. 생성자 - 앞서 생성자를 배울 때 생성자의 역할이 인스턴스변수의 초기화라는 것을 배웠다.
3. 초기화 블럭 - 복잡한 초기화에 가시성을 높이기 위해 블럭으로 구분하여 블럭 내에 코드를 작성하기만 하면 되는데 클래스멤버를 초기화하는 블럭일 경우 블럭 앞에 static을 붙여 표시해주어야 한다.
멤버변수의 초기화 시기와 순서
지금까지 멤버변수를 초기화하는 여러 방법들을 알아봤는데, 이제는 이 순서에 대해 정리해봐야한다.
여기서 중요한건 클래스변수는 클래스가 처음 메모리에 로딩될 때 단 한번만 초기화 된다는 점이다.
인스턴스변수는 인스턴스가 생성될 때마다 각 인스턴스별로 초기화된다.
여기서 클래스가 처음 메모리에 로딩된다는 것은 프로그램이 실행 도중 해당 클래스에 대한 정보가 요구될 때 클래스는 메모리에 로딩된다.
각 변수들이 초기화 되는 시점은 다르지만 내부의 순서는 비슷하다.
우선 기본값으로 초기화가 되고 책에는 명시적초기화가 우선, 그다음이 초기화블럭이라 되어있는데 이는 먼저 쓰인 순서대로 진행되는것을 확인했다.
클래스변수의 초기화는 한번 뿐이니 여기서 끝나지만 인스턴스 변수는 맨 마지막에 생성자가 있다.
즉 생성자로 초기화되는 것을 제일 마지막 순번으로 한다.
정리하자면,
1. 기본값으로 초기화
2. 명시적 초기화 및 초기화블럭
3. 생성자
위의 순서이다. 다만 클래스변수라면 3번이 없는 것이다.
7장 객체지향프로그래밍2
상속
상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
이해를 돕기 위해서는 상속이란 의미가 아니라 확장이란 의미로 해석하는 것이 좀더 편하다.
실제로 상속관계를 나타내기 위해서 확장이란 뜻의 extends를 사용한다.
class Child extends Parent {
}
여기서 두 클래스는 서로 상속관계에 있다고 말하며 Parent 클래스로부터 Child가 확장된 형태이기 때문에 Parent클래스를 조상클래스, Child클래스를 자손클래스라고 한다.
여기서 조상클래스는 주로 superclass, 자손클래스는 subclass라고 표현한다.
여기서도 중요한 것이 있다..
상속이 될 때, 생성자와 초기화 블럭은 상속되지 않고 오로지 멤버만 상속된다.
또한 당연하게도 자손클래스의 멤버 개수는 조상클래스보다 항상 같거나 많다.
포함
클래스 간의 관계에는 상속 이외에도 클래스를 재사용하는 포함이라는 관계도 존재한다.
이는 클래스를 따로 작성 하되 상속관계를 뜻하는 extends를 사용하지 않고 직접 다른 클래스에서 다른 클래스 타입의 참조변수를 선언하고 인스턴스를 생성한다.
두 경우를 비교하면 큰 차이가 없어 보이지만 is와 has를 통해 두 클래스 간의 관계를 확인해 보면 어떻게 처리를 해야할지 보다 명확해진다.
위의 예제는 포함관계를 통한것인데, 여기서 원과 점의 관계를 어떻게 명시할지 알아보자.
Circle is a Point : 원은 점이다.
Circle has a Point : 원은 점을 가지고 있다.
is를 사용했을 때가 더 나으면 상속관계로, has a가 더 자연스러우면 포함관계로 하면 된다.
위의 예제는 코드가 길어져 보기 쉽게 각 클래스 별로 잘라서 스크린샷을 찍었다.
이 예제를 작성할 때 toString()이라는 메서드를 사용하였는데 이는 조금 뒤에서 배울 오버라이딩과 관련이 있으니 현재는 설명을 생략한다.
위의 예제를 차근차근 해석하며 읽어보면 참 예술 예제임을 깨닫게 될 것이다.
오늘은 여기까지!!
처음듣는 용어들의 티키타카로 머리가 복잡하다.. 단기간에 많은 용어들이 언급되었지만 이 용어들간의 관계를 반드시 파악하고 넘어가야 할것같다.