반응형
1. 상속( inheritance )
- 상속의 정의와 장점
- 상속이란 기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
- 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.
==> 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다. - 상속을 구현하기 위해선 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 extends와 함께 써 주기만 하면 된다.
조상클래스 부모( parent )클래스, 상위( super )클래스, 기반( base )클래스 자손클래스 자식( child )클래스, 하위( sub )클래스, 파생된( derived )클래스 - 생성자와 초기화 블록은 상속되지 않으며 멤버만 상속된다.
- 자손클래스의 멤버 개수는 조상클래스보다 항상 같거나 많다.
- 자손클래스의 인스턴스를 생성하면 조상클래스의 멤버와 자손클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.
- 클래스 간의 관계 - 포함관계
- 상속 이외에도 클래스를 재사용하는 또 다른 방법이 있는데 그것은 클래스 간에 포함관계를 맺어주는 것이다.
- 클래스 간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것이 좋다.
- 클래스를 작성하는 데 있어서 상속관계를 맺어 줄 것인지 포함관계를 맺어줄 것인지 결정하는 것은 때때로 혼란스럽다.
상속관계 '~은 ~이다.( is - a )' 포함관계 '~은 ~을 가지고 있다.( has - a )' 원( Circle ), 점( Point ) 원( Circle )은 점( Point )이다. Circle is Point 원( Circle )은 점( Point )을 가지고 있다. Circle has a Point ==> 포함관계
- 단일 상속
- 다른 객체지향 언어인 C++ 에선 다중 상속을 허용하지만 자바에서는 오직 단일 상속만을 허용한다.
- 예를 들어 TV 클래스와 VCR클래스가 있을 때 두 클래스로부터 상속을 받는 TVCR클래스를 작성할 수 없다.
만약 다중 상속이 허용된다고 할 때 두 클래스 모두 power()라는 메소드가 있다면 어느 조상클래스의 power()를 상속받게 되는 것일까? - 자바에서는 다중 상속의 이러한 문제점을 해결하기 위해 다중상속의 장점을 포기하고 단일 상속만 허용된다.
==> 이럴 때 포함관계를 사용할 수 있다.( 상속을 받으면서 포함관계를 하면 두 개의 클래스로부터 사용할 수 있다.
- Object 클래스 - 모든 클래스의 조상
- Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.
- 다른 클래스로부터 상속받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 함으로써 이것을 가능하게 한다.
- 자바의 모든 클래스들은 Object 클래스의 멤버들을 상속받기 때문에 Object 클래스에 정의된 멤버들을 사용할 수 있다.
2. 오버라이딩( overriding )
- 오버라이딩이란?
- 조상클래스로부터 상속받은 메소드의 내용을 변경하는 것을 오버라이딩이라고 한다.
- 상속받은 메소드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다.
==> 이럴 때 조상의 메소드를 오버라이딩이라고 한다.
- 오버라이딩의 조건
- 자손클래스에서 오버라이딩하는 메소드는 조상클래스의 이름, 매개변수, 반환타입이 같아야 한다.
- 접근제어자는 조상클래스의 메소드보다 좁은 범위로 변경할 수 있다.
- 만일 조상 클래스의 정의된 메소드의 접근 제어자가 protected라면 이를 오버라이딩하는 자손 클래스의 메소드는 접근 제어자가 protected 또는 public이어야 한다.( 대부분은 같은 범위의 접근 제어자를 사용한다. ) - 조상클래스의 메소드보다 많은 수의 예외를 선언할 수 없다.
- 인스턴스 메소드를 static 메소드 또는 그 반대로 변경할 수 없다.
- 오버로딩 VS 오버라이딩
- 오버로딩은 기존에 없는 새로운 메소드를 추가하는 것이고, 오버라이딩은 조상으로부터 상속받은 메소드의 내용을 변경하는 것이다.
오버로딩( overloading ) 기존에 없는 새로운 메소드를 정의하는 것( new ) 오버라이딩( overriding ) 상속받은 메소드의 내용을 변경하는 것( change, modify )
- 오버로딩은 기존에 없는 새로운 메소드를 추가하는 것이고, 오버라이딩은 조상으로부터 상속받은 메소드의 내용을 변경하는 것이다.
- super
- super는 자손클래스에서 조상클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조변수이다.
- 멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버와 이름이 같을 때 super를 붙여서 구분할 수 있다.
- 조상클래스로부터 상속받은 멤버도 클래스 자신의 멤버이므로 super대신 this를 사용할 수 있다.
- 그래도 조상클래스의 멤버와 자손클래스의 멤버가 중복 정의되어서 서로 구별해야 하는 경우에만 super를 사용하는 것이 좋다.
- super()
- this()와 마찬가지로 super() 역시 생성자이다.
- this()는 같은 클래스의 다른 생성자를 호출하지만 super()는 조상클래스의 생성자를 호출하는 데 사용된다.
- 자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
- 이때 조상클래스의 멤버의 초기화 작업이 수행되어야 하기 때문에 자손클래스의 생성자에게 조상클래스의 생성자가 호출되어야 한다.
- 생성자의 첫 줄에서 조상클래스의 생성자를 호출해야 하는 이유는 자손클래스의 멤버가 조상클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어 있어야 한다.( 조상클래스에서 초기화 한 값을 쓰기 위해서는 조상에서 먼저 초기화 작업을 해야한다. )
- 부모의 생성자가 먼저 초기화 되어 있어야 자식도 생성자를 생성할 수 있다.
- 맨 처음에 아무것도 안 쓰면 자식은 부모의 기본 생성자로 초기화할 수 있다.
- super( , )로 기본 생성자 아닌 부모에서 작성한 다른 생성자로 초기화 할 수 있다.
반응형
'웹개발 > JAVA' 카테고리의 다른 글
[JAVA] 다형성( polymorphism ) (0) | 2022.01.25 |
---|---|
[JAVA] 제어자( modifier ) (0) | 2022.01.24 |
[JAVA] 오버로딩( Overloading ), 생성자( Constructor ), 변수의 초기화 (0) | 2022.01.18 |
[JAVA] 변수와 메소드 (1) | 2022.01.16 |
[JAVA] 객체지향 언어, 클래스와 객체 (0) | 2022.01.16 |