💻 Java Modifier(제어자) / Access modifier(접근 제어자)
🎯 목표 : 접근제어자와 제어자의 역할과 활용방법의 이해
📒 접근제어자와 제어자
📌 접근제어자 : public, private, protected, (default)
- public : 접근 제한 없음.
- protected : 같은 패키지 내에서 접근가능, 다른 패키지의 자식클래스에서도 접근 가능하다.
- (default) : 같은 패키지 내에서만 접근 가능.
- private : 같은 클래스 내에서만 접근 가능
👉 예제
- testpkg1, testpkg2 의 두개의 패키지가 있다.
- testpkg1의 AccessModifier 클래스에 조건을 확인하기위한 인스턴스 변수와 메소드를 정의 하였다.
- testpkg2의 OneChild 클래스는 testpkg1의 AccessModifier의 클래스를 상속 받은 자식 클래스다.
📌 testpkg1
package testpkg1;
public class AccessModifier {
// public, private, protected, default
public int pub;
private int pri;
protected int pro;
int def;
public void print() {
System.out.println(pub);
System.out.println(pri);
System.out.println(pro);
System.out.println(def);
}
private void bye() {
System.out.println("BYE,");
}
protected void hello() {
System.out.println("Hello,");
}
void bye2() {
System.out.println("Good Bye,");
}
}
class Access {
public static void main(String[] args) {
AccessModifier at = new AccessModifier();
System.out.println(at.pub);
// System.out.println(at.pri); // private Error
System.out.println(at.pro);
System.out.println(at.def);
at.print(); // public
// at.bye(); // private // Error
at.hello(); // protected
at.bye2(); // default
}
}
📌 testpkg2
package testpkg2;
import testpkg1.*;
class OneChild extends testpkg1.AccessModifier {
public void print() {
System.out.println(pub);
// System.out.println(pri); private Error
System.out.println(pro);
// System.out.println(def); default Error
}
void check () {
super.print();
// super.bye(); private Error
super.hello();
// super bye2(); default Error
}
}
public class AccessModifier2 {
public static void main(String[] args) {
AccessModifier at2 = new AccessModifier();
System.out.println(at2.pub);
// System.out.println(at2.pri); private Error
// System.out.println(at2.pro); protected Error
// System.out.println(at2.def); default Error
at2.print();
// at2.bye(); private Error
// at2.hello(); protected Error
// at2.bye2(); default Error
}
}
- private 제어자는 속해있는 클래스에서만 접근할수 있다.
testpkg1의 Access 클래스를 보면 객체 생성후 private 제어자를 제외한 나머지 접근제어자 변수와 메소드는 출력되는것을 확인할수 있다.
AccessModifier 클래스 내부에서 private 변수와 메소드를 호출하는것은 가능하다. - 다른 패키지의 클래스를 상속받은 자식클래스에서는 public, protected 제어자에만 접근할수 있다.
testpkg2 의 OneChild 클래스에서 public, protected 제어자의 변수와 메소드만 접근 되는것을 확인할수 있다. - 다른 패키지 클래스의 객체를 생성한 경우, public 제어자 에만 접근할수 있다.
testpkg2의 AccessModifier2 클래스에서 testpkg1의 AccessModifier 객체를 생성 하였는데, public 제어자를 제외한 나머지 접근 제어자 변수와 메소드에 대해서 접근이 불가능 한것을 확인 할수 있다.
👉 제어자 : static, final, abstract, native, transient, synchronized, volatile, strictfp
- static - 클래스의, 공통적인
- final - 마지막의, 변경될수없는
변경될수 없고, 확장될 수 없는 클래스다.
재정의,오버라이딩 메서드를 만들수 없다.
초기화 할수 없는 변수가 된다. - abstract - 추상의, 미완성의
클래스 내에 추상 메서드가 선언되어 있다.
추상 메서드는 선언부만 작성되고 구현부는 작성하지 않은 메서드다.
👉 예제
- final 제어자 클래스 MyMath가 있다.
- static 제어자는 Static과 Instance의 관계 포스팅 을 참고하면된다.
- abstract 제어자 클래스 MyMath3은 MyMath2 클래스를 상속받고 있는 자식 클래스다
final class MyMath {
int a, b ;
static int add(int a, int b) {
return a+b;
}
int multiply(int a, int b) {
return a*b;
}
final int c = 2;
int DIVISION(int a,int b, int c) {
return (a+b)/c;
}
}
class MyMath2 { // extends MyMath final 클래스로서 상속이 불가능 Error발생
final void add2() {
System.out.println("hi");
}
}
abstract class MyMath3 extends MyMath2{
abstract void division ();
// void add2 () { final 제어자 메소드는 자식 클래스에서 재 정의 불가
//
// }
}
public class StaticInstance {
public static void main(String[] args) {
MyMath t = new MyMath();
t.a = 3;
t.b = 9;
// t.c = 5; 상수로서 재 정의 불가능
// MyMath3 p = new MyMath3(); // 추상화 클래스는 객체화 할수없다
}
- final 제어자 클래스는 부모클래스가 될수 없다.
MyMath2가 MyMath 클래스를 상속 받으려 하면 Error 발생 - final 메소드는 오버라이딩,재정의 될수 없는 메소드다.
MyMath2를 상속받은 자식클래스 MyMath3에서 final 제어자 메소드 add2를 재정의는 불가능한 것을 확인할수 있다. - final 변수는 재 정의 될수 없는 상수다.
제일 아래 main 메소드에서 MyMath 객체를 생성하여 인스턴스 변수 c 는 재 정의가 불가능한 것을 확인할수 있다. - abstract 제어자 클래스는 abstract 메소드를 포함하고 있으며, 객체를 생성할 수 없다.(인스턴스화 불가능)
제일 아래 main 메소드에서 MyMath3 객체가 생성 불가능 한 것을 확인 할수 있다.
'Language > JAVA' 카테고리의 다른 글
Java Polymorphise(다형성) - OOP_다형성 (0) | 2022.08.22 |
---|---|
Java Access Modifier(접근제어자) Encapsulation(캡슐화) - OOP_캡슐화 (0) | 2022.08.22 |
Java super. / super() - OOP_상속 (0) | 2022.08.21 |
Java Overriding(오버라이딩) - OOP_상속 (0) | 2022.08.21 |
Java Class의 Inheritance(상속) / Composite(포함) - OOP_상속 (0) | 2022.08.20 |