[JAVA] ch5: 클래스와 객체-2

oow·2026년 4월 18일

JAVA

목록 보기
10/13

접근 지정자

접근 지정자

java의 접근 지정자로는 public, private, protected, default(생략)이 있다. 접근 지정자는 클래스나 멤버를 공개/비공개로 설정하여 다른 클래스에서의 접근을 제한하기 위해 사용한다. OOP의 캡슐화는 기본적으로 내부를 숨기지만, 접근 지정자를 통해 일부를 공개할 수 있다.

  • public: 완전 노출
  • private: 완전 숨김 -> getter/setter 활용
  • protected: 동일 패키지이거나 상속 관계이면 public
  • default: 같은 패키지이면 public

*패키지는 클래스 파일을 저장하는 폴더와 같은 개념이다.


클래스/멤버 접근 지정

public은 모든 클래스에게 접근을 허용하지만, default는 같은 패키지의 클래스에게만 접근을 허용한다. 클래스에 접근할 수 있다면 인스턴스를 생성할 수 있다.

  • 클래스가 public이더라도 멤버가 private라면 해당 멤버에는 접근이 불가능하다.
  • 클래스가 public이더라도 멤버가 default이면 다른 패키지에서 해당 멤버에 접근이 불가능하다.
    => 인스턴스를 생성한 후 인스턴스이름.을 입력하면 멤버가 보이지 않는다.
  • 멤버가 protected이고 다른 패키지라면 상속 관계에서(자식 클래스에서)만 접근이 가능하다.
    • public class Aprotected int a가 있고, 다른 패키지에 A를 상속받은 class B extend A가 있다면 B에서 a에 접근할 수 있다.
    • 반대로, A가 B를 상속받은 경우에는 B에서 A에 접근이 불가능하다.

getter/setter

getter와 setter는 약속된 메소드로, private로 선언된 값을 가져오거나 값을 변경할 때 사용한다. 필드에 직접 접근하는 것을 막을 수 있다. getter는 리턴타입 getFieldName()과 같이 사용하고 setter는 void setFieleName(타입 변수)와 같이 사용한다.

  • 생성자는 리턴 타입이 없고, 인자를 구분하여 여러 개 선언할 수 있다.
  • getter/settersource > Generate Getters and Setters에서 자동으로 생성할 수 있다.
  • private 필드는 외부에서 직접 값에 접근하는 것을 막고, getter/setter를 통해 값을 가져오거나 설정할 수 있다.



static, final, 싱글톤

static

static은 인스턴스(non-static)과 반대되는 개념이다. 인스턴스는 new로 객체를 생성하여 사용하는 필드/메소드이다. 객체마다 하나씩 존재한다. 이때 this는 객체 자신의 필드를 가리키기 때문에 non-static으로 생성된 멤버에만 사용한다(static 메소드는 this 사용 불가). 또한 생성하지 않으면 사용이 불가능하다.

  • 인스턴스 멤버

반면 static은 정적 변수/메소드로, 클래스 전체에서 하나만 존재한다. 따로 객체를 생성할 필요가 없으며 존재하는 static 변수를 모든 객체가 공유한다. static 클래스가 로딩될 때 static 공간에 할당된다.

  • 클래스 멤버

static은 전역 변수/메소드를 만들 때 사용한다. 예를 들어, Math 클래스는 모든 필드와 메소드가 public static으로 선언되어 있어 다른 클래스에서 Math.abs(x)와 같이 접근할 수 있다.

non-static 멤버는 생성해야 사용할 수 있으므로 static 메소드에서 사용이 불가능하다. 반면 static 멤버는 실행과 동시에 생성되므로 non-static 메소드에서 사용할 수 있다. 따라서 다른 메소드에서 접근해야 하는 전역 변수와 전역 메소드는 static으로 선언한다.

  • c1, c2, c3의 increment가 호출되면, 자신의 instanceCount를 ++하고 totalCount를 ++한다.
  • -> c1.increament()는 1번 호출되었으므로 c1.instanceCount=1이다.
  • .increament()는 4번 호출되었으므로 Counter.totalCount=4이다.

싱글톤

싱글톤은 단 하나만 생성되도록 만든 객체를 말한다. 최초 1번만 생성하고, 이후에는 생성되어있다면 이미 생성된 객체를 불러오는 방식으로 구현한다.

  • 외부에서 new로 생성자를 호출할 수 없도록 private으로 선언한다.
  • 생성자 대신 생성 역할을 할 static 메소드(getInstance)를 선언한다.
  • 해당 클래스가 이미 선언되었는지 확인할 수 있도록 static 변수를 선언한다.
    • 생성하지 않고도 접근 가능해야 하므로 static으로 선언한다.
    • 외부에서 수정이 불가하도록 private으로 선언한다.

  • sky1 -> instance==null이므로 하늘 객체를 생성하고 리턴한다.
  • sky2, 3, 4 -> 이미 객체가 생성되었으므로 존재하는 객체를 리턴한다.
    • sky1, sky2, sky3, sky4는 모두 하늘 sky1=하늘.getInstance()에서 생성된 객체를 가리킨다.
  • 싱글톤 설명을 보고 생성 여부를 확인하기 위해 boolean을 사용해야겠다고 생각했는데, static 변수를 null로 설정하여 확인 가능하다. -> 생성 여부 확인과 객체 저장을 한 번에 할 수 있다.

final

final 필드는 C에서의 const와 유사하다. 실행 중에 값을 변경할 수 없어 상수를 선언할 때 사용한다. 초기값을 반드시 지정해주어야 한다.

  • final 클래스는 상속이 불가능하다.
  • final 메소드는 수정(오버로딩, 오버라이딩)이 불가능하다.



+패키지

패키지는 폴더와 같은 개념이다.

  • 자바 프로젝트의 src 폴더 경로에 들어가보면 패키지 폴더가 생성되어 있다.
  • src에 바로 파일을 생성하면 (default package)로 표시되지만, 실제로는 폴더가 존재하지 않고 src에 저장된다.

0개의 댓글