# 메소드 오버라이딩(overriding)
공부하다 보니 for문이 헷갈리는데요.
for (int i = 0; i < shapes.length; i++) {
**Shape tmp = shapes[i];**
System.out.printf("%s의 넓이 -> %.2f\n", tmp.name, tmp.area());
여기서 Shape tmp = shapes[i];를 왜 써줘야 하는지 잘 모르겠습니다...
for (int i = 0; i < shapes.length; i++) {
System.out.printf("%s의 넓이 -> %.2f\n", name, area());
이렇게 써봤더니 오류가 나는데, 위의 문장만으로 i에 해당 되는 값은 Shape[] shapes = { s, t, c }; 의 배열에서 정해지는게 아닌가요..?
어느 상황에서 Shape tmp = shapes[i];와 같은 추가 문장을 써줘야 하는지, 그리고 왜 써야 하는지 설명해 주시면 감사하겠습니다.
#### CODE <a class='btn btn-default' href='/codes/56531'>Link</a>
```
public class Overriding {
public static void main(String[] args) {
// 객체 생성 및 초기화 - 정사각형
Square s = new Square();
s.name = "정사각형";
s.length = 5;
// 객체 생성 및 초기화 - 정삼각형
Triangle t = new Triangle();
t.name = "삼각형";
t.base = 4;
t.height = 3;
// 객체 생성 및 초기화 - 원
Circle c = new Circle();
c.name = "원";
c.radius = 4;
// 업 캐스팅 - shape 배열에 정사각형, 삼각형, 원 담기. 서로 다른 객체를 부모 타입인 shape로 업캐스팅하여 배열화.
Shape[] shapes = { s, t, c };
// 모든 도형의 넓이 계산 및 출력
for (int i = 0; i < shapes.length; i++) {
Shape tmp = shapes[i];
System.out.printf("%s의 넓이 -> %.2f\n", tmp.name, tmp.area());
} //area라는 매소드 호출을 통해서 넓이를 구해주고 있음.
}
}
// 도형
class Shape {
String name;
// 도형의 넓이를 반환
public double area() {
return 0 ; //무조건 0을 return 하고 있음
}
}
// 정사각형
class Square extends Shape {
int length; // 한 변의 길이
/* 1. 정사각형 넓이를 구하도록 area()를 재정의하세요. */
public double area(){
return length * length;
}
}
// 삼각형
class Triangle extends Shape {
int base; // 밑변
int height; // 높이
/* 2. 삼각형 넓이를 구하도록 area()를 재정의하세요. */
public double area(){
return base * height /2.0 ;
}
}
// 원
class Circle extends Shape {
int radius; // 반지름
/* 3. 원의 넓이를 구하도록 area()를 재정의하세요. */
public double area (){
return Math.PI * radius * radius;
}
}
```
#### INPUT
```
```
#### OUPUT
```
정사각형의 넓이 -> 25.00
삼각형의 넓이 -> 6.00
원의 넓이 -> 50.27
```
sehongpark님의 답변
## 해당 코드는 여러 도형들이
배열로 담겨있습니다.
```
Shape[] shapes = { s, t, c };
```
해당 배열 속 각 객체에 접근하기 위한 방법은
크게 두가지 방식이 있습니다.
#### 1. 배열과 인덱스 연산을 사용한 접근
```
for (int i = 0; i < shapes.length; i++) {
// 배열을 가리키는 shapes 변수를 활용
System.out.printf("%s의 넓이 -> %.2f\n", shapes[i].name, shapes[i].area());
}
```
#### 2. 레퍼런스 변수를 통한 접근
```
for (int i = 0; i < shapes.length; i++) {
Shape tmp = shapes[i]; // 레퍼런스 변수 tmp를 선언하여 배열 속 객체에 접근
System.out.printf("%s의 넓이 -> %.2f\n", tmp.name, tmp.area());
}
```
1의 코드는 더 짧게 작성할 수 있는 장점이 있는 반면,
2의 코드는 사용자의 가독성이 높다는 장점이 있겠습니다.
### PS.
간단한 코드의 경우
굳이 레퍼런스 변수를 선언할 필요는 없습니다.
단, 협업 및 가독성의 관점에서
개인적으로 2의 방식을 선호합니다.