public은 전체공개-누구나 레퍼런스(참조)를 가능하게 해줌. 모든 패키지에서(굳이 같은 패키지 아니어도 사용 가능!)
private은 비공개(private를 선언한 클래스 내부에서만 사용 가능)
protected는 가족공개(protected를 선언한 클래스와 상속 받은 클래스에서 사용 가능)
위 그림은 public, private, protected를 보여주는 화면이다. class를 만들었는데 이름이 Hellow이다.
이걸 메인에서 인스턴스화 시켜서 인스턴스로 만들었다. 그리고 인스턴스의 메소드를 사용하기 위해
메소드를 보는 순간 쓸 수 있는건 public과 protected관련 메소드였다. private는 private를 선언한 class에서 밖에
사용 할 수 없으므로 쓸 수 없다.
내가 착각한게 public을 공유의 개념으로 오해를 한적이 있었다. 쉽게 얘기해서 class를 public으로 선언해서 인스턴스화 시키면
그 인스턴스를 다른 class에서 공유하는 거 말이다. 아래 그림을 보자.
나는 위와 같이 public으로 클래스를 선언하고 new를 통해 인스턴스를 생성하면 그 인스턴스가 공유되는줄 알았다.
쉽게 얘기해서 위에 있는 camera2 인스턴스의 내용물들을 공유하는 걸 얘기하는거다.
예를들어 A클래스에서 camera2의 정보를 바꾸면 그 바뀐 정보를 B클래스에서도 사용가능 한줄 알았다.
왜냐면 public을 붙이면 다른 클래스에서 이용 가능 한걸 메소드를 통해서 봤으니까..근데 실제 public은 공유의 개념이 아니라
공개의 개념이다.
만약 public이 공유의 개념이어도 인스턴스의 값이 공유되는 일은 없다. 왜냐면 고슬링씨가 그렇게 만들었다.
자바와 같은 oop(객체지향 프로그래밍)은 쉽게 말해 캡슐화 하고 서로 독립적이고 분리적인걸 지향한다.
이러한 클래스들이 모여 하나의 프로그램을 이루는게 컨셉인데 클래스끼리 서로 간섭하는 공유의 개념은 객체지향적으로 바람직 하지 못하다.
따라서 인스턴스화된 객체를 공유할 수 있어도 그건 객체지향적이지 못하므로 지양해야한다.
앞으로 인스턴스화 시킬 클래스를 선언 할 때 public을 붙여서 선언하는 우를 범하지 말자(default로 값이 없으면 public이라 할지라도 말이다!)
내가 pulibc의 개념으로 헷갈린 '공유'의 개념은 사실 다른 녀석이 가진 개념이다. 바로 static이다. static은 따로 설명을 하겠다.