본문 바로가기

JAVA/기본

상속 Extends / 오버라이딩(overriding) / 오버로딩(Overloading)

상속


1. 부모 클래스의 자원을 자식 클래스에서 사용 가능
2. 두 클래스 관계를 설정하는 것
3. 물려주는 쪽이 부모 클래스가 되고 받는 쪽이 자식 클래스가 된다.
4. extends 키워드를 사용한다.
5. 부모 클래스 = super 클래스 = 기초클래스: 멤버를 물려준다.
   자식클래스 = 하위 클래스 = sub클래스: 멤버를 물려 받는다.
6. 객체 생성시 찾아가는 생성자는 부모 생성자를 먼저 찾아간다.

7. 상속 받은 내용을 재정의할 수 있다. (오버라이딩)

public class Car_Extends {//부모 클래스
	
	String name;
	int speed, price;
	
	public void setOption(int speed, int price) {
		this.speed = speed;
		this.price = price;
	}
	
	public void total() {
		System.out.println("자동차 속도: " + this.speed + " / 가격: " + this.price);
	}
	
	public void pandan() {
		System.out.println("자동차 잘 샀다");
	}
	
	public static void main(String[] args) {
		
		//Child 클래스에 아무것도 작성 안하고 extends 만 해서 
		//부모의 기능을 사용가능
		//또 자식 자체의 속성과 메소드도 사용 가능
		Child child = new Child();
		
		//부모 클래스의 기능들
		child.setOption(220, 50000);
		child.total();
		child.pandan();
		
		//Child 클래스의 기능
		child.right();
	}

}


class Child extends Car_Extends { //자식 클래스
	
	public void right() {
		System.out.println("응애 나 애기 자동차"); //자신만의 기능을 만들면 확장 했다고 표헌한다.
	}
	
}

부모 클래스에 매개변수가 있는 생성자가 있는 경우  super() 

package programmers;

public class Parent_01 {

	int age = 50;
	String name = "부모";
	
	Parent_01(){
		System.out.println("나는 부모 생성자");
	}
	
	public Parent_01(int age, String name) {
		this.age = age;
		this.name = name;
		System.out.println("나는 부모 생성자(매개변수 2개");
		System.out.println("나는 부모 생성자 나이: " + age + " / 이름: " + name);
	}
	
	public void pr(int age, String name) {
		System.out.println("자식 클래스에서 호출되어 출력 나이: " + age + " / 이름: " + name);
	}
	
	public static void main(String[] args) {
		//부모 클래스에 매개변수 생성자가 있는 경우
		//자식 클래스에서 매개변수 생성자를 만들고
		//super가 부모클래스 이니깐 super(부모 생성자에 넣을 매개변수)
		Hong hong = new Hong(10, "홍길동");
		hong.pr(10,"홍길동");
	}

}

class Hong extends Parent_01 {
	Hong(int age, String name){
		super(10, "부모이름");
	}
}

오버라이딩(overriding)

상속받은 자식클래스에서 같은 메소드의 내용을 재정의 할 수 있다.

상속받은 경우에만 사용가능

class Apt {
	int room = 3;
	void door() {
		System.out.println("부모클래스 호출: 문은 "+room+"개 입니다.");
	}
}

//상속받은 자식클래스에서 같은 이름의 메소드를 재정의(오버라이딩)할 수 있다.
class Dan extends Apt {

	@Override //컴파일시 재정의한 메소드인지 검증 부모 메소드명과 다르면 오류 발생
	void door() {
		System.out.println("자식클래스 호출, 메소드 재정의(오버라이딩): 도어락은 " + room+"개 입니다.");
	}
}

public class House {
	
	public static void main(String[] args) {
		
		Apt apt = new Apt();
		Dan dan = new Dan();
		
	
		apt.door(); //부모클래스 door() 메소드 호출
		dan.door(); //자식클래스 door() 오버라이딩한 메소드 호출
		
		Apt apt2 = new Dan(); //Apt(부모클래스) 타입으로 apt2 인스턴스를 만들고 Dan()(자식클래스) 형태로 객체화 시키면
		apt2.door();	//자식클래스의 오버라이딩한 메소드가 출력된다.
		
	}

}

오버로딩(Overloading*상속이랑은 무상관

같은 메소드 명을 가지고 있지만 매개변수 형태, 개수, 타입, 순서 등등에 따라 다르게 처리

class Over {
	void a() {
		System.out.println("1번 a메소드");
	}
	
	void a(int a, String b) {
		System.out.println("2번 a메소드: " + a +" : "+ b);
	}
	
	void a(String a, String b) {
		System.out.println("3번 a메소드: " + a+" : " + b);
	}
}

public class Overlode_01 {

	public static void main(String[] args) {
		
		Over over = new Over();
		
		//같은 메소드지만 오버로딩되어 각각 다른 내용과 매개변수 형태가 다르다
		over.a();				
		over.a(1, "2번");
		over.a("3번", "메소드");
	}

}