Java 상속

Bennie97·2022년 2월 2일
0

상속


상속이란?

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것.
상속을 통해서 클래스를 작성하다 보면 적은 양의 코드로 새로운 클래스를 작성할 수 있다.
코드의 추가 및 변경이 매우 용이함. 코드의 재사용이 가능하다.

상속의 예시

class Phone{
	boolean power;
	void power() {	power = !power; }
    void call() { System.out.println("전화를 겁니다."); }
}

class Smartphone extends Phone {
    void takepicutre{
    	System.out.println("사진을 찍습니다.");
    }
}

상속은 상속을 받는 클래스를 '자손 클래스'
상속을 해주는 클래스를 '조상 클래스'라고 하며
자손 클래스는 조상 클래스의 모든 멤버변수, 메서드 등을 상속받는다.
따라서 위 예제에서 Smartphone 자식 클래스는 Phone 조상클래스의 모든 메서드를 상속받기 때문에 Smartphone 객체에서도 마음껏 call 메소드를 호출해 사용할 수 있다.
상속 받을때는 extends라는 키워드를 사용해준다.

단, 상속을 받을때 생성자와 초기화 블럭은 상속되지 않는다.

Java에서의 상속은 다중 상속을 지원하지 않는다. (단일 상속만 지원)

class Internet{
	boolean power;
	void power() {	power = !power; }
    void search() { System.out.println("검색시작!"); }
}

class Phone{
	boolean power;
	void power() {	power = !power; }
    void call () { System.out.println("전화를 겁니다."); }
}

class Smartphone (extends Internet.. | extedns Phone...?){
	void takepicutre{
    	System.out.println("사진을 찍습니다.");
    }
}

만일 자바에서 다중 상속을 허용한다면
Internet 클래스와 Phone클래스를 다중 상속받고 있는
Smartphone은 power()메소드를 쓰고 싶을때 Internet 클래스의 power()메서드를 써야하는가
아니면 Phone클래스의 power()메서드를 써야하는가 혼란에 빠질것이다.

따라서 이런 모호함을 없애기 위해 Java에서는 단일 상속만 지원한다.
굳이 다중 상속을 하고 싶으면 Interface나 has a 관계를 사용한다.

has a 관계

class Internet{
	boolean power;
	void power() {	power = !power; }
    void search() { System.out.println("인터넷 검색시작!"); }
}

class Phone{
	boolean power;
	void power() {	power = !power; }
    void call ()  { System.out.println("전화를 겁니다."); }
}

class Smartphone extends Phone {
	Internet inter = new Internet();
    void takepicutre{
    	System.out.println("사진을 찍습니다.");
    }
    void search(){
    	inter.serach();
    }
}

위 코드는 Smartphone 클래스가 Phone 클래스를 상속받고 Internet 클래스는 has a 방식으로 멤버변수로 포함시켜서 사용하였다.
power 메소드에 대한 모호성도 해결하였고 Internet 클래스의 search 메소드도 이용할수 있는 장점이 있다.
참고로 클래스 간 상속관계에서는 논리적으로 is a 관계가 성립될때 사용하는 것이 좋다.
사람마다 다르지만 Smartphone이 인터넷 보단 결국 전화기라고 생각해서
Phone을 상속받고 Internet을 has a 관계로 처리했다. (이건 사람마다 다를수있음)

Object 클래스

Object 클래스는 모든 클래스의 조상 클래스이다.
우리가 별도에 extends 선언을 하지 않고 클래스를 선언해도 뒤에 extends Object가 생략된채로 있는 형태이다. 그러므로 모든 클래스에서는 Object 클래스에서 정의된 메서드를 가지고 있고 사용할수 있다.
hashCode()나 equals()메서드, toString()메서드 같은것들이 Object클래스에 있었던 메서드들이다.

profile
현명한개발자가되자

0개의 댓글