# 소스
import java.awt.*;
import javax.swing.*;
abstract class Figure extends JPanel{
abstract void area();
abstract void girth();
abstract void draw();
}
class Circle extends Figure{
private int radius;
public Circle(int radius) {
this.radius = radius;
}
public void area() {
System.out.println("원의 넓이는 : " + (3.14 * 3.14 * radius));
}
public void girth() {
System.out.println("원의 둘레는 : " + (2 * 3.14 * radius));
}
public void draw() {
System.out.println("반지름이 " + radius + "인 원을 그립니다.");
}
public void paintComponent(Graphics g) {
Font f = new Font("TimesRoman", Font.PLAIN, 15);
g.setFont(f);
g.drawString("<반지름이 " + radius + "인 원>", 15, 15);
g.drawString("원의 넓이는 : " + Double.toString(3.14 * 3.14 * radius), 15, 30);
g.drawString("원의 둘레는 : " + Double.toString(2 * 3.14 * radius), 15, 45);
g.drawOval(15, 60, radius, radius);
}
}
class Rect extends Figure{
private int width, height;
Rect(int width, int height){
this.width = width;
this.height = height;
}
public void area() {
System.out.println("사각형의 넓이는 : " + (width * height));
}
public void girth() {
System.out.println("사각형의 둘레는 : " + (2 * (width + height)));
}
public void draw() {
System.out.print("너비가 " + width + ", 높이가 " + height + "인 사각형을 그립니다.");
}
public void paintComponent(Graphics g) {
Font f = new Font("TimesRoman", Font.PLAIN, 15);
g.setFont(f);
g.drawString("<너비가 " + width + ", 높이가 " + height + "인 사각형>" , 15, 200);
g.drawString("사각형의 넓이는 : " + Double.toString(width * height), 15, 215);
g.drawString("사각형의 둘레는 : " + Double.toString(2 * (width + height)), 15, 230);
g.drawRect(15, 245, width, height);
}
}
public class ch6_10 {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(300, 400);
frame.setTitle("원과 사각형 그리기");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Circle c = new Circle(100);
frame.add(c);
frame.setVisible(true);
c.area();
c.girth();
c.draw();
Rect r = new Rect(100, 70);
frame.add(r);
frame.setVisible(true);
r.area();
r.girth();
r.draw();
}
}
# 프로그램 설명
1. 추상 클래스 Figure 정의한다.
- 넓이를 구하는 추상 메소드 void area()를 선언한다.
- 둘레를 구하는 추상 메소드 void girth()를 선언한다.
- 도형을 그리는 추상 메소드 void draw()를 선언한다.
- 3개의 추상 메소드(실질적인 구현을 갖지 않고 메소드 선언만 함)를 선언하고 이는 서브 클래스에서 추상 메소드를 구현한다.
- 이 클래스는 서브 클래스에서 paintComponent() 메소드를 재정의하기 위하여 JPanel 클래스를 상속받는다.
2. Circle 클래스를 정의한다.
- 이 클래스는 원에 대한 클래스로 추상 클래스 Figure를 상속 받는다.
- 반지름을 저장할 int형 변수 radius를 선언한다.
- Circle 클래스의 하나의 매개변수를 가지는 생성자 Circle(int radius)를 선언한다. 이 생성자는 radius 값을 입력받아 클래스 내의 radius 변수에 초기화한다.
- 넓이를 구하는 메소드 void area()를 선언한다. 이 메소드는 (3.14 * 3.14 * radius) 공식을 이용하여 원의 넓이를 구하여 주는 메소드이다.
- 둘레를 구하는 메소드 void girth()를 선언한다. 이 메소드는 (2 * 3.14 * radius) 공식을 이용하여 원의 둘레를 구하여 주는 메소드이다.
- 도형을 그리는 메소드 void draw()를 선언한다. 이 메소드는 반지름을 radius로 가지는 원을 그리는 메소드이다.
- 화면에 그림을 그리는 메소드 paintComponent()를 선언하여 원을 그린다. 도형을 그리기 위하여 그래픽 객체를 입력받는다. 이 메소드에서는 원의 둘레와 넓이를 화면에 텍스트로 그리고 원을 그리는 작업을 수행한다. 먼저 폰트를 지정하기 위해 java.awt 패캐지에서 제공하는 Font 클래스를 사용한다. Font 클래스의 객체를 생성한 후 폰트의 종류와 폰트의 스타일과 폰트의 크기를 설정한다. 이 프로그램에서는 각각 “TimesRoman”, Font.PLAIN, 15 로 설정하였다. 폰트 객체를 생성한 후 Graphics 클래스 안에 정의되어 있는 setFont() 메소드를 이용하여 실제로 폰트를 지정한다. 텍스트를 그리는 메소드인 draw.String()를 이용하여 원의 둘레와 넓이를 화면에 출력하고 원을 그리는 메소드인 drawlOval()를 이용하여 정사각형의 좌표 값을 주어 원을 그린다.
3. Rect 클래스를 정의한다.
- 이 클래스는 사각형에 대한 클래스로 추상 클래스 Figure를 상속 받는다.
- 너비와 높이를 저장할 int형 변수 width와 height를 선언한다.
- Rect 클래스의 두 개의 매개변수를 가지는 생성자 Rect(int width, int height)를 선언한다. 이 생성자는 width와 height 값을 입력받아 각각 클래스 내의 width와 height 변수에 초기화한다.
- 넓이를 구하는 메소드 void area()를 선언한다. 이 메소드는 (width * height) 공식을 이용하여 사각형의 넓이를 구하여 주는 메소드이다.
- 둘레를 구하는 메소드 void girth()를 선언한다. 이 메소드는 (2 * (width + height) ) 공식을 이용하여 사각형의 둘레를 구하여 주는 메소드이다.
- 도형을 그리는 메소드 void draw()를 선언한다. 이 메소드는 너비와 높이를 width와 height 로 가지는 사각형을 그리는 메소드이다.
- 화면에 그림을 그리는 메소드 paintComponent()를 선언하여 사각형을 그린다. 도형을 그리기 위하여 그래픽 객체를 입력받는다. 이 메소드에서는 사각형의 둘레와 넓이를 화면에 텍스트로 그리고 사각형을 그리는 작업을 수행한다. 먼저 폰트를 지정하기 위해 java.awt 패캐지에서 제공하는 Font 클래스를 사용한다. Font 클래스의 객체를 생성한 후 폰트의 종류와 폰트의 스타일과 폰트의 크기를 설정한다. 이 프로그램에서는 각각 “TimesRoman”, Font.PLAIN, 15 로 설정하였다. 폰트 객체를 생성한 후 Graphics 클래스 안에 정의되어 있는 setFont() 메소드를 이용하여 실제로 폰트를 지정한다. 텍스트를 그리는 메소드인 draw.String()를 이용하여 사각형의 둘레와 넓이를 화면에 출력하고 사각형을 그리는 메소드인 drawlRect()를 이용하여 시작점의 x, y 좌표와 너비와 높이에 대한 값을 지정하여 사각형을 그린다.
4. main() 문을 정의한다.
- 이 프로그램은 그래픽 기능을 위해 java.awt. 와 javax.swing. 패키지를 import한다.
- 하나의 프레임을 나타내기 위하여 JFrame 클래스의 객체 frame을 만들고 프레임의 크기를 너비를 300픽셀, 높이를 400픽셀로 설정한다. 프레임의 제목을 “원과 사각형 그리기”라고 지정한다. 디폴트 닫힘 연산을 지정한다. Circle 클래스의 객체 c를 선언하고 반지름을 100으로 초기화한다. 이는 컴포넌트 클래스의 객체를 생성한 것이다. 이 객체를 프레임에 추가한다. 이 후 프레임을 보이도록 하여 원을 화면에 출력한다.
- 콘솔 창에도 원의 넓이와 둘레, 그린다는 것을 알려주기 위하여 메소드 area(), girth(), draw()를 실행한다.
- 원과 같이 사각형 또한 Rect 클래스의 객체 r을 선언하고 너비를 100, 높이를 70으로 초기화한다. 이는 컴포넌트 클래스의 객체를 생성한 것으로 이 객체를 프레임에 추가한 후 프레임에 보이도록 하여 사각형을 화면에 출력한다.
- 콘솔 창에도 사각형의 넓이와 둘레, 그린다는 것을 알려주기 위하여 메소드 area(), girth(), draw()를 실행한다.
# 실행 결과
- 콘솔창과 프레임
=> 콘솔 창은 메소드 area(), girth(), draw()를 실행한 결과이고 오른 쪽은 컴포넌트 클래스의 객체(Circle의 c, Rect의 r)를 이용하여 프레임을 생성한 결과이다.