프로그래밍

[자바 기초] day09 : 클래스 상속 본문

자바/자바 기초

[자바 기초] day09 : 클래스 상속

시케 2023. 5. 16. 17:45
728x90
반응형

2023.05.15.월

클래스 상속

부모 클래스는 자식 클래스에게 상속을 해줄 수 있다

자식 클래스는 부모 클래스를 선택해서, 그 부모의 멤버를 상속받아 그대로 쓸 수 있게 된다

 

 

선언 방식

package class01;

class A{ //기존 클래스, 상위 클래스, 부모 클래스
	int a;
	
	A(){
		System.out.println("A() 생성자 생성완료");
	}
	
	void funcA() {
		System.out.println("a= "+this.a);
	}
}
// 부모 클래스에서는 자식 클래스의 내용에 접근할 수 없다
// 기존에 존재했던 클래스를 보고 추가로 구현
class B extends A{ //자식
	int b;
    
	B(){
		System.out.println("B() 생성자 생성완료");
	}
	void funcB() {
		System.out.println("b= "+this.b);
	}
}
public class Test01 {

	public static void main(String[] args) {
		A aaa = new A(); // 객체화(인스턴스화)
		aaa.a = 10; 	// aaa-> a, funcA()
		
		B bbb = new B(); // 객체화(인스턴스화)
		bbb.b = 20; 	// bbb-> a, b, funcA(), funcB()
		
		bbb.funcA(); 	//bbb의 a는 초기화 안해서 0
		bbb.funcB();
	}

}

출력 결과

A() 생성자 생성완료

A() 생성자 생성완료

B() 생성자 생성완료

a= 0

b= 20

 

super()

class B extends A{
	int b;
	
	B(){
		super(1234);
		this.b = b;
	}
	void funcB() {
		System.out.println("b= "+this.b);
	}
}

위 코드에서 super()을 사용하지 않으면 오류가 나는 것을 알 수 있다

클래스에서 오류가 나다가 생성자를 생성하면 생성자로 super를 선언하면 super로 옮겨가는 것을 알 수 있는데

이는 해당 오류가 클래스 단위의 오류가 아닌 super()의 부재 때문임을 알 수 있다

 

모든 상속을 받은 클래스 생성자에는  super()가 생략되어 있는데

기본 생성자만 사용할때는 오류가 나지 않다가 다른 생성자를 생성하면서 오류가 발생하는 것이다

 

세상 모든 자식 클래스는 생성자의 첫줄에 super()를 호출해야 한다

 

이것의 해결방법은 총 2가지가 있다

 

해결1) 기본 생성자를 직접 만든다
이 방식은 실제론 많이 사용되지 않는 방식이다

상속 받는 자식 이상하다고 부모 고친다는 것은 설계를 거스르는 행위이다
이는 설계를 잘못했을 가능성을 시사한다

해결2) 다른 생성자 활용

부모의 기본 생성자가 없기에 발생한 문제이기 때문에 다른 생성자를 활용하여 해결한다

 

상속 예제)

package class02;
// 상속 도형 예제
// Shape 모양 클래스
// 		String name 이름
//  	double area 넓이
//	void printArea()
//		ㅁㅁ의 넓이는 ㅁㅁ.ㅁㅁ입니다.
// Circle 원 클래스
//		이름,넓이,반지름,PI
// Rect 사각형 클래스
// 		이름,넓이,가로(x),세로(y)
class Shape{ 
	String name;
	double area;
	
	Shape(String name){
		this(name, 0.0);
	}
	
	Shape(String name, double area){
		this.name = name;
		this.area = area;
	}
	
	void printArea() {
		System.out.println(this.name+"의 넓이는 "+this.area+"입니다");
	}
	
}

class Circle extends Shape{
	int r;
	final static double PI = 3.14;
	
	Circle(int r){
		this("원", r);
	}
	
	Circle(String name, int r){
		super(name);
		this.r =r;
		this.area = this.r*this.r*Circle.PI;	
	}
	
}

class Rect extends Shape{
	int x;
	int y;
	
	Rect(int x, int y){
		this("사각형", x, y);
	}
	
	Rect(String name, int x, int y){
		super(name);
		this.x = x;
		this.y = y;
		this.area = this.x*this.y;
	}
}

public class Test03 {

	public static void main(String[] args) {
		
		Circle c1 = new Circle(1);
		Rect rect1 = new Rect("정사각형",4, 4);
		
		c1.printArea();
		rect1.printArea();
		
		System.out.println(c1.name+"의 반지름: "+c1.r);
		System.out.println(rect1.name+"의 가로: "+rect1.x);
		System.out.println(rect1.name+"의 세로: "+rect1.y);

	}

}

 

728x90
반응형
Comments