멤버 또는 클래스에 사용되며 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할
접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자
private : 같은 클래스 내에서만 접근 가능
(default) : 같은 패키지 내에서만 접근 가능
protected : 같은 패키지나 다른 패키지의 자손클래스에서 접근 가능
public : 접근 제한이 없음
접근 범위가 넓은 쪽에서 좁은 쪽의 순서
public > protected > (default) > private
private으로 선언된 멤버 변수(필드)에 대해 접근 또는 수정할 수 있는 메서드를 public으로 제공
보통 멤버변수의 값을 읽는 멤버변수의 이름을 ‘get멤버변수', 멤버변수의 값을 변경하는 메서드의 이름을 ‘set멤버변수이름'으로 함
get으로 시작하는 메서드를 getter, set으로 시작하는 메서드를 setter라고 부름
캡슐화 (encapsulation)
클래스나 멤버 등에 접근 제어자를 사용하는 이유는 클래스 내부에 선언된 데이터를 보호하기 위함
이러한 것을 데이터 감추기(data hiding)이라 하며, 객체지향개념의 캡슐화(encapsulation)라고 함
대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만 제공하여 일관된 기능을 구현하게 함
각각의 메서드나 멤버 변수를 접근함으로써 발생하는 오류를 최소화 함
객체 자신을 가르키는 참조면수 - this
this
인스턴스 자신을 가리키는 참조변수
인스턴스의 주소가 저장되어 있음
인스턴스 멤버에서만 사용 가능함
this(), this(매개변수)
생성자, 같은 클래스의 다른 생성자를 호출할 때 사용
this는 ‘참조 변수'이고, this()는 ‘생성자’
클래스 내에서 참조변수가 가지는 주소 값과 동일한 주소 값을 가지는 키워드
클래스의, 공통적인 - static
클래스 변수(static멤버변수)는 하나의 변수를 모든 인스턴스가 공유하므로 인스턴스에 관계 없이 같은 값을 가짐
인스턴스를 생성하지 않고도 사용할 수 있음
static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭
static 멤버변수
모든 인스턴스에 공통적으로 사용하는 클래스 변수
클래스 변수는 인스턴스를 사용하지 않고도 사용 가능
클래스가 메모리에 로드될 때 생성
static 메서드
인스턴스를 생성하지 않고도 호출이 가능한 static 메서드
static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없음
인스턴스 멤버를 사용하지 않는 메서드는 static을 붙여서 static 메서드로 선언하는 것을 고려하는 것이 속도 면에서 더 좋을 수 있음
변수의 유효 범위와 메모리
변수 유형
선언 위치
사용 범위
메모리
생성과 소멸
지역 변수
(로컬 변수)
함수 내부에 선언
함수 내부에서만 사용
스택
함수가 호출될 때 생성되고 함수가 끝나면 소멸됨
멤버 변수
(인스턴스 변수)
클래스 멤버 변수로 선언
클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용 가능
힙
인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨
static 변수
(클래스 변수)
static 예약어를 사용하여 클래스 내부에 선언
클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능
데이터 영역
프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨
static 응용 - 싱글톤 패턴(singleton pattern)
프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 패턴
static 변수, 메서드를 활용하여 구현할 수 있음
예제 코드
Company class
public class Company {
private static Company instance = new Company();
private Company() {
}
public static Company getInstance() {
if (instance == null) {
instance = new Company();
}
return instance;
}
}
CompanyTest class
public class CompanyTest {
public static void main(String[] args) {
Company company1 = Company.getInstance();
Company company2 = Company.getInstance();
System.out.println(company1);
System.out.println(company2);
}
}
테스트 코드에서 프린트된 값은 모두 Company@5e91993f 으로 같은 값이 나온다. 따라서 같은 인스턴스를 공유하는것을 알 수있다.
댓글 영역