-----------------------------------------------------------------------------------
1번째 예제
●결과값
public abstract class Shape {
private String name; //도형의 종류
public Shape(String name) {
this.name = name;
}
//# 어떤 도형을 그리는지 안내하는 문구, 인스턴스 메소드
private void showInfo() { //자식(외부)에서 부를 수 없음, 숨겨져 있기 때문
System.out.println();
System.out.println(name + "을 그립니다.");
}
//자식에서는 마음대로 불러 사용할 수 있되, 재정의(오버라이딩 불가)를 못하게 하기
// public final void showInfo() {
// System.out.println();
// System.out.println(name + "을 그립니다.");
// }
//# 그리기 작업 - 각 도형마다 알아서 그리도록 설정 , 추상메소드
public abstract void draw(); //{} 부분(body)가 없는 것을 추상 메소드, 미완성 메소드
public void printDraw() {
showInfo(); //prvate이라 같은 클래스에서는 자유롭게 호출하지만 외부에서 호출 못함
//그래서 자신의 클래스인 이곳에서 호출
draw(); //재정의(오버라이딩)한 자식의 draw() 메소드를 호출
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
public class Point extends Shape {
public Point(String name) {
super(name); //부모를 자식이 완성시켜 주기 위해
// 포인트 객체 생성할 때(new Point("점");
// 먼저 Shape 도형을 먼저 초기화시키고 난 후 자신인
//Point를 초기화 시킴
}
@Override
public void draw() {
//점만 하나 그리기
System.out.println(".");
System.out.println();
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
public abstract class Lines extends Shape{
//수평선과 수직선의 공통점 부모인 라인에 잡기
// 공통점은 선의 길이
private int lenght;
public Lines(String name, int length) { //name, length 는 자식들로부터 넘겨 받음
super(name);
this.lenght = length;
}
//선의 길이를 외부에서 부르려면
public int getLength() {
return lenght;
}
// @Override //자식인 Lines에서 완성하지 않고 그 자식인 수평선/수직선에서 완성하도록
// 하려고 함, 따라서 Lines도 부모의 추상 메소드를 가지게 됨으로
// 추상 클래스가 되어야 함
// 수평선과 수직선은 그리는 방식이 다르기 때문에 상속 받아 각자 완성하도록함
// public void draw() { }
//선의 길이가 0이면 길이가 없음, 선의 길이가 0보다 크면 그려주면 됨
// public void setLength(int length) {
// if(length >=0) {
// this.lenght = length;
// }else {
// System.out.println("길이는 0보다 큰 값을 입력해야 합니다.");
// this.lenght = 0;
// }
// }
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
public class HorizonLine extends Lines {
public HorizonLine(String name, int length) {
super(name, length);
}
@Override
public void draw() {
System.out.println("수평선의 길이 : " + getLength());
//선그리기
for(int i=1; i<=getLength(); i++) {
System.out.print("-"); // 수평선이라 줄바꿈 안함
}
System.out.println();
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
public class VerticalLine extends Lines{
public VerticalLine(String name, int length) {
super(name, length);
}
@Override
public void draw() {
System.out.println("수직선의 길이 : " + getLength());
//선그리기
for(int i=1; i<=getLength(); i++) {
System.out.println("|");
}
System.out.println();
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
public class Rectangle extends Shape{
private int width;
private int height;
public Rectangle(String name, int width, int height) {
super(name);
this.width = width;
this.height = height;
// setWidth(width);
}
// public void setWidth(int width) {
// if(width > 0) {
// this.width=width;
// }else {
// System.out.println("가로 길이는 0보다 커야 합니다");
// }
// }
@Override
public void draw() {
System.out.println("사각형의 가로 길이 : " + width);
System.out.println("사각형의 세로 길이 : " + height);
for(int i=1; i<=height; i++) {
for(int j=1; j<=width; j++) {
System.out.print("*");
}//안쪽 for 끝
System.out.println();
}//밖 for 끝
System.out.println();
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
public class ShapesMain {
public static void main(String[] args) {
//몇개의 도형을 그리고 싶은가?
// 선택한 도형 만큼 그리기
// 선택한 도형에 해당하는 객체 생성
//#1. Scanner 객체 생성
Scanner scan = new Scanner(System.in);
//#2. 지역 변수 - main()메소드 안에서 선언하니까
int num = 0; //그림을 그릴 도형의 개수
// Shape[] p = null; //입력받은 도형 객체를 저장할 배열
// 몇개의 도형을 그릴 것인지 묻고 그 도형 개수만큼 공간을 확보
// 각 도형의 객체를 생성해서 저장
//#3. 그릴 도형의 개수 입력 받기
System.out.print("그림을 그릴 도형의 개수 입력>>");
num = scan.nextInt();
//#4. 입력받은 개수 만큼의 도형을 저장할 공간 설정
Shape[] p = new Shape[num]; //자식-> 부모
// Point point = new Point();
for(int i=0; i<p.length; i++) {
//#4. 그리려는 도형을 선택하기
int selectType=0;
do {//조건의 참거짓과 관계없이 반드시 한 번은 실행
System.out.println("---------------------------------------");
System.out.println((i+1) + ")그리려는 도형 선택");
System.out.println("1.점 | 2.수평선 | 3.수직선 | 4.사각형");
System.out.println("---------------------------------------");
System.out.print("번호 선택>>");
selectType = scan.nextInt();
}while(selectType<1 || selectType>4); //유효성 검사
// !(selectType>=1 && selectType<=4)
//#1. 도형을 배열에 저장
switch(selectType) {
case 1 :
p[i] = new Point("점");
break;
case 2 :
case 3 :
System.out.print("선의 길이 입력>>");
int len = scan.nextInt();
//삼항연산자 사용해서 수평선, 수직선인지 구분
p[i]=(selectType ==2)? new HorizonLine("수평선", len) : new VerticalLine("수직선", len);
break;
case 4 :
System.out.println("사각형의 가로 길이 입력>>");
int width = scan.nextInt();
System.out.println("사각형의 세로 길이 입력>>");
int height = scan.nextInt();
p[i] = new Rectangle("사각형", width, height);
break;
}//end of switch
}//end of for
System.out.println();
System.out.println("===============================");
System.out.println();
//도형그리기
for(Shape s : p) {
s.printDraw();
}
scan.close(); //스캐너 리소스 닫기
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
★선생님작품.
'1. JAVA > 4). 자바_실전_이클립스' 카테고리의 다른 글
자바실전_Day_25_01(캘린더) (0) | 2024.02.02 |
---|---|
자바실전_Day_23_01(숫자찍기(별찍기)) (0) | 2024.01.31 |
자바실전_Day_19_01(추상메소드, 상속 - 제품출력하기) (0) | 2024.01.25 |
자바실전_Day_18_01(상속 - 자동차예제- 혼공자예제) (0) | 2024.01.24 |
자바실전_Day_17_01(클래스 - 학생정보출력 - 리팩토링) (2) | 2024.01.23 |