<Shape.java>- 추상클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package ex01.Abstract;
 
public abstract class Shape { //Super class = abstract class
    
    protected double result = 0//protected ->상속관계안에서는 다른 패키지여도 사용가능해짐
    public abstract double calc(double x); //abstract method
    public abstract void show(String name); //abstract method
    
    public void view() { //추상클래스 안에 일반 메소드생성도 가능
        System.out.println("Super class Shape");
    }
 
}
 
cs

 

▶abstract method는 abstract class 안에서만 선언가능

▶접근지정자 protected는 상속관계안에서는 다른 패키지여도 사용가능함

▶abstract class안에는 일반 메소드생성 가능 


<Circle.java>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package ex01.Abstract;
 
public class Circle extends Shape { //Sub class
 
    @Override
    public double calc(double x) {
        result = x * x *Math.PI; //result는 super class에 있는 변수
        return result;
    }
 
    @Override
    public void show(String name) {
        calc(5.5);
        System.out.println(result + "반지름의 " + name + "이 그려졌습니다.");
    }
 
}
 
cs

 

▶sub class안에서는 super class안의 변수를 바로 가져다 사용 가능


<Triangle.java>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package ex01.Abstract;
 
public class Triangle extends Shape {
    
    int w = 100;
    
    @Override
    public double calc(double x) {
        result = x * w / 2
        return result;
    }
 
    @Override
    public void show(String name) {
        calc(9.0);
        System.out.println(result + "크기의 " + name + " 그려졌습니다.");
 
    }
 
}
 
cs

<Rectangle.java>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package ex01.Abstract;
 
public class Rectangle extends Shape {
    
    int h=10;
 
    @Override
    public double calc(double x) {
        result = x * h;
        return result;
    }
 
    @Override
    public void show(String name) {
        calc(8.8);
        System.out.println(result + "크기의 " + name + " 그려졌습니다.");
        
    }
 
}
 
cs

<MaintEntry.java>

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package ex01.Abstract;
public class MainEntry {
    public static void main(String[] args) {
        
        
        System.out.println("<<<배열 이용해서 객체 생성>>>");
        //방법3)배열 이용한 형태 
        Shape[] sh = new Shape[3]; //배열 선언 및 생성, Shape타입(부모클래스)로 배열 생성!!!
        //cf)Shape ss = new Shape(); -> 객체 생성(but,추상클래스는 자체적으로 객체 생성할 수 없다)
        sh[0= new Circle(); //부모클래스를 이용해서 객체생성한 것!
        sh[1= new Rectangle();
        sh[2= new Triangle();
        
        String[] name = {"Circle""Rect""Triangle"};
        for(int i =0; i<sh.length; i++) {
            sh[i].show(name[i]);
        }
        
        
 
        System.out.println("\n\n<<<부모 추상클래스를 이용해서 객체 생성>>>");
        //방법2)Shape 부모 추상 클래스를 이용해서 객체 생성
        Shape s = new Circle();
        s.show("Circle");
        
        s = new Rectangle();
        s.show("Rectangle");
        
        s = new Triangle();
        s.show("Triangle");
 
        
        
        System.out.println("\n\n<<<각자의 클래스로 객체 생성>>>");
        //방법1)각자의 클래스로 객체 생성 
        Circle c = new Circle();
        c.show("원");
        
        Rectangle r = new Rectangle();
        r.show("사각형");
        
        Triangle t = new Triangle();
        t.show("삼각형");
    
        
    }
 
}
 
cs

<<<배열 이용해서 객체 생성>>>
95.03317777109125반지름의 Circle이 그려졌습니다.
88.0크기의 Rect 그려졌습니다.
450.0크기의 Triangle 그려졌습니다.


<<<부모 추상클래스를 이용해서 객체 생성>>>
95.03317777109125반지름의 Circle이 그려졌습니다.
88.0크기의 Rectangle 그려졌습니다.
450.0크기의 Triangle 그려졌습니다.


<<<각자의 클래스로 객체 생성>>>
95.03317777109125반지름의 원이 그려졌습니다.
88.0크기의 사각형 그려졌습니다.
450.0크기의 삼각형 그려졌습니다.


<객체 생성 방법 3가지>

1.각자의 클래스로 객체 생성

  Circle c = new Circle();

 

2.부모 추상 클래스를 이용해서 객체 생성 

   Shape s = new Circle();

 

3.배열을 활용한 객체 생성

  1)배열 선언 및 생성 - 부모클래스 타입으로 배열 생성

     Shape[] sh = new Shape[3]; 

     cf)Shape sh = new Shape(); -> 추상클래스는 자체적으로 객체 생성 X

