객체지향 언어의 장점은 유지 보수성이 높은 시스템을 개발할 수 있다는 것이다. 유지보수성을 높이는 가장 기본적인 원칙은 " 중복을 제거하는 것"(공통 멤버를 가지는 클래스들 간의 공통점이 있는지, is-a 관계 성립)
상속: 기존에 존재하는 유사한 클래스로부터 속성괴 동작을 그대로 가져다 사용하면서 자신이 필요한 기능을 추가하는 기법, 자식 클래스가 부모클래스의 멤버를 쿨려받는 것(is - a 관계: ~은 ~이다.)
[클래스 정의 다음에 extends(자식 클래스가 상속할 부모 클래스를 지정하는 키워드)를 써주고 수퍼 클래스 이름]
이미 존재하는 클래스(상속하는 클래스, 내용이 정의된 클래스): 슈퍼클래스, 부모 클래스, 베이스 클래스
상속을 받는 클래스(가져다 사용하는 클래스): 서브 클래스, 자식 클래스, 파생 클래스
- 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것
- 하위클래스는 상위 클래스의 멤버개수보다 적을 수 없다.(같거나 많다)
- 공통 부분은 부모클래스에서 관리하고 개별부분은 자식클래스에서 관리한다.
상속 효과
- 부모 클래스 재사용해 자식 클래스 빨리 개발 가능
- 반복된 코드 중복 줄임
- 유지 보수 편리성 제공
- 객체 다형성 구현 가능
상속 대상 제한
- 부모클래스의 private 접근 갖는 필드와 메소드 제외
- 부모 클래스가 다른 패키지에 있을 경우, default 접든 갖는 필드와 메서드도 제외
#클래스 상속
[접근 제한자 class 클래스명 extends 부모 클래스명{ }]
자바는 단일 상속 - 부모 클래스 나열 불가
class 자식 클래스 extends 부모 클래스1, 부모 클래스2 { }(X)
대개 슈퍼클래스는 추상적이고 서브 클래스는 구체적이다.
슈퍼 클래스를 변경하면 서브 클래스에 영향을 준다.
super: 하위클래스에서 상위 클래스로부터 상속받은 멤버를 참조할 때 사용하는 참조변수. 객체 자신을 참조하는 참조변수인 this처럼 보든 하위 클래스의 객체에는 상위 클래스를 참조하는 참조변수 super가 있다.
super.필드명; | 상위 클래스의 클래스 변수나 접근제어에 의해 접근이 가능한 필드에 접근한다. |
super.메서드(); | 상위 클래스의 메서드에 접근한다. |
super(); | 상위 클래스의 생성자에 접근한다. |
접근제어자 class 자식클래스명(this) extends 부모클래스명(super){
}
재정의 (오버라이딩)
메서드 오버라이딩 : 소브 클래스가 필요에 따라 상속된 메소드를 다시 정의하여 사용하는 것. 상속 받은 메소드들을 자기 자신의 필요에 맞추어 변경할 수 있다. 부모클래스에서 정의된 메서드를 자식 클래스에서 재정의해서 사용할 수 있는데 이것을 자식 클래스에서 부모 클래스의 메서드를 오버라이딩한다고 표현. 상위클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 메서드 오버라이딩이라고 한다.
- 메소드의 헤더부분은 수퍼 클래스의 헤더와 동일하다. 수퍼 클래스의 메소드와 동일한 시그니처를 가져야 한다(메소드의 이름, 반환형, 매개변수의 개수와 데이터 타입이 일치하여야 한다.)
- 접근 지정자의 경우 슈퍼클리스의 메소드보다 더 좁은 범위로 변경할 수 없다. (public을 default나 private로 수정 불가, 반대로 default는 public 으로 수정가능)
- private.static.final 메소드는 재정의할 수 없다.
- 메서드 호출 순위는 오버라이딩한 메서드가 부모 클래스의 메서드보다 높다.
어노테이션 : 프로그램에게 추가적인 정보를 제공해주는 메타데이터
- 컴파일러에게 코드 작성 문법 에러 체크하도록 정보 제공
- 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동 생성하게 정보 제공
- 실행 시 특정 기능 실행하도록 정보 제공
메타데이터 : 다른 데이터를 설명해 주는 데이터
@Override 어노테이션
컴파일러에게 부모 클래스의 메소드 선언부와 동일한지 검사 지시
메서드 오버로딩 | 메서드 오버라이딩 | |
선언 | 같은 클래스에서 동일한 이름의 메서드 중복 작성 | 서브 클래스에서 슈퍼 클래스에 있는 메서드와 동일한 이름의 메서드 재정의 |
괸계 | 동일한 클래스 | 상속 관계 |
목적 | 이름이 같은 여러 개의 메서드를 중복 작성하여 사용의 편의성 향상. | 슈퍼 클래스에 구현된 메서드를 무시하고 서브 클래스에서 새로운 기능의 메서드를 재정의하고자 함 |
조건 | 메서드 이름은 반드시 동일하고 매개변수 타입이나 개수가 달라야 함 | 메서드의 이름, 매개변수 타입과 개수, 리턴 차입이 모두 동일하여야 성립 |
바인딩 | 정적 바인딩. 호출될 메서드는 컴파일 시에 결정 | 동적 바인딩. 실행 시간에 오버라이딩된 메서드 찾아 호출 |
super()문도 생성자에서만 사용할 수 있으며 자신이 아닌 부모 생성자를 호출할 때 사용한다.
- 모든 클래스는 생성자가 반드시 존재한다.(컴파일러가 비어있는 기본 생성자를 생성)
- 자식 클래스의 모든 생성자는 첫 번째 줄에 super()문이 자동 추가(생성자에서 super()문을 사용하지 않았을 때만 자동 추가)
- 자식 클래스의 인스턴스를 생성할 때 부모 클래스의 생성자도 함께 호출