본문 바로가기

Programming Language/JAVA

[JAVA] 상속( inheritance )

 

 

상속 (inheritance)
: 자식 클래스가 부모클래스를 물려받아 확장하는 의미로써, 상속을 이용하면 중복이 제거되고 간결한 구조를 가질수있습니다.

 

 


상속을 통해서 할 수 있는 일
- 기존의 클래스에 다른 기능을 추가할 수 있다.
- 클래스의 데이터에 다른 것을 추가할 수 있다.
- 클래스의 함수가 동작하는 방식을 변경할 수 있다.
- 위의 작업들은 코드를 복사하여 진행할 수도 있지만, 상속을 통해서 간결하게 처리할 수 있다.
- Extends를 사용하여 상속을 받는다.

상속 선언
- extends 키워드로 선언한다.

- 부모 클래스는 슈퍼 클래스(super class)라고도 불린다.
- 자식 클래스는 서브 클래스(sub class)라고도 불린다.

 

 

 

class SuperClass {
	public SuperClass() {
		System.out.println("SuperClass 생성자 호출");
	}
}
class SubClass extends SuperClass{
	public SubClass() {
		System.out.println("SubClass 생성자 호출");
	}
}
public class Test{
	public static void main(String[] args) {
		SubClass sub = new SubClass();
		}
	}

* 부모클래스(superClass) / 자식클래스(subClass)로 상속 실습해보겠습니다.
우선, 부모클래스에서 생성자를 선언해줍니다.
자식클래스에서는 자식클래스 생성시, extends 키워드를 사용해주고 그뒤에 상속할 부모클래스를 적어줍니다.
자식클래스 또한 생성자를 선언해줍니다.
Main메소드가 있는 Test클래스에서 자식클래스만 생성하게되면 실행결과가 부모클래스생성자호출이 되고,
자식클래스 생성자가 호출되는것을 확인할수있습니다.
이러한 결과에는 extends키워드를 적어서 상속받았기에 자식클래스의 객체를 생성해도 부모클래스도 자동으로 생성되는 결과를 볼 수 있습니다.

 

 

 

 

 

class SuperClass{
	public SuperClass(String n) {
		System.out.println(n+"SuperClass 생성자 호출");
	}
}
class SubClass extends SuperClass{
	public SubClass() { 
		super("부모");  
		System.out.println("SubClass 생성자 호출");
	}
}
public class Test {
	public static void main(String[] args) {
		SubClass com = new SubClass();
	}

}

이번에는 super키워드를 사용해보겠습니다.
부모클래스인 SuperClass와 자식클래스인 SubClass 그리고, Main메소드가 있는 Test클래스를 만들어주었습니다.
우선, 부모클래스에서 매개변수로 String타입의 n변수를 받아 부모클래스 생성자가 생성될때, "매개변수로받은 값+SuperClass 생성자 호출"문구가 출력되게 선언했습니다.
자식클래스에서는 extends키워드로 부모클래스를 적어주고, 자식클래스 생성자 선언에는 super키워드를 사용했습니다.
이때 super키워드를 사용하면 이전 줄에서 extends키워드를 통해 부모클래스(SuperClass)를 상속받았기에 부모클래스가 호출됩니다. 즉, super키워드=부모클래스(SuperClass) 생성자 똑같습니다.
매개변수로 "부모"를 넘겨주고, 생성자를 호출했기에 "부모SuperClass 생성자 호출"이라는 문구가 먼저 출력되고나서 자식클래스 문구가 출력되게 선언해주었습니다. Test클래스에서 자식클래스의 객체 생성하면 부모클래스 생성자와 자식클래스 생성자가 출력되는걸 확인할 수 있습니다.

 

 

 

 

 

 

class Super{
	protected int num;
	protected int num1;
	public Super() {
		num = 100;
		num1 = 500;
	}
}
class child extends Super{
	private int su;
	private int su1;
	public child() {
		su=10;
		su1 = 20;
	}
	public void disply() {
		System.out.println("num:"+num+ " num1:"+super.num1);
		System.out.println("su: " + su+" su1 : "+su1);
	}
}
public class Test {

	public static void main(String[] args) {
		child ch = new child();
		ch.disply();
	}

}

이번에는 Super클래스를 상속받은 child클래스의 소스를 보겠습니다. ( 접근제한자 )

Super클래스에서 num과 num1변수를 protected 접근제한자로 접근이 가능하게 했고, Super클래스 생성자 변수에 값을 저장했습니다. 이번에는 자식클래스(child)에서 extends 키워드를 사용해서 Super클래스를 상속받고 변수 선언시 private로 접근제한을 했습니다. 생성자 생성시, 각변수에 값을 저장했고, display()메소드안에는 부모클래스에서의 num과 num1 각변수들을 메시지호출해주었습니다. 위소스와 같이 그냥 자식클래스에서 num변수가 없기때문에 num을 사용해도 부모클래스의 값이 출력되고, 만약에 자식클래스에서 num1이라변수가 있다면 자식과 부모에서 변수명이 겹치기때문에 앞에 super.이라는 키워드를 사용해야 부모클래스의 변수라는 것으로 구분지어준다. 그리고 자식클래스의 변수들을 출력해주고, Main메소드가있는 Test클래스에서 자식클래스를 생성해주면 메시지가 출력된다.

 

 

 

 

 

 

class Parents3{
	public int sum(int n1,int n2) {
		return n1+n2;
	}
	public int sub(int n1, int n2) {
		return n1-n2;
	}
}
class Child3 extends Parents3{
	private int num1, num2;
	public Child3(int num1, int num2)	{
		this.num1 = num1;
		this.num2 = num2;
	}
	public void disply() {
		System.out.println("두수의 합 : "+sum(num1,num2));
	}
}
public class Test {

	public static void main(String[] args) {
		Child3 ob = new Child3(100,200);
		ob.disply();
	}

}

부모클래스(Parents3)에서 메소드를 sum()과 sub()을 선언해줍니다.
자식클래스에서는 부모클래스를 extends해서 상속받고 num1,num2변수를 private접근제한자로 제한합니다.
생성자 선언할때 매개변수로 받은 num1,num2의 값을 Child3클래스의 변수에 저장합니다. (this 포인터 사용)
disply()메소드에서 저장된 num1,num2의 값을 매개변수로 부모클래스의 sum메소드로 넘겨주고 합산한 값을 리턴받아
출력해줍니다.
Main메소드가 있는 Test클래스에서 자식클래스 생성자를 생성해서 자식클래스의 num1과num2의 변수를 각각
값을 저장해주고, disply메소드를 호출해서 부모클래스의 sum메소드를 리턴받은 값을 출력해줍니다.