[해결] public에 대해 몰라서 이해 못 한 거였음. 현재 이해 ok
[질문]
생성자 앞에 public 안 썼는데도 작동ok했습니다. 왜 그럴까요?
정답코드에서, 생성자 앞에 public을 쓴 이유도 궁금합니다
# 정육면체(인스턴스 메소드 호출)
#### CODE <a class='btn btn-default' href='/codes/23157'>Link</a>
```
public class main{
public static void main (String[] args) {
Cube a = new Cube(3);
Cube b = new Cube(5);
System.out.printf("정육면체 a의 부피: %d, 겉넓이: %d\n", a.V(), a.S());
System.out.printf("정육면체 b의 부피: %d, 겉넓이: %d\n", b.V(), b.S());
}
}
class Cube{
int length;
//Q. 생성자 앞에 public 안 썼는데도 작동ok했음. Why??
Cube(int l){
length = l;
}
//아래 쓴 내용 : 틀렸음. 혼자만의 오해였음. 무시.
//객체.메소드() => 이렇게 호출했음
//따라서 객체는 <-> 클래스 Cube와 서로 정보를 공유(서로에게 영향 주기) 해야함
//따라서 public
public int V(){
return (length*length)*length;
}
public int S(){
return (length*length)*6;
}
}
```
#### INPUT
```
```
#### OUPUT
```
정육면체 a의 부피: 27, 겉넓이: 54
정육면체 b의 부피: 125, 겉넓이: 150
```
tkgksw님의 답변
```
public int V(){
return (length*length)*length;
}
```
일단 메소드에서 타입앞에 붙는 애들을 접근제한자 라고 합니다.
위의 V메소드에 접근제한자 public 이 붙었는데 public은 "외부 클래스에서도 접근가능하다"라는 의미를 갖고있습니다.
즉, 현재 V메소드가 선언된 Cube 클래스의 외부 클래스인 Main클래스에서 V메소드에 접근할수 있다는 의미입니다.
이때 Main클래스안에서 length값으로 3을 가지는 new Cube(3) 인스턴스를 만들었고 해당 인스턴스의 주소를 Cube 타입의 변수 a가 갖고있습니다.
System.out.printf("정육면체 a의 부피: %d, 겉넓이: %d\n", a.V(), a.S());
출력하는 부분의 코드를 보면 부피를 구하는 V메소드를 호출할때 a.V() 형태로 되어있습니다.
이유는 Cube클래스 안에 선언된 V메소드를 Cube클래스의 외부 클래스인 Main클래스에서 호출하기 위해 new Cube(3) 인스턴스의 주소를 갖고있는 Cube 타입의 인스턴스 변수 c를 사용해서 c.V() 로 Cube클래스에 선언된 인스턴스 메소드 즉 ,V메소드를 호출한것 입니다.
생성자 앞에 public이 안붙었는데도 오류가 안나는 이유는 프로그램을 실행시켰을때 외부 클래스에서 생성자에 접근할수 있도록 자바 컴파일러가 자동으로 public을 붙여주기 때문입니다.
메소드에 public이 붙으면 인스턴스 메소드를 의미합니다.
V메소드에 public이 붙었기때문에 인스턴스 메소드 입니다.
wldudrhdwndi님의 답변
아 감사합니다~ 이해 완료!!
(참고) 설명 마지막 두 줄에 오타 있습니다~! (인스턴스 메소드)
(내가 보려고 적는 설명)
- public 메소드 : 완전공개 메소드
- static 메소드 : 클래스 메소드 (메소드를 클래스가 수행)
- non-static 메소드 : 인스턴스 메소드 (메소드를 인스턴스, 즉 객체가 수행)