-
자바[Java] 접근 제어자[Access modifier]프로그래밍/Java 2021. 7. 31. 10:53
자바의 접근 제어자 default / public(package) / private / protected / static / final
▶ default(package)
가장 기본적인 접근 제어자로 생략이 가능하다. => 접근 제어자를 생략하면 default로 설정된다.
default는 같은 패키지 내에 있는 class라면 접근이 가능하다.
1번 패키지에 1번 클래스를 정의하였다.
2번 패키지를 만들고 2번 클래스를 만들고 2번 클래스에 1번 클래스를 불러오기(import)를 했을 때, 오류 발생
=> 같은 패키지 안에서만 불러오기 가능
▶ public
이름처럼 어디서든 불러올 수 있다.
다른 패키지 안의 다른 클래스에서도 불러와 사용 가능하다.
testPackage1 패키지에 있는 TestClass2 클래스의 접근 제어자를 public으로 변경해줬다.
testPackage2 패키지의 TestClass2 클래스에서 다른 패키지에 있는 TestClass1을 불러와도 잘 작동된다.
▶ private
자신을 제외한 다른 클래스에서 접근 불가능
오직 자신의 클래스 안에서만 접근이 가능하다.
testPackage1 패키지의 TestClass1 클래스에 필드 값을 생성했다. (public int, private int 1개씩)
TestClass1은 public이기 때문에 다른 패키지(testPackage2)에서 다른 클래스(testClass2)로 import 할 수 있었지만, 필드 값은 publicNum 밖에 접근하지 못한다.
▷ private 접근자를 쓰는 이유?
클래스는 추상적인 개념을 정리해 놓고 해당 클래스를 상속받은 하위 클래스에서 구체화시켜서 사용한다. ex). 상위 클래스 : 도형, 동물... / 하위 클래스 : 사각형, 삼각형... 강아지, 고양이...
이때, 가장 큰 틀인 상위 클래스의 필드 값을 직접 접근하면 하위 클래스들에게 문제가 발생할 수도 있고 사용자의 잘못된 값을 입력받을 수도 있다.
ex): 잘못된 값 대입 : 1~100까지만 저장해야 하는 변수에 사용자가 200을 저장
이 같은 문제를 방지하고자 일반적으로 필드 값은 private로 정의하고 getter / setter 함수를 만들어 필드 값에 접근한다.
▶ protected
같은 패키지 혹은 상속한 하위(자식, 서브) 클래스에서만 접근 가능 / 상속받지 않은 클래스는 다른 패키지에서 사용 불가능
testPackage1 패키지 안의 상위 클래스인 SuperClass에서 protected와 private 필드 값을 각각 생성했을 때,
testPackage2 패키지에서 하위 클래스인 SubClass에서는 protected로 정의된 필드 값만 접근이 가능한 걸 확인할 수 있다.
▶ static
▷공유 메모리에 존재
static으로 정의된 객체는 프로그램이 실행되는 동안 공유 메모리에 상주하면서 사용된다.
일반적으로 객체를 생성할 때면 메모리 공간을 차지하게 된다.
하지만, 상수 값처럼 변함없는 값의 경우 반복해서 생성하게 되면 메모리를 낭비하는 꼴이 될 수 있다.
이때 반복적으로 사용되는 객체는 공유 메모리에 한 번만 저장시킨 후 필요할 때마다 불러와 사용하면 메모리를 더 효율적으로 사용할 수 있게 된다.
ex)
A 클래스에는 데이터1, 데이터 2, 데이터 3 이 있다고 가정
데이터 1은 값이 절대 변하지 않는다고 했을 때, A클래스를 반복해서 생성하게 불러오게 되면 변하지 않을 값인 데이터 1을 반복해서 메모리에 저장하게 되어 비효율적이다.
변하지 않을 데이터 값(예를 들어 상수) 은 static으로 정의하여 공유 메모리에 저장 -> 메모리 효율성 증가
▷static끼리만 호환
static으로 정의된 데이터를 어디서든 사용할 수 있는 것은 아니다.
static으로 정의된 데이터는 같이 static으로 정의된 클래스에서만 사용할 수 있다.
대표적인 static 클래스는 프로그램을 실행시키는 main 클래스가 있다.
static으로 정의된 main 클래스에서 static으로 정의된 MAX_NUM 데이터 값이 잘 사용된다.
static이 아닌 클래스 안에서 static으로 정의된 데이터를 불러와 사용할 때의 모습이다.
프로그램 시작 전에는 문법적 에러가 없어서 경고문이 나타나지 않지만, 프로그램을 실행하면 위처럼 에러가 나며 실행되지 않는다.
MAX_NUM은 공유 메모리에 상주되는 static 데이터인데 static이 아닌 클래스에서 불러왔기 때문이다.
이처럼 static 데이터는 static 클래스에서만 사용이 가능하다는 특징이 있다.
▶ final
상수를 저장하는 접근 제어자
final의 경우는 static에서 잠깐 나왔는데 상수(변하지 않는 값)를 저장할 때 사용된다.
final로 정의된 MAX_NUM의 값을 변경하려고 하면 오류 메시지가 나온다.
변경되어서는 안 되는 값이 경우, 사용자 혹은 개발자가 실수로라도 변경할 수 없도로 final로 정의한다.
▷ 하위 클래스에서 새로 생성 가능
final로 정의된 값은 하위 클래스에서 새로 생성 가능하다. -> 같은 이름, 다른 메모리 주소
하위 클래스는 상위 클래스에 종속되어 있기 때문에 상위 클래스의 데이터 값에 직접 가능, 하위 클래스에서 MAX_NUM 상수 값 새로 생성 가능
하위 클래스에서 위 사진과 같이 상수 값을 재정의 한 후 getter 함수를 정의해 리턴 값을 새로 정의된 상수 값으로 해준다.
테스트해보면 하위 클래스의 상수 값이 잘 나오는 걸 확인할 수 있다.
'프로그래밍 > Java' 카테고리의 다른 글
자바(Java) 사용자 입/출력과 버퍼(butter) (0) 2021.07.23 0000~1111 자바(JAVA) 데이터 타입 크기와 형변환에 대해서... (0) 2021.07.21