# 메소드 오버라이딩(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 ```
## 해당 코드는 여러 도형들이 배열로 담겨있습니다. ``` 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의 방식을 선호합니다.