본문 바로가기

프로그래밍/Java

Java_객체지향언어(4)_상속, 포함관계, 오버라이딩

① 상속
: 상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
→ 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 기여한다.

- 구현 방법

class Parent{		//조상 클래스
	int age; 
}

class Child extends Parent {	//Child는 Parent의 자손 클래스
	//...
}

→ 새로 작성하고자 하는 클래스의 이름뒤에 상속받고자 하는 클래스의 이름을 'extends'와 함께 써주면 된다.
→ 상속해주는 클래스를 '조상 클래스'라 하고 상속 받는 클래스를 '자손 클래스'라 한다.
→ Parent 클래스에 int age를 멤버변수로 추가하면 자손 클래스는 자송의 멤버를 모두 상속 받기 때문에, Child 클래스는 자동적으로 age라는 멤버변수가 추가된 것과 같은 효과를 얻는다. (반대로 Child클래스에서 새로운 코드가 추가 되어도 Parent 클래스에는 아무런 영향을 주지 못한다.)
→ 위 이유로 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.

- 상속 예제

class Tv {
    boolean power;
    int channel;
    
    void power() {power = !power;}
    void volumelUp() {++volume;}
    void volumeDown() {--volume;}
}

class SmartTv extends Tv {
    boolean caption;
    void displayCaption(String text) {
    	if(caption) {
            System.out.println(text);
        }
    }
}

class Ex7_1 {
	pubic static void main(String args[]) {
        SmartTv stv=new SmartTv();
        stv.volume=7;
        stv.volumeDown();
        System.out.println(stv.volume);
        stv.displayCaption("Hello, World");
        stv.caption=true;
        stv.displayCaption("Hello, World");
    }
}
결과
6
Hello, World

→ 상속으로 조상 클래스인 Tv클래스의 멤버변수와 메서드들을 자손 클래스 SmartTv가 사용할 수 있다.

- 또 다른 객체지향언어인 C++에서는 여러 조상 클래스로부터 상속받는 것이 가능한데, 자바에서는 '단일 상속'만 허용한다. 그래서 둘 이상의 클래스로부터 상속을 받을 수 없다.

class TvDVD extends Tv, DVD {	//에러
    //...
}

→ 비중이 높은 클래스 하나만 상속관계로 나머지는 포함관계로 한다.


② 포함관계
: 상속이외에도 클래스를 재사용하는 또 다른 방법은 클래스 간에 '포함 관계'를 맺어주는 것이다.

class Circle {
    int x;
    int y;
    int r;
}

↓

class Point {
    int x;
    int y;
}
class Circle {
    Point c= new Point();
    int r;
}

→ 한 클래스의 멤버 변수로 다른 클래스 타입의 참조변수를 선언하는 것이다.

데이터 메모리

→ 포함관계를 해준 쪽이 더 세부적이고 복잡도가 줄어든다.

- 상속관계와 포함관계를 맺어줄 때 혼돈이 된다면 아래와 같이 문장을 만들어보면 클래스 간의 관계가 명확해진다.
상속 관계 : ~은 ~이다.
포함 관계 : ~은 ~을 가지고 있다.

③ Object클래스
- 다른 클래스로부터 상속받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받는다.


④ (메서드) 오버라이딩
: 상속받은 조상의 메서드를 자신에 맞게 변경하는 것이다.

class Point {
    int x;
    int y;
    
    String getLocation(){
    	return "x: "+x+", y:"+y;
    }
}

class Point3D extends Point {
    int z;
    
    String getLocation() {
    	return "x:"+x+", y:"+y+", z:"+z;
    }
}

→ Point3D라는 이름에 맞게 멤버변수를 선언하여 메서드의 내용을 오버라이딩 하였다.


- 오버라이딩의 조건
→ 메서드의 선언부(메서드 이름, 매개변수, 반환타입)가 조상 클래스의 메서드와 일치해야 한다.
→ 접근제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
→ 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.