상속(inheritance) / 메소드 재정의(오버라이딩 Overriding)
클래스의 특징 3가지
① 은닉화 -> public 보다 private를 사용한다.
② 중복성 -> 중복 (함수중복/생성자중복)
③ 상속성 -> 부모클래스의 멤버를 자식에게 물려준다.
자바에서 만들어진 모든 클래스는 Object 클래스를 상속받는다.
자바는 다중 상속을 허용하지 않는다. 즉, 여러 개의 부모클래스를 상속할 수 없으므로 extends 뒤에는 하나의 부모클래스만 와야한다.
상속inheritance
: 상속이란? 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해서 클래스를 작성하면 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 용이하다. 이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 기여한다.
- 변수, 함수, 생성자를 가지고 있다.
- 다른 객체지향언어인 C++에서는 다중상속이 가능하지만 자바에서는 단일 상속만을 허용한다.
- 상속의 장단점
장점 : 효율적이고 개발시간을 줄인다.
유지보수 시간을 줄일 수 있다.(부모 클래스의 수정으로 모든 자식 클래스들의 수정효과)
단점 : 상속구조가 복잡해지면 이해하기 힘들고 프로그램이 무거워진다.
- 클래스 상속
예제1)
부모클래스의 private로 선언된 필드와 메소드는 상속 대상에서 제외된다.
- 외부에서 접근이 불가능 하면서 상속해줄 수 있는 접근제어자 => protected
부모로부터 상속받은 속성들은 내 것처럼(this) 쓸 수 있다.
상속받은 것에 한해서 super 를 사용해서 부모필드와 부모함수를 사용할 수 있다.
super 는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다. 멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 붙여서 구별할 수 있다.
조상 클래스로부터 상속받은 멤버도 자손 클래스 자신의 멤버이므로 this를 사용할 수 있지만, 구별하기 위해서 super를 사용하는 것이 좋다.
this.x = x; 도가능하지만 상속받은 변수임을 구분하기 위해 super를 사용한다.
예제 2)
<클래스 다이어그램>
관계(Relationship)
1. 정의
- 구성요소들간의 의미 있는 연관성을 표현
- 일반적으로 클래스들간의 관계 표현 시 사용된다.
2. 종류
- 일반화관계(Generalization Relationship)
- 실체화, 실현화 관계(Realization Relationship)
- 의존관계(Dependency Relationship)
- 연관관계(Association Relationship)
- 집합연관(Aggregation Relationship)
- 복합연관(Composition Relationship)
예제 3)
- 부모생성자 호출
예제 4)
DSon이라는 클래스의 객체로 a를 생성해서 생성자를 찾아간다.
자기거 찾아서 default 생성자 없어. 부모꺼 올라가서 없으면 default생성자
즉, 자식클래스에서 자기 자신의 생성자가 없으면 부모생성자를 찾아간다. (만약 자기 자신의 생성자가 존재하면 자식클래스 생성자가 우선)
상속의 생성자는 super 라는 키워드로 접근한다.
super() : default생성자
super()는 부모의 기본 생성자를 호출한다.
super(10): int를 타입으로 파라미터 한개를 가지고 있는 생성자.
예제 5)
예제 6)
setAccumulator 메소드에서 totalValule +=initValue; 를 작성했더니 값이 두번 더해져서 totalValue값이 이상하게 나왔었다. getTotal() 메소드를 따로 빼서 작성해주도록 하자.
// 클래스, 추상클래스, 인터페이스 함수 재정의가 가능하다.
// 인터페이스는 반드시 재정의해야한다.
오버라이딩
:오버라이딩이란? 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야하는 경우가 많다. 이럴 때 조상의 메서드를 오버라이딩한다.
조건 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서도와 1) 이름이 같아야한다. 2) 매개변수가 같아야한다. 3) 반환타입이 같아야한다.
- 함수(메소드) 재정의(Overriding)
부모클래스의 모든 메소드가 자식 클래스에게 맞게 설계되었다면 가장 이상적인 상속이지만, 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수도 있다. 이 경우 상속된 일부 메소드는 자식클래스에서 다시 수정해서 사용할 수 있다.
메소드 오버라이딩은 상속된 메소드의 내용이 자식 클래스에 맞지 않을 경우, 자식 클래스에서 동일한 메소드를 재정의하는 것을 말한다.
예제 1)
disp()함수가 자식클래스인 BB에서 재정의
메소드가 오버라이딩되었다면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 오버라이딩된 자식 메소드가 호출된다.
예제 2)
yousan()함수가 자식클래스인 HSon에서 재정의
다형성
:다형성이란? 상속과 함께 객체지향개념의 중요한 특징 중의 하나이다. 객체지향개념에서 '다형성' 이란 여러가지 형태를 가질 수 있는 능력을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것이다. 구체적으로 말하자면, 부모클래스의 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다는 것이다.
아래의 예시에서 HParents r = new HSon(1, 2); -> 부모 타입의 참조변수로 자손 인스턴스를 참조
- 참조변수의 형변환
부모클래스에서 자식클래스로 업캐스팅 할 수 있다. 그러나 자식은 부모클래스를 담을 수 없다.
그렇게 생성한 객체로 함수재정의 한 자식함수를 사용할 수 있다. 그러나 자식클래스에서 생성한 함수는 사용할 수 없다.
upCasting 한 자식클래스만 다시 downCasting 할 수 있다.
a객체는 upCasting하고 downCasting했기 때문에 오류가 나지 않는다.
[정리]
- 부모클래스는 자식클래스를 담아줄 수 있다. 오버라이딩된 함수를 가져다가 쓸 수 있다.
- 업캐스팅된 자식클래스는 다운캐스팅할 수 있다.
자식타입 -> 조상타입(Upcasting) : 형변환 생략가능
자손타입 <- 조상타입(DownCasting) : 형변환 생략불가
예제 3)
최상위 클래스인 Object로 받아서 다운캐스킹
예제 4)
배열을 이용해서 사용할 수 있다.
final 은 함수 재정의가 안된다.
재정의말고 부모함수의 final 메소드를 가져다 쓰는 것은 가능하다.
[참고] 오버로딩 vs 오버라이딩
오버로딩(Overloading): 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩(Overriding): 상속받은 메서드의 내용을 변경하는 것