  2)선언한 배열에 각 sub class 객체생성해서 넣는다 

     sh[0] = new Circle(); 
     sh[1] = new Rectangle();
     sh[2] = new Triangle();

     =>부모 클래스를 이용해서 객체 생성한 것 

<Shape.java>

1
2
3
4
5
6
7
8
9
10
11
12
13
package ex04.Abstract2;
 
public abstract class Shape { //abstract class, Super class
    double result = 0;
 
    public abstract double calc(); // =>추상메소드
    public abstract void draw();
 
    public void show() { // =>일반메소드 (추상 클래스 안에는 일반메소드도 가질 수 있다)
        System.out.println("Super class Shape");
    }
}
 
cs

<Circle.java>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package ex04.Abstract2;
 
public class Circle extends Shape { //Sub class
 
    double r = 5.0;
 
    @Override
    public double calc() {
        // TODO Auto-generated method stub
        result = r * r * Math.PI;
        return result;
    }
 
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        calc();
        System.out.println("원의 넓이: " + result + "인 원을 그렸습니다");
    }
 
}
 
cs

<Rectangle.java>

 

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
package ex04.Abstract2;
 
import java.util.Scanner;
 
public class Rectangle extends Shape {
 
    @Override
    public double calc() {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.print("사각형의 가로길이 입력 => ");
        int w = sc.nextInt();
        System.out.print("사각형의 세로길이 입력 => ");
        int h = sc.nextInt();
 
        result = w * h;
        return result;
    }
 
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        calc();
        System.out.println("사각형의 넓이: " + result + "인 사각형을 그렸습니다");
    }
 
}
 
cs

<Triangle.java>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package ex04.Abstract2;
 
public class Triangle extends Shape {
 
    int w = 10, h = 20;
 
    @Override
    public double calc() {
        // TODO Auto-generated method stub
        result = (w * h) / 2;
        return result;
    }
 
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        calc();
        System.out.println("삼각형의 넓이: " + result + "인 삼각형을 그렸습니다");
    }
 
}
 
cs

<MainEntry.java>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package ex04.Abstract2;
//<<<<<<<<<<2.이클립스 기반으로 작성>>>>>>>>>>
import java.util.Scanner;
 
public class MainEntry {
    public static void main(String[] args) {
//        Shape t;
        
        Scanner sc = new Scanner(System.in);
        System.out.println("<원하는 도형을 선택 하세요>\n 1.circle \t2.triangle \t3.rectangle");
    
        //자식클래스 객체를 생성해서 이를 이용하여 부모클래스에있는 메소드도 부를수 있다(c.show()도 가능)
        switch(sc.nextInt()) {
        case 1 :  Circle c = new Circle();  c.draw();  break
        case 2 :  Triangle t = new Triangle();  t.draw();  break;
        case 3 :  Rectangle r = new Rectangle();   r.draw();  break;
        }
    }
 
}
 
cs

<원하는 도형을 선택 하세요>
 1.circle  2.triangle  3.rectangle
1
원의 넓이: 78.53981633974483인 원을 그렸습니다


▶자식클래스 객체를 생성해서 이를 이용하여 부모클래스에있는 메소드도 부를수 있다(c.show()도 가능)

▶하지만, 반대로 부모클래스에서는 자식클래스에있는 메소드를 불러올 수 없다

하나의 class안에 여러 class가 있을 경우 public은 파일이름과 동일한 class앞에만 붙여야 한다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package ex03.Abstract1;
//<<<<<<<<<<<<<<1.코딩레벨로 작성>>>>>>>>>>>>>>
import java.util.Scanner;
 
