다음 문법과 개념을 먼저 비교 이해하고 코드를 살펴보자.

 

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문 같은 것을 돌릴 수도 있다는 장점을 가진다. <상속의 다형성>

+ Recent posts