메모장

상속 본문

JAVA/개념정리

상속

Itchild 2024. 4. 6. 14:20
728x90
반응형

 

[ 상속 ]

 

코드 재사용성 증가

유지보수 용이

 

★★★★★

세상모든 자식클래스는 생성자의 첫줄에 super() 메서드를 호출함!

-> 생략되어있음

★★★★★

 

상속 중 에

해결방법 1)

부모 클래스에 기본생성자를 다시 생성

=> 쓰지 않는 방식 xxxxx

: ex ) "설계" --->> "한글코딩" --->> "코딩"

: ex ) 설계자체를 바꿔버리는 행동이기때문에, 활용 xxxxx

 

해결방법 2)

: 부모의 기본생성자 대신, 다른 생성자를 활용!

코드로 보기

출처 입력

package class01;

class A { // 기존에 있었던 클래스
	// 부모 클래스 , 상위 클래스
	// 클래스를 만들면 기본 생성자가 하나 제공 된다 .
	int a;

	A(int a) {
		this.a = a;
		System.out.println("A() 생성자 호출완료!");
	}

	void funcA() {
		System.out.println("a= " + this.a);
	}
}


// 부모클래스에서는 자식클래스의 내용에 접근 xxx
// 자식클래스 에서는 부모클래스의 멤버변수, 메서드에 접근이 O (가능)


class B extends A { // 기존에 존재했던 클래스를 보고 추가로 구현한 클래스
	// 자식 클래스, 하위 클래스
	int b;

	B(int b) { // 원래 원인은 생성자 탓 // 생성자가 없었기 때문에 클래스에 빨간줄이 그어졌던것
		// super() -> this()와 유사
        // this() : 자기자신 클래스의 생성자
		// super() : 자신의 부모클래스의 생성자를 의미
		
		super(); // 숨겨져있는 코드 // 원래는 super에게 있던 문제인데 없으니까
					// 생성자에 빨간줄, 생성자가 없으니까 클래스에 빨간줄이 생겼던것
		this.b = 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,funcB(), a, funcA() 
                         // 부모 클래스에 있던것을 포함하여 가질수 있다
		bbb.a=22; 
		bbb.b=20;
		
		//A와 B는 서로 다른 객체이기 때문에 서로에게 영향을 주지 않는다
		//bbb 에서만 22로 설정해놔서 aaa에 있는 a값은 변하지 않는다 
		aaa.funcA();
		bbb.funcB();
	}
}
 

 

[ 실습문제 ]

 

Shape 모양 클래스

String name 이름 ----> 멤버변수

double area 넓이

-----> 생성자가 들어갈 위치

 

void printArea() ----> 메서드

ㅁㅁ의 넓이는 ㅁㅁ.ㅁㅁ입니다.

 

Circle 원 클래스 --------> 자식 클래스로 설정

이름,넓이,반지름,PI ex) 반지름 * 반지름 * 3.14

 

Rect 사각형 클래스 -------> 자식 클래스로 설정

이름,넓이,가로(x),세로(y) ex) 가로,세로 길이 값을 받아서 둘을 곱해줄것이다.

package class02;

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 { // 멤버변수 4개 모두 초기화 하고 있는지 꼭 체크
	int radius;
	final static double PI = 3.14; // 3.14 라고 누구나 명시되는것

	Circle(int radius) {
		this("원", radius);
	}

	Circle(String name, int radius) { // 멤버변수를 초기화 하는 행위는 모두 생성자에서 진행
		super(name);
		this.radius = radius;
		this.area = this.radius * this.radius * Circle.PI;
		// area라는 넓이를 외부에서 반지름이란 값을 받아와서 계산 해줄수 있기때문에
		// 원과 모양은 상속관계 라서 this.area 로 가져올수 있다 !
	}
}

class Rect extends Shape {
	int x;
	int y;

	Rect(String name, int x, int y) {
		super(name);
		this.x = x;
		this.y = y;
		this.area = this.x * this.y;
		// area라는 넓이를 외부에서 x,y 란 값을 받아와서 계산 해줄수 있기때문에
		// 직사각형과 모양은 상속관계 라서 this.area 로 가져올수 있다 !
	}
}

public class Test03 {
	public static void main(String[] args) {

		Circle c1 = new Circle("원", 10);
		Circle c2 = new Circle(1);
		c1.printArea();
		c2.printArea();

		Rect rec = new Rect("네모네모", 5, 3);
		rec.printArea();
	}
}
 

오버 라이딩에 대해서도 알아보자 !

출처 입력

package class04;

class Shape {
	String name;
	double area;

	Shape(String name) {
		this.name = name;
		this.area = 0.0;
	}

	void print() {
		System.out.println(this.name + "은 넓이가 " + this.area);
	}
}

class Rect extends Shape {
	int x;
	int y;

	Rect(int x, int y) {
		super("네모"); // super라는 생성자가 숨어있다
		this.x = x;
		this.y = y;
		this.area = this.x * this.y;
	}
        // 오버 라이딩
	void print() { // 기존의 메서드가 출력되는게 아니라 자식의 수정된 메서드가 출력된다.
		// 재정의한 메서드가 // 재정의한 값으로 실행된다.
		System.out.println(this.name + "는 ");
		System.out.println("가로의 길이가" + this.x + ", ");
		System.out.println("세로의 길이가" + this.y + "입니다 ");
		System.out.println("넓이가" + this.area + "입니다 ");
	}
}

public class Test01 {

	public static void main(String[] args) {

		Rect r = new Rect(10, 20);

		r.print();
 // 오버 라이딩
// 기존에 부모가 갖고있던 기능을 다시 정의 하고 싶어지는것 "r.print()로 한번에 나오면 안돼 ?"
	}
}
 

 

728x90
반응형

'JAVA > 개념정리' 카테고리의 다른 글

(접근)제어자  (1) 2024.04.06
[상속] Object  (0) 2024.04.06
class 변수 , 공유자원  (0) 2024.04.06
객체 지향 언어 [JAVA]  (0) 2024.04.06
Flag 알고리즘  (0) 2024.04.06