# 클래스 메소드 호출
#### 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()의 방식으로 접근하는 것이 더 좋게 느껴지는데 이렇게 이해하는 것이 맞는지 헷갈려서 질문 드립니다 ..!
혹은 클래스 메소드는 최대한 객체를 파라미터로 받아서 클래스로 접근하는 것이 더 클린한 코드인가요?
sehongpark님의 답변
네, 맞습니다.
인스턴스 메소드의 경우
주체객체 정보를 this에서 가져올 수 있으므로
편리한 이점이 있습니다.
대신 클래스 메소드는
객체 생성없이 클래스명을 통해 호출할 수 있는 장점이 있죠
따라서
특정 객체에 의존적인 동작은 인스턴스 메소드로,
아니라면 클래스 메소드로 만드는 것이 좋습니다.
더 자세한 내용은
"이펙티브자바", "클린코드", "리팩터링"
등의 서적을 학습해보세요