본문 바로가기
JAVA

[상속] 상속과 Overriding

by amoomar 2022. 1. 1.
반응형

 

 

이번 포스팅에서는 클래스 상속과 재정의, 그에 대한 예제들을 확인해볼 수 있다.

 

 


 

1. 상속

 

1) 상속의 개념

: 기존에 사용중인 클래스의 필드들을 새로 만든 클래스에 가져와서 자신의 것 처럼 사용할 수 있는 개념이다.

다중상속은 불가능하므로, 한 개의 클래스에서만 상속 받을 수 있다.

 

 

2) 선언 방법

class A{
	A필드
}
class B extends A{
	A필드, B필드
}

class A : 부모클래스, 상위클래스, 슈퍼클래스, 기반클래스

class B : 자식클래스, 하위클래스, 서브블래스, 파생클래스

main{
	B b = new B();
    b.A클래스와 B클래스의 필드를 모두 사용 할 수 있다.
    	부모		자식
}

 

 

 


 

 

2. Overriding : 재정의, 무시하기, 덮어쓰기

 

 1) super와 super( )

super 키워드는 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수입니다.
 
인스턴스 변수의 이름과 지역 변수의 이름이 같을 경우 인스턴스 변수 앞에 this 키워드를 사용하여 구분할 수 있었습니다.
이와 마찬가지로 부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우 super 키워드를 사용하여 구별할 수 있습니다.
 
이렇게 자바에서는 super 참조 변수를 사용하여 부모 클래스의 멤버에 접근할 수 있습니다.
this와 마찬가지로 super 참조 변수를 사용할 수 있는 대상도 인스턴스 메소드뿐이며, 클래스 메소드에서는 사용할 수 없습니다.

<출처 : http://www.tcpschool.com/java/java_inheritance_super>

 

 

//부모클래스
class Human{
String name;
	int age;

	Human(String name, int age){
		this.name = name;
    		this.age = age;
	}
}
//자식클래스
class Student extends Human{
	int score;

	Student(String name, int age, int score){ //부모생성자input + 자식생성자input
		super(name, age); //부모생성자input
    		this.score = score;
	}
}

*생성자 선언 단축키 : alt + shift + S + O*

 

 


 

2) 다형성

: 자식클래스에 부모클래스와 동일한 이름의 메서드가 존재한다면, 선택된 객체에 따라 메서드가 다르게 출력된다.(overloading)/ 따라서 동일한 이름의 메서드이지만 다른 내용을 삽입하게 되면(overriding) 각 객체에 맞게 삽입된 내용으로 출력된다.(overloading)

 

 


 

 

3. 예제

 

: book클래스를 상속받는 만화클래스, 전공서적클래스를 각각 생성하고 void info()를 통해 각각의 정보를 출력할것.

book클래스 : 책제목, 저자, 가격, 카테고리 / 만화클래스 : +줄거리 / 전공서적클래스 : +과목

 

package class01;

class Book{
	//멤버변수
	String name;
	String writer;
	String category;
	int price;
	//생성자
	Book(String name, String writer, int price){
		this.name = name;
		this.writer = writer;
		this.price = price;
		this.category = "[ ]";
	}
	void info() {
		System.out.println("책제목: " + name + "\n작가: "+ writer+ "\n가격: " + price + "\n카테고리: " + category);
	}
}
//전공서적 클래스
class Major extends Book{
	String major;
	
	Major(String name, String writer, int price, String major){
		super(name, writer, price);
		this.category = "전공";
		this.major = major;
	}
	void info() {//메서드 재정의 : overriding
		System.out.println("\n책제목: " + name + "\n작가: "+ writer+ "\n가격: " + price + "\n카테고리: " + category + "\n과목: " + major);
	}
}
//만화 클래스
class Cartoon extends Book{
	String story;
	
	Cartoon(String name, String writer, int price, String story){
		super(name, writer, price);
		this.category = "만화";
		this.story = story;
	}
	void info() {//메서드 재정의 : overriding
		System.out.println("\n책제목: " + name + "\n작가: "+ writer+ "\n가격: " + price + "\n카테고리: " + category + "\n줄거리: "+story);
	}
}
public class Test06 {
	public static void main(String[] args) {
		Major m1 = new Major("기초수학", "남혜원", 16000, "수학");
		Major m2 = new Major("수학 맛있게 익힌 책", "남예원", 16500, "수학");
		Cartoon c = new Cartoon("남극에서 살아남기", "김땡땡", 12000, "남극에 표류된 주인공이 어떻게든 살아남는 내용,,");
		
		m1.info();
		m2.info();
		c.info();
	}
}

반응형