다음 문법과 개념을 먼저 비교 이해하고 코드를 살펴보자.
main() 메소드가 있는 클래스 : 실행 클래스. 해당 패키지 내에서 프론트엔드에 해당하는 부분.
main() 메소드가 없는 클래스 : 함수 클래스. 해당 패키지 내에서 백엔드에 해당하는 부분.
public 클래스명() : 클래스명을 메소드 이름으로 갖는 메소드 -> 생성자(초기값 설정).
public void 메소드명() : return이 없는 메소드.
public int 메소드명() : return 타입이 int인 메소드.
클래스명 extends 클래스명 : 클래스명을 Super 클래스로 갖는 Sub 클래스
클래스명 : Super 클래스
클래스명 : Sub 클래스
1. 메인 클래스
public class CalcArea_executionClass {
public static void main(String[] args) {
// CalcArea a1 = new CalcArea();
// a1.printArea();
// Triangle t1 = new Triangle(23, 12); // t1을 만들고 그 방에는 width=23, height=12를 생성자로 넣었다.
// t1.printArea(); // t1 방에서 printArea()를 실행하라고 명령했다. main 메소드에서는 calcSize()는 명령하지 않았다. 이 부분에 주목해야한다.
// System.out.println("");
//
// Square s1 = new Square(23, 11);
// s1.printArea();
// System.out.println("");
//
// Round r1 = new Round(13);
// r1.printArea();
// System.out.println("");
// Sub 클래스는 Super 클래스로 변수 생성이 가능하다!!
// CalcArea t1 = new Triangle(23,12);
// t1.printArea();
// System.out.println("");
//
// CalcArea s1 = new Square(23, 11);
// s1.printArea();
// System.out.println("");
//
// CalcArea r1 = new Round(13);
// r1.printArea();
// System.out.println("");
// 따라서 Super 클래스의 이름으로 배열을 생성하면 Sub 클래스를 배열로 묶을 수 있다!! 다형성!!! 이렇게 배열로 묶으면 for문을 돌릴 수 있다.
CalcArea[] ca = new CalcArea[3];
ca[0] = new Triangle(23,12);
ca[0].printArea();
System.out.println("");
ca[1] = new Square(23, 11);
ca[1].printArea();
System.out.println("");
ca[2] = new Round(13);
ca[2].printArea();
System.out.println("");
}
}
방법 1.
2. Super 클래스
public class CalcArea { // 'CalcArea'클래스는 'Triangle', 'Square', 'Round'클래스의 Super class다.
// 방법 1.
String shape;
double area;
public void calcSize() { // 이 부분을 지우고 위에 double area = 0;으로 포맷해도 될 것 같지만, 왜 필요한지는 Sub 클래스인 Triangle 클래스를 보자.
this.area = 0;
}
public void printArea() {
this.calcSize(); // 0을 가져오라 해서 이상한 것 같지만, 왜 필요한지는 Sub 클래스인 Triangle 클래스를 보자.
System.out.println(this.shape); // 이걸 각각의 Triangle, Square, Round에 넣어도 되지만 이렇게 분리하면 얘 하나만 수정하면 3개가 동일하게 수정되기 때문에 유지보수가 쉽다는 장점을 가진다.
System.out.println("면적 : " + this.area); // calcSize()메소드는 물론 this.calcSize()가 없다면 this.area는 계산되지 않은 null 값을 가져오게된다.
}
}
3. Sub 클래스들
public class Triangle extends CalcArea { // 'Triangle'클래스는 'CalcArea'클래스의 Sub class다.
// 방법 1.
double width;
double height;
public Triangle(double width, double height) { // Triangle 클래스의 생성자.
this.shape = "삼각형";
this.width = width;
this.height = height;
this.area = this.width * this.height / 2;
}
public void calcSize() {
this.area = this.width * this.height / 2;
}
// (방법 1. 해설) 여기는 부모클래스에서 가져온 이녀석들이 있는거다. 이렇게 주석으로 오려다 붙여 넣고 보면 Sub 클래스를 이해하는데 도움이 된다.
// String shape;
// double area;
//
// public void printArea() {
// this.calcSize(); // t1.printArea()를 명령했는데 이 부분이 없으면 this.area는 calcSize()의 계산식을 수행하지 않는다.
// System.out.println(this.shape);
// System.out.println("면적 : " + this.area);
// }
}
public class Square extends CalcArea { // 'Square'클래스는 'CalcArea'클래스의 Sub class다.
// 방법 1.
double width;
double height;
public Square(double width, double height) { // Square 클래스의 생성자.
this.shape = "사각형";
this.width = width;
this.height = height;
}
public void calcSize() {
this.area = this.width * this.height;
}
}
public class Round extends CalcArea { // 'Round'클래스는 'CalcArea'클래스의 Sub class다.
// 방법 1.
double radius;
double pi = Math.PI;
public Round(double radius) { // Round 클래스의 생성자.
this.shape = "원";
this.radius = radius;
}
public void calcSize() {
this.area = this.radius * this.radius * this.pi;
}
}
방법 2. 만약 calcSize() 메소드를 없애고, printArea() 메소드에 this.calcSize()를 없애고 싶다면 이렇게 하면 된다.
2. Super 클래스
public class CalcArea { // 'CalcArea'클래스는 'Triangle', 'Square', 'Round'클래스의 Super class다.
// 방법 2. 만약 calcSize() 메소드를 없애고, printArea() 메소드에 this.calcSize()를 없애고 싶다면 이렇게 하면 된다.
String shape;
double area;
public void printArea() {
System.out.println(this.shape);
System.out.println("면적 : " + this.area);
}
}
3. Sub 클래스들
public class Triangle extends CalcArea { // 'Triangle'클래스는 'CalcArea'클래스의 Sub class다.
// 방법 2. 만약 calcSize() 메소드를 없애고, printArea() 메소드에 this.calcSize()를 없애고 싶다면 이렇게 하면 된다.
double width;
double height;
public Triangle(double width, double height) { // Triangle 클래스의 생성자.
this.shape = "삼각형";
this.width = width;
this.height = height;
this.area = this.width * this.height / 2;
}
}
public class Square extends CalcArea { // 'Square'클래스는 'CalcArea'클래스의 Sub class다.
// 방법 2. 만약 calcSize() 메소드를 없애고, printArea() 메소드에 this.calcSize()를 없애고 싶다면 이렇게 하면 된다.
double width;
double height;
public Square(double width, double height) { // Square 클래스의 생성자.
this.shape = "사각형";
this.width = width;
this.height = height;
this.area = this.width * this.height;
}
}
public class Round extends CalcArea { // 'Round'클래스는 'CalcArea'클래스의 Sub class다.
// 방법 2. 만약 calcSize() 메소드를 없애고, printArea() 메소드에 this.calcSize()를 없애고 싶다면 이렇게 하면 된다.
double radius;
double pi = Math.PI;
public Round(double radius) { // Round 클래스의 생성자.
this.shape = "원";
this.radius = radius;
this.area = this.radius * this.radius * this.pi;
}
}
(방법 1.)과 (방법 2.)의 차이를 비교해보고 (방법 1.)에서 calcSize() 메소드와 printArea() 메소드에서 this.calcSize()가 왜 필요한지에 주목하자. 우리는 main() 메소드에서 t1.printArea()라는 메소드만 실행했다는 것을 꼭 잊지 말자.
그리고 (방법 1.)이 (방법 2.)보다 유지보수가 쉽다는 장점을 이해하자. 그리고 이렇게 쓰는 장점 중 하나는 아래 문장을 확인하자.
Sub 클래스는 Super 클래스로변수 생성이 가능하다는 것을 기억하자. 따라서 서로 다른 Sub 클래스는 Super 클래스를 통해 같은 형태의 변수 선언이 가능하기 때문에 배열로 묶어 관리를 할 수 있고, for문 같은 것을 돌릴 수도 있다는 장점을 가진다. <상속의 다형성>
'개발자 > Java' 카테고리의 다른 글
Java (자바) 상속, 객체데이터를 이용한 문제 - 학생, 선생, 매점 직원 (0) | 2020.04.22 |
---|---|
Java (자바) 프로젝트 가져오기 (Import) (0) | 2020.04.21 |
Eclipse (이클립스) 자바 프로젝트, 클래스 생성 사라짐 (0) | 2020.04.16 |
Java (자바) 개발을 할 때 유념해야 할 것 (0) | 2020.04.16 |
Java (자바) 등수, 매트릭스 정렬, 객체데이터, 생성자 (0) | 2020.04.16 |