[해결] ① static 메소드 VS non-static 메소드 차이를 몰랐었음 (클래스 메소드) (객체 메소드) ② public한 메소드 => 몰랐었음 (다른 클래스에서도 접근 가능) [정답 코드 질문] getVolume() 메소드 getArea() 메소드 => Math.PI를 사용하는 메소드 => 그럼 static 메소드로 만들어야 하지 않나요? (//완전 잘못 알고 있었을 때의 질문임. 무시) => 정답 코드에는 static 자리에 public이라고 써있는데 => static 말고 public이라고 쓰면 무슨 차이인가요? *아래의 제가 한 코드로 정상 작동은 합니다 *하지만 정답코드와 차이가 있어, 궁금합니다 # 원기둥 클래스 정의하기 #### CODE <a class='btn btn-default' href='/codes/23153'>Link</a> ``` public class main{ public static void main (String[] args) { Cylinder C1 = new Cylinder(4, 5); System.out.printf("원기둥의 부피: %.2f\n", Cylinder.volume(C1)); System.out.printf("원기둥의 겉넓이: %.2f\n", Cylinder.area(C1)); } } class Cylinder{ int radius; int height; Cylinder(int r, int h){ radius = r; height = h; } static double volume(Cylinder C){ return (Math.PI * C.radius * C.radius) * C.height; } static double area(Cylinder C){ double 원넓이 = Math.PI * C.radius * C.radius; double 옆면넓이 = Math.PI * C.radius * C.height * 2; return (원넓이*2) + 옆면넓이; } } ``` #### INPUT ``` ``` #### OUPUT ``` 원기둥의 부피: 251.33 원기둥의 겉넓이: 226.19 ```
static double volume(Cylinder C){ return (Math.PI * C.radius * C.radius) * C.height; } volume 메소드 앞에 static이 붙는 이유는 Math.PI를 사용했기 때문이 아닌 Cylinder 클래스의 외부 클래스인 Main클래스에서 volume메소드를 호출할때 Cylinder.volume() 즉 클래스명.메소드명 형태로 호출하기 때문입니다. 하지만 volume메소드 앞에 public이 붙으면 Main클래스에서 volume메소드를 호출할때 인스턴스변수.메소드명() 형태로 호출해야 합니다. System.out.printf("원기둥의 부피: %.2f\n", C1.volume(C1)); public double volume(Cylinder C){ return (Math.PI * C.radius * C.radius) * C.height; } 이렇게 호출하면 volume메소드에 static을 안붙여도 됩니다. 정리하면 메소드앞에 static이 붙으면 클래스명.메소드명으로 호출할수 있지만 static이 붙지않으면 인스턴스변수.메소드명 형태로 호출해야 합니다.
# 인스턴스 메소드 vs 클래스 메소드 스태틱이 없는 non-static 메소드를, 인스턴스 메소드라 합니다. 반면 static이 붙은 메소드는, 클래스메소드라 합니다. ## 구분 인스턴스 메소드는, 주체 객체가 직접 일을 처리합니다. 반면 클래스 메소드는, 클래스가 주체가 되어 동작을 수행합니다. ## 실생활 비유 #### 인스턴스 메소드 호출 부하 직원이 주체적으로 일을 하는 것. 이를 인스턴스 메소드 호출에 비유할 수 있습니다. 객체가 특정 업무를 수행하는 것입니다. ``` Cylinder c = new Cylinder(4, 5); // 객체 생성 c.volume(); // 객체 스스로 부피를 계산 ``` #### 클래스 메소드 호출 반대로, 클래스 메소드 호출. 이는 부하 객체를 데리고 와, 감독하에 일을 시키는 것으로 표현할 수 있습니다. ``` Cylinder c = new Cylinder(4, 5); // 객체 생성 Cylinder.volume(c); // 클래스가 객체를 데리고 와, 일을 지시 함. ``` ## PS. 비유적으로 표현해보았는데 전달이 잘 되었는지 모르겠네요. 수업 때 또 질문 주세요!