# 클래스 메소드 호출 #### CODE <a class='btn btn-default' href='/codes/74523'>Link</a> ``` public class CircleTest { public static void main(String[] args) { // 객체 생성 Circle c1 = new Circle(0, 0, 3); // 중심(0,0) - 반지름3 Circle c2 = new Circle(2, 3, 4); // 중심(2,3) - 반지름4 /* 1. 클래스 메소드를 호출하여 원의 넓이를 구하세요. */ double area1 = c1.area(c1); double area2 = c2.area(c2); // 결과 출력 System.out.printf("%s => 넓이: %.2f\n", c1.toStr(), area1); System.out.printf("%s => 넓이: %.2f\n", c2.toStr(), area2); } } class Circle { // 필드 int x; // 원의 중심 - X 좌표 int y; // 원의 중심 - Y 좌표 int r; // 반지름 // 생성자 Circle(int centerX, int centerY, int radius) { x = centerX; y = centerY; r = radius; } // 인스턴스 메소드 String toStr() { return String.format("Circle { 중심: (%d, %d), 반지름: %d }", x, y, r); } // 클래스 메소드 static double area(Circle c) { // 원의 넓이 = 원주율 x 반지름 x 반지름 return Math.PI * c.r * c.r; } } ``` #### INPUT ``` ``` #### OUPUT ``` Circle { 중심: (0, 0), 반지름: 3 } => 넓이: 28.27 Circle { 중심: (2, 3), 반지름: 4 } => 넓이: 50.27 ``` c1.area(c1)과 같이 인스턴스 객체를 통해 메소드에 접근하는 것과 Circle.area(c1)과 같이 클래스 자체의 이름으로 메소드에 접근하는 것 두 방법 모두 상관 없나요 ? 그리고 c1.area(c1)처럼 인스턴스를 통해 접근하는 경우 area( ) 메소드를 구현할 때 파라미터를 전달받을 필요 없이 바로 해당 객체를 생성할 때 저장된 중심과 반지름 변수값을 이용해도 되는 것 맞나요 ..?? ``` static double area() { // 원의 넓이 = 원주율 x 반지름 x 반지름 return Math.PI * this.r * this.r; } ``` 파라미터로 객체를 전달 받을 경우 Circle.area(c1)의 방식 파라미터로 객체를 전달받지 않고 사용하는 경우 c1.area()의 방식으로 접근하는 것이 더 좋게 느껴지는데 이렇게 이해하는 것이 맞는지 헷갈려서 질문 드립니다 ..! 혹은 클래스 메소드는 최대한 객체를 파라미터로 받아서 클래스로 접근하는 것이 더 클린한 코드인가요?
네, 맞습니다. 인스턴스 메소드의 경우 주체객체 정보를 this에서 가져올 수 있으므로 편리한 이점이 있습니다. 대신 클래스 메소드는 객체 생성없이 클래스명을 통해 호출할 수 있는 장점이 있죠 따라서 특정 객체에 의존적인 동작은 인스턴스 메소드로, 아니라면 클래스 메소드로 만드는 것이 좋습니다. 더 자세한 내용은 "이펙티브자바", "클린코드", "리팩터링" 등의 서적을 학습해보세요