자바의 정석 7장 (15일차) - 단일 상속 (single inheritance) & object & 오버라이딩 & 오버로딩

728x90

단일 상속

Java는 단일 상속만을 허용한다.

아래와 같은 두개의 상속은 불가 ( C++만 가능)

class SmartTv extends TV, option{

 

따라서 비중이 높은 클래스는 상속으로, 비중이 낮은 클래스는 포함으로 하여 코드의 간결화 가능

  • 아래는 SmartTV에서 비중이 높은? DVD클래스를 상속받고 TV클래스를 포함시켜 channel 값을 지정한 다음 메서드만 출력받아 아래와 같이 출력

출력문: 

1
10

	public static void main(String[] args) {
		SmartTv st = new SmartTv();
		st.channel = 0;
		st.channelup();
		System.out.println(st.channel);
		st.fast();
		System.out.println(st.channel);
	}
}
class SmartTv extends DVD{
	TV t = new TV();
	
	void fast() {
		channel *= 10;
	}
}
class DVD extends TV{
	void fast() {
		channel *= 10;
	}
	void slow() {
		channel -= 10;
	}
}
class TV{
	int channel;
	int volume;
	
	void channelup() {
		++channel;
	}
}

부모가 없는 자식 class의 경우

컴파일러가 자동으로 extends object를 붙여 자동상속받게 만듬

  • object는 상속의 최고 조상

11개의 메서드를 자동 추가(toString, equals, Hashcode등등)


오버라이딩

상속받은 부모의 메서드를 자신에 맞게 변경하는 것

  • 아래와 같이 SmartTv 메서드에서 본인이 상속받은 값에 맞게 출력문을 지정하여 출력
  • 상속받은 오버라이딩이 있더라도 새롭게 toString을 써서 오버라이딩을 하면 값이 새로 출력됨
    • 선언부와 매개변수 타입, 숫자가 일치해야 함
    • 접근제어자를 조상 클래스의 메서드보다 좁은 범위로 변경 불가능
    • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다 = 같거나 적어야한다
package CodingTestLv1;

public class Z_TestforRename2 {
	public static void main(String[] args) {
		SmartTv st = new SmartTv();
		st.channel = 1;
		st.fast();
		System.out.println(st);
	}
}
class SmartTv extends DVD{
	TV t = new TV();
	
	void fast(int a) {
	}
	@Override
	public String toString() {
		return "SmartTv [channel: " + channel + "]";
	}
}
class DVD extends TV{
	void fast() {
		channel *= 10;
	}
}
class TV{
	int channel;
	int volume;
}

 


오버로딩

기존에 없는 새로운 메서드를 정의하는 것(new)

  • 아래의 parentsmethod 처럼 새롭게 메서드르 정의하면 오버로딩
  • 같은 메서드 이름에서 매개변수 등을 다르게 하여 재정의하면 오버라이딩
  • 완벽하게 일치하여 메서드를 정의하면 중복정의이므로 에러가 남
class parents{}

class child extends parents{
	
	void parentsmethod() {}//오버 로딩
	void parentsmethod(int i) {} //오버라이딩 = 같은 메서드 이름
	void parentsmethod(int i) {}
	//단순한 중복정의 = 매개변수마저 같아버리면 안됨
}
728x90