1.1 상속의 정의
. 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것.
. 적은 양의 코드로 새로운 클래스를 작성하고, 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.
. 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 'extends'와 함께 써주면 된다.
. 서로 상속 관계에 있다고 하며, 상속해주는 클래스를 '조상 클래스'라 하고 상속 받는 클래스를 '자손 클래스'라 한다.
- 조상 클래스 / parent class / super class / base class
- 자손 클래스 / child class / sub class / deriverd class
. java 클래스 간에 상속은 단일 상속
. C+ 다중상속 가능(하지만 쓰지 않는게 좋다.)
. interface의 다중상속 가능
. 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
. 자손 클래스의 멤버 개수는 조상 크래스보다 항상 같거나 많다.
. 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에 따로 조상 클래스의 인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용할 수 있다.
1.2 클래스간의 관계 - 포함관계
. 상속이외에도 클래스를 재사용하는 또 다른 방법이 있는데, 그것은 클래스 간에 Composite 관계를 맺어 주는 것이다.
. 클래스 간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다.
. ex) class Circle{ Point c = new Point(); int r;}
1.3 클래스간의 관계 결정하기
. '~ 은 ~ 이다(is-a)' 와 '~은 ~을 가지고 있다(has-a)'로 클래스간의 관계가 명확해진다.
. 원은 점이다. - Circle is a Point. // 상속관계
. 원은 점을 가지고 있다. - Circle has a Point. // 포함관계
. 조상 클래스에 정의된 메서드와 같은 메서드를 자손 클래스에 정의하는 것을 '오버라이딩'이라고 한다.
1.4 단일상속(single inheritance)
. C++에서는 여러 조상 클래스로부터 상속받는 것이 가능한 다중상속(multiple inheritance)를 허용하지만, Java에서는 단일 상속만을 허용한다.
. 다중상속을 허용하면 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있지만, 클래스간의 관계가 매우 복잡해지는것과 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점을 가지고 있다.
. static메서드라면 메서드 이름 앞에 클래스의 이름을 붙여서 구별할 수 있다지만, 인스턴스 메서드의 경우 선언부가 같은 두 메서드를 구별할 수 있는 방법은 없다.
1.5 Object Class - 모든 클래스의 조상
. Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상 클래스이다. 다른 클래스로 부터 상속 받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받게 함으로써 이것을 가능하게 한다.
. Object클래스에는 toString(), equlas()와 같은 모든 인스턴스가 가져야 할 기본적인 11개의 메서드가 정의되어 있다.
2. overring
2.1 오버라이딩
. 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.
. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야하는 경우가 많다. 이럴때 조상의 메서드를 오버라이딩 한다.
2.2 오버라이딩의 조건
. 메서드의 내용만을 새로 작성하는 것이므로 메서드의 선언부는 조상의 것과 완전히 일치해야 한다.
. 조건 - 이름이 같아야한다 / 매개변수가 같아야 한다 / 반환타입이 같아야 한다
. JDK 1.5부터 공변 반환타입(covariant return type)이 추가되어, 반환타입을 자손 클래스의 타입으로 변경하는 것은 가능하도록 조건이 완화되었다.
. 선언부가 서로 일치해야 하며, 접근제어자(access modifier)와 예외(exception)는 제한된 조건 하에서만 다르게 변경할 수 있다.
1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
- 만일 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 이를 오버라이딩하는 자손 클래스의 메서드는 접근 제어자가 protected나 public이어야 한다. 대부분의 경우 같은 범위의 접근 제어자를 사용한다. 접근 제어자의 접근범위를 넓은 것에서 좁은 것으로 나열하면 public, protected, (default), private이다.
2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
3. 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
- 조상 클래스에 정의된 static메서드를 자손 클래스에서 똑같은 이름의 static메서드로 정의 가능하다.
- 하지만 이것은 각 클래스에 별개의 static메서드를 정의한 것일 뿐 오버라이딩은 아니다.
- 각 메서드는 클래스 이름으로 구별 될 수 있으며, 호출할 때는 '참조변수.메서드이름()' 대신 '클래스이름.메서드이름()'으로 하는 것이 바람직 하다.
- static멤버들은 자신들이 정의된 클래스에 묶여있다고 생각하면 된다.
2.3 오버로딩 vs 오버라이딩
- 오버로딩은 기존에 없는 새로운 메서드를 추가하는 것이고, 오버라이딩은 조상으로부터 상속받은 메서드의 내용을 변경하는 것이다.
- overloading - new
- overriding - change, modify
2.4 super
. super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다.
. 멤버변수와 지역변수의 이름이 같을 때 thie를 사용해서 구별했듯이 상속받은 멤버와 자신의 클래스에 저의된 멤버의 이름이 같을 때는 super를 사용해서 구별 할 수 있다.
. 조상 클래스로부터 상속받은 멤버도 자손 클래스 자신의 멤버이므로 super 대신 this를 사용 할 수 있다.
. 그래도 조상 클래스의 멤버와 자손클래크의 멤버가 중복 정의되어 서로 구별해야하는 경우에만 super를 사용하는 것이 좋다.
. 조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점을 제외하고는 super와 this는 근본적으로 같다.
. 모든 인스턴스메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this와 super의 값이 된다.
. static메서드(클래스메서드)는 인스턴스와 관련이 없다. 그래서 this와 마찬가지로 super역시 static메서드에서는 사용할수 없고 인스턴세 메서드에서만 사용할 수 있다.
. 조상 클래스에 선언된 멤버변수와 같은 이름의 멤버변수를 자손 클래스에서 중복해서 정의하는 것이 가능하며 참조변수 super를 이용해서 서로 구별할 수 있다.
. 변수만이 아니라 메서드 역시 super를 써서 호출할 수 있다. 특히 조상 클래스의 메서드를 자손 클래스에서 오버라이딩한 경우에는 super를 사용한다.
2.5 super() - 조상 클래스의 생성자
. this()와 마찬가지로 super() 역시 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하는데 사용되지만, super()는 조상 클래스의 생성자를 호출하는데 사용된다.
. 자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 모두 합쳐진 하나의 인스턴스가 생성된다. 그래서 자손 클래스의 인스턴스가 조상 클래스의 멤버들을 사용할 수 있는 것이다.
. 조상 클래스 멤버의 초기화 작업이 수행되어야 하기 때문에 자손 클래스의 생성자에서 조상 클래스의 생성자가 호출되어야 한다.
. 생성자의 첫 줄에서 조상클래스의 생성자를 호출해야하는 이유는 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 초기화되어 있어야 하기 때문이다.
. Object클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자,this() 또는 super(),를 호출해야한다. 그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫 줄에 삽입한다.
'Java > Object-oriented Programming-2' 카테고리의 다른 글
| 8. Inner class(내부 클래스) (0) | 2022.01.10 |
|---|