[해결]
① 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
```
tkgksw님의 답변
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이 붙지않으면 인스턴스변수.메소드명 형태로 호출해야 합니다.
sehongpark님의 답변
# 인스턴스 메소드 vs 클래스 메소드
스태틱이 없는 non-static 메소드를, 인스턴스 메소드라 합니다.
반면 static이 붙은 메소드는, 클래스메소드라 합니다.
## 구분
인스턴스 메소드는, 주체 객체가 직접 일을 처리합니다.
반면 클래스 메소드는, 클래스가 주체가 되어 동작을 수행합니다.
## 실생활 비유
#### 인스턴스 메소드 호출
부하 직원이 주체적으로 일을 하는 것. 이를 인스턴스 메소드 호출에 비유할 수 있습니다. 객체가 특정 업무를 수행하는 것입니다.
```
Cylinder c = new Cylinder(4, 5); // 객체 생성
c.volume(); // 객체 스스로 부피를 계산
```
#### 클래스 메소드 호출
반대로, 클래스 메소드 호출. 이는 부하 객체를 데리고 와, 감독하에 일을 시키는 것으로 표현할 수 있습니다.
```
Cylinder c = new Cylinder(4, 5); // 객체 생성
Cylinder.volume(c); // 클래스가 객체를 데리고 와, 일을 지시 함.
```
## PS.
비유적으로 표현해보았는데 전달이 잘 되었는지 모르겠네요. 수업 때 또 질문 주세요!