[java] 자바 상속의 목적과 메소드 오버라이딩(Overriding)에 대한 이해

java 상속
– 기존클래스에 새로운 변수와 메소드를 추가하여 새로운 클래스를 만드는 것
– extends 키워드를 사용
– super 키워드로 상위클래스 생성자를 호출
– private 멤버도 상속됨(직접접근불가)
상위클래스의 private 멤버는 메소드를 통한 간접접근만 허용한다.

class AA{	// 상속되어지는 상위클래스 
	
	private int num=0;		// private 변수는 상속되지 않는다.
	String name;
	
	AA(String name){
		this.name = name;
	}
	void setNum(int num){	// setNum 메소드를 하위클래스에서 호출하면 private 변수 num 으로 접근이 가능하다.
		this.num = num;
		System.out.println(this.num);
	}
}
class BB extends AA{	// extends 키워드로 AA 클래스를 상속
	
	int phoneNum;
	
	BB(String name, int phoneNum) {
		super(name);	// 상위클래스 생성자 호출
		this.phoneNum = phoneNum;
	}
}

 

– 상위클래스의 생성자는 어떤식으로든 반드시 호출됨
프로그래머가 정의하지 않으면 생성자 호출문이 자동으로 삽입된다.

class AA{	
	AA(){}
}

class BB extends AA{	
	BB(){ 
		super(); // 자동으로 삽입되는 상위클래스 생성자 호출문
	}	
}

 

– 상위클래스의 참조변수로 하위클래스의 인스턴스 참조가 가능

public class Test {

	public static void main(String[] args) {
		AA aa = new BB();   // 상위클래스 AA의 참조변수로 하위클래스 BB의 인스턴스를 참조
	}
}

class AA{}

class BB extends AA{}

 

메소드 오버라이딩(Overriding)
– 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술

– 상위클래스의 메소드를 하위클래스에서 다시 정의 하는것

public class Test {

	public static void main(String[] args) {
		AA aa1 = new AA();
		AA aa2 = new BB();
		aa1.overriding();	// AA 클래스 출력
		aa2.overriding();	// BB 클래스 출력
	}
}

class AA{
	void overriding(){
		System.out.println("AA 클래스");
	}
}

class BB extends AA{
	void overriding(){
		System.out.println("BB 클래스");
	}
}

 

상속의 목적
– 다형성(상위클래스의 참조변수로 하위클래스의 인스턴스를 참조)과 메소드 오버라이딩(동일한 방식의 메소드 호출 가능) 을 통해서 일련의 클래스에 대한 공통의 규약을 적

final 클래스와 final 메소드
– final 클래스는 상속을 허용하지 않는다.
– final 메소드는 오버라이딩을 허용하지 않는다.

final class AA{ // 상속 불가
	
	final void aa(){ // 오버라이딩 불가
		
	}
}

 

답글 남기기