[객체지향 프로그래밍 심화] (1) 상속
상속이란
상속은 객체지향 프로그래밍 설계를 위한 핵심 기술 중 하나로
상속이란, 기존의 클래스를 재사용하여 새로운 클래스로 작성하는 것을 의미합니다.
extends
상위(조상) - 하위(자식) 클래스
상위 클래스로부터 확장되었다.
코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여합니다.
자바에서는 다중 상속을 허용할 시에 생기는 문제점 때문에 단일 상속만 허용합니다.
포함 관계
포함은 상속처럼 클래스를 재사용할 수 있는 방법으로, 한 클래스 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것입니다.
상속관계? 포함관계?
~ 은 ~이다(IS) : 상속관계
~은 ~ 을 가지고 있다(HAS) : 포함관계
상속보다는 포함 관계를 사용하는 경우가 대다수입니다.
public class Employee {
int id;
String name;
Address address;
public Employee(int id, String name, Address address){
this.id=id;
this.name=name;
this.address=address;
}
void showInfo(){
System.out.println(id + " " + name);
System.out.println(address.city + " " + address.country);
}
public static void main(String [] args){
Address address1=new Address("서울","도쿄");
Address address2=new Address("도쿄", "일본");
Employee e = new Employee(1, "김코딩",address1);
Employee e2 = new Employee(2, "sksdud",address2);
e.showInfo();
e2.showInfo();
}
}
클래스 타입을 가진 address 변수(기본형이 아니니까 참조변수! / Address address)를 Employee 클래스의 멤버변수로 쓰면서 코드의 중복을 없애고 포함관계로 클래스를 재사용하고 있다.
메서드 오버라이딩
상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의(변경)하는 것을 의미합니다.
오버라이딩 조건
1. 선언부(반환타입, 메서드 이름, 매개변수)가 조상 클래스의 메서드와 일치해야 한다.
2. 접근 제어자는 상위 클래스의 좁은 범위로 변경할 수 없다.
3. 상위 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
super 와 super( )
super
하위 클래스에서 상위 클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조변수입니다.
상속받은 멤버와 자신의 멤버와 이름이 같을 때 super를 붙여서 구분합니다.
모든 인스턴스 메서드에는 this와 super 가 지역변수로 존재합니다.
자신들이 속한 인스턴스의 주소가 자동으로 저장되는데
결국 조상의 멤버와 자신의 멤버를 구분한다는 점에서 this 와 super는 근본적으로 같습니다.
this : 인스턴스 자신을 가리키는 참조변수
super : 상위 클래스로부터 상속받은 멤버를 참조하는 참조변수
super( )
this()와 마찬가지로 super( )도 생성자입니다. 조상의 생성자를 호출한다는 점이 다릅니다.
생성자 안에서만 사용이 가능하고 반드시 첫 줄에 와야 합니다.
this( ) : 같은 클래스의 다른 생성자.
super( ) : 상위 클래스의 생성자.
Object 클래스 : 최상위 조상 클래스
Object 클래스는 자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스입니다. 때문에 아무것도 상속받지 않은 것처럼 보여도 컴파일러가 자동으로 extends Object를 추가합니다. 따라서 Object 클래스의 멤버들을 상속받아 사용할 수 있답니다.
자바의 모든 클래스는 Object 클래스로부터 확장된다 O
Object 클래스 내의 메서드들을 사용할 수 있게 되면서 코드 짜기가 아주 수월해진다!
🗨 용어 정리
- 자바의 멤버(member) : 객체가 가지고 있는 속성과 기능을 그 객체의 멤버라고 한다. 필드와 메서드가 있다.