/*
 =======abstract class(추상 클래스)=======
 -미완성 클래스 <---자체적으로 객체 생성 할 수 없다
  (단, 상속받은 자손 클래스로는 객체 생성 가능)
 -추상메소드를 갖고 있다
  public void disp() {  } ->일반메소드
  public void disp(); ->추상메소드: 몸체(블럭)를 갖지 않는다
  public abstract void disp();
 */
 
abstract class Shape { //=>추상클래스, Super class
    double result = 0;
    
    public abstract double calc(); //=>추상메소드
    public abstract void draw(); 
     
    public void show() { //=>일반메소드 (추상 클래스 안에는 일반메소드도 가질 수 있다)
        System.out.println("Super class Shape");
    }
//Shape end 
 
class Circle extends Shape { //Sub class 
    double r = 5.0;
 
    @Override
    public double calc() {
        // TODO Auto-generated method stub
        result = r * r * Math.PI;
        return result;
    }
 
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        calc();
        System.out.println("원의 넓이: " + result + "인 원을 그렸습니다");
    } 
    
//Circle end
 
class Triangle extends Shape { //Sub class 
    int w = 10, h = 20;
 
    @Override
    public double calc() {
        // TODO Auto-generated method stub
        result = (w * h) / 2;
        return result;
    }
 
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        calc();
        System.out.println("삼각형의 넓이: " + result + "인 삼각형을 그렸습니다");
    }
    
}//Triangle end
 
class Rectangle extends Shape { //Sub class 
 
    @Override
    public double calc() {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.print("사각형의 가로길이 입력 => ");
        int w = sc.nextInt();
        System.out.print("사각형의 세로길이 입력 => ");
        int h = sc.nextInt();
        
        result = w * h;
        return result;
    }
 
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        calc();
        System.out.println("사각형의 넓이: " + result + "인 사각형을 그렸습니다");
    }
    
}//Rectangle end
 
 
public class MainEntry {
    public static void main(String[] args) {
        //1))객체 호출 방법 1
//        Circle c = new Circle();
//        c.calc();
//        c.draw();
        
//        Shape t = new Triangle();
//        t.calc();
//        t.draw();
        
//        Rectangle r = new Rectangle();
//        r.draw();
        
        
        //2)객체 호출 방법2 
        Shape t; //한번의 호출로 여러번 사용가능
        
        Scanner sc = new Scanner(System.in);
        System.out.println("<원하는 도형을 선택 하세요>\n 1.circle \t2.triangle \t3.rectangle");
        
        switch(sc.nextInt()) {
        case 1 :  t = new Circle();  t.draw();  break;
        case 2 :  t = new Triangle();  t.draw();  break;
        case 3 :  t = new Rectangle();   t.draw();  break;
        }
    
//        Shape t = new Circle();
//        t.draw();
//        
//        t = new Triangle();
//        t.draw();
//        
//        t = new Rectangle(); 
//        t.draw();
        
 
        
    
        
        /*
        //미완성 클래스 <--- 자체적으로 객체 생성할 수 없다
        //Shape s = new Shape(); -> 오류 
        
        Circle c = new Circle();
        
        //상속받은 자손 클래스로는 객체 생성 가능
        Shape sh = new Circle();
        */
    }
 
}
 
cs

<원하는 도형을 선택 하세요>
 1.circle  2.triangle  3.rectangle
1
원의 넓이: 78.53981633974483인 원을 그렸습니다


▶abstract class(추상 클래스)

   -미완성 클래스 -> 자체적으로 객체 생성할 수 없다

    (단, 상속받은 자손 클래스로는 객체 생성 가능)

   -추상메소드를 갖고 있다

    일반 메소드) public void disp() {  }

    추상 메소드) public void disp(); -> 몸체(블럭)를 갖지 않는다

                     public abstract void disp();

   


▶객체 호출 방법 2가지

  Circle c = new Circle();
  c.calc();
  c.draw();

  Shape t = new Triangle();  -> 상속받은 자손 클래스로는 객체 생성 가능
  t.calc();
  t.draw();


 Shape t = new Circle(); -> 한번의 호출로 여러번 사용가능
 t.draw();
 
 t = new Triangle();
 t.draw();

 

+ Recent posts