The Debugging Chronicles : "코드의 미학"
예제로 알아보는 클래스03 본문
클래스의 상속
과
오버로딩
[요구사항대로 문제해결하기]
모양 Shape class
String name 이름
double area 넓이
String color 색
void draw()
ㅁㅁ색 ㅁㅁ모양은 ㅁㅁ.ㅁㅁ만큼의 넓이
원 Circle class
int radius 반지름
double PI 3.14 원주율
사각형 Rectangle class
int x,y 가로,세로
요구사항
1. 이름이 없는 모양 객체는 없음
2. 어떤 모양의 색을 별도로 지정하지않으면 기본 색은 검정
3. 원의 경우, 반지름을 별도로 지정하지않으면 기본 1
4. new 사각형(10) == 정사각형 5. new 사각형(10,20) == 직사각형
1. 모양 shape class
>>나의 코드
class Shape{
String name;
double area;
String color;
Shape(String name){ //이름이 없는 모양 객체는 없음
//어떤 모양의 색을 별도로 지정하지 않으면 기본색은 검정 -> 모양 0 ,색x / 모양x 색 '검정' / 모양 0 색 지정 / 모양 0 색 "검정"
this(name,"검정");
}
Shape(String name ,String color){
this.name= name;
this.area = 10.0;
this.color = color;
}
//void draw (){
// bb색 aaa모양은 ㅁㅁㅁ.ㅁㅁ만큼의 넓이
void draw () {
System.out.println(this.color+"색 "+this.name+"모양은 "+this.area+"만큼의 넓이");
}
}
2. 원 Circle class
>>나의 코드
class Circle extends Shape {
int radius;
static double PI = 3.14;
Circle(String name){
super(name);
}
Circle(String name,String color) {
this(name,color,1);
}
Circle(String name, String color, int radius) {
super(name,color);
this.area = 2 * Circle.PI * this.radius;
}
}
>> 놓친 부분
super( )와 this( )에 대한 사용에 대한 이해가 부족했다.
먼저 가장 오버롸이딩 되는 생성자함수를 염두하고 각기 다른 조건의 생성자 함수를 만들어야했다.
그리고 부모 클래스에서 정해 놓은 조건을 자식 클래스 중에서 가장 인자 조건이 많은 생성자 함수안에서 받을 값들을 super로 확정을 먼저 시켜야 했다. 오버롸이딩 되는 생성자 함수들에서 this() 함수를 각기 다른 조건으로 인자 값들을 받도록 해야해다.
그리고 상수화 final개념 잊지 말기
3.사각형 Rectangle class
>>나의 코드
class Rectangle extends Shape{
int x;
int y;
Rectangle(int x){
this( x , x, "검은색");
}
Rectangle(int x,String color){
this( x , x, color);
}
Rectangle(int x, int y) {
this(x,y,"검은색");
}
Rectangle(int x, int y,String color) {
super("직사각형",color);
this.x = x;
this.y =y;
this.area = this.x * this.y;
}
}
>>놓친 부분
생성자 함수들을 조건에 맞게 잘 나누었는데 정사각형을 어떻게 표시 할 수 있는 지 좀 더 고민할 필요가 있었다.
풀이
package class05;
class Shape {
String name;
double area;
String color;
Shape(String name) {
this(name,"검정");
}
Shape(String name,String color) {
this.name=name;
this.color=color;
this.area=0.0;
}
void draw() {
System.out.println(this.color+"색 "+this.name+"모양 넓이 : "+this.area);
}
void setArea() {
System.out.println("Shape에서 호출한 setArea()");
}
}
class Circle extends Shape {
int radius;
static final double PI=3.14; // final == 상수화, static == 클래스변수 => 바로 초기화
Circle(){
this(1,"검정");
}
Circle(String color){
this(1,color);
}
Circle(int radius){
this(radius,"검정");
}
Circle(int radius,String color){
super("원",color);
this.radius=radius;
///this.setArea();
}
@Override
void setArea() {
System.out.println("Circle에서 호출한 setArea()");
this.area=this.radius*this.radius*Circle.PI;
}
}
class Rectangle extends Shape {
int x;
int y;
Rectangle(int x){
this(x,"검정");
}
Rectangle(int x,String color){
super("정사각형",color);
this.x=x;
this.y=x;
///this.setArea();
}
Rectangle(int x,int y){
this(x,y,"검정");
}
Rectangle(int x,int y,String color){
super("직사각형",color);
this.x=x;
this.y=y;
///this.setArea();
}
// 오버로딩 : 함수명 중복정의 허용
// 오버라이딩 : 메서드 재정의
@Override // @ 어노테이션,애너테이션
void setArea() {
System.out.println("Rectangle에서 호출한 setArea()");
this.area=this.x*this.y;
}
}
/*
[요구사항대로 문제해결하기]
모양 Shape
String name 이름
double area 넓이
String color 색
void draw()
ㅁㅁ색 ㅁㅁ모양은 ㅁㅁ.ㅁㅁ만큼의 넓이
원 Circle
int radius 반지름
double PI 3.14 원주율
사각형 Rectangle
int x,y 가로,세로
요구사항
1. 이름이 없는 모양 객체는 없음
2. 어떤 모양의 색을 별도로 지정하지않으면 기본 색은 검정
3. 원의 경우, 반지름을 별도로 지정하지않으면 기본 1
4. new 사각형(10) == 정사각형
5. new 사각형(10,20) == 직사각형
*/
public class Test01 {
public static void main(String[] args) {
Shape s=new Shape("모양");
s.setArea();
Circle c=new Circle(1);
c.setArea();
Rectangle r=new Rectangle(10);
r.setArea();
// 객체지향의 핵심
// 같은 메서드를 수행시켜도
// 다른 주체자가 수행했다면
// 다른 결과가 나온다.
}
}
'JAVA > 자바 수업 내용' 카테고리의 다른 글
동물의 숲 예제로 알아보는 클래스 (0) | 2024.07.04 |
---|---|
학생부 출력 프로그램 - 함수와 메서드를 사용하여 바꾸기 (2) | 2024.07.03 |
예제로 알아보는 클래스02 (0) | 2024.07.02 |
예제로 알아보는 클래스01 (0) | 2024.07.02 |
함수 제작하기 (0) | 2024.07.01 |