클래스 메소드 호출

CODE Link

  1. public class CircleTest {
  2. public static void main(String[] args) {
  3. // 객체 생성
  4. Circle c1 = new Circle(0, 0, 3); // 중심(0,0) - 반지름3
  5. Circle c2 = new Circle(2, 3, 4); // 중심(2,3) - 반지름4
  6. /* 1. 클래스 메소드를 호출하여 원의 넓이를 구하세요. */
  7. double area1 = c1.area(c1);
  8. double area2 = c2.area(c2);
  9. // 결과 출력
  10. System.out.printf("%s => 넓이: %.2f\n", c1.toStr(), area1);
  11. System.out.printf("%s => 넓이: %.2f\n", c2.toStr(), area2);
  12. }
  13. }
  14. class Circle {
  15. // 필드
  16. int x; // 원의 중심 - X 좌표
  17. int y; // 원의 중심 - Y 좌표
  18. int r; // 반지름
  19. // 생성자
  20. Circle(int centerX, int centerY, int radius) {
  21. x = centerX;
  22. y = centerY;
  23. r = radius;
  24. }
  25. // 인스턴스 메소드
  26. String toStr() {
  27. return String.format("Circle { 중심: (%d, %d), 반지름: %d }", x, y, r);
  28. }
  29. // 클래스 메소드
  30. static double area(Circle c) {
  31. // 원의 넓이 = 원주율 x 반지름 x 반지름
  32. return Math.PI * c.r * c.r;
  33. }
  34. }

INPUT

OUPUT

  1. Circle { 중심: (0, 0), 반지름: 3 } => 넓이: 28.27
  2. Circle { 중심: (2, 3), 반지름: 4 } => 넓이: 50.27

c1.area(c1)과 같이 인스턴스 객체를 통해 메소드에 접근하는 것과
Circle.area(c1)과 같이 클래스 자체의 이름으로 메소드에 접근하는 것 두 방법 모두 상관 없나요 ?

그리고 c1.area(c1)처럼 인스턴스를 통해 접근하는 경우 area( ) 메소드를 구현할 때 파라미터를 전달받을 필요 없이 바로 해당 객체를 생성할 때 저장된 중심과 반지름 변수값을 이용해도 되는 것 맞나요 ..??

  1. static double area() {
  2. // 원의 넓이 = 원주율 x 반지름 x 반지름
  3. return Math.PI * this.r * this.r;
  4. }

파라미터로 객체를 전달 받을 경우 Circle.area(c1)의 방식
파라미터로 객체를 전달받지 않고 사용하는 경우 c1.area()의 방식으로 접근하는 것이 더 좋게 느껴지는데 이렇게 이해하는 것이 맞는지 헷갈려서 질문 드립니다 ..!
혹은 클래스 메소드는 최대한 객체를 파라미터로 받아서 클래스로 접근하는 것이 더 클린한 코드인가요?

네, 맞습니다.

인스턴스 메소드의 경우
주체객체 정보를 this에서 가져올 수 있으므로
편리한 이점이 있습니다.

대신 클래스 메소드는
객체 생성없이 클래스명을 통해 호출할 수 있는 장점이 있죠

따라서
특정 객체에 의존적인 동작은 인스턴스 메소드로,
아니라면 클래스 메소드로 만드는 것이 좋습니다.

더 자세한 내용은
“이펙티브자바”, “클린코드”, “리팩터링”
등의 서적을 학습해보세요

[Markdown Preview]