Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스프링
- AOP
- MVC
- jointpoint
- produces
- PointCut
- .xml
- gradle
- frontController
- springjdbc
- Model
- 바인딩변수
- springmvc
- @
- @RequestMapping
- @Valid
- application.properties
- SpringBoot
- 생성자주입
- 어노테이션
- 유효성검사
- @ResponseBody
- @RequestParam
- c:if
- Java
- 서비스레이어
- after-throwing
- 비즈니스레이어
- spring
- 의존주입
Archives
- Today
- Total
메모장
상속 본문
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 |