본문 바로가기
프로그래밍/JAVA

자바의 정석 기초 ( 제어자 / 접근 제어자 / public / protected / default / private )

by ✲ 2020. 7. 12.
반응형

남궁성님의 자바의 정석 기초편을 보면서 혼자 공부하는 공간입니다. 참고 부탁드립니다.

제어자 (modifier)

- 클래스와 클래스의 멤버 (멤버 변수, 메서드)에 부가적인 의미 부여

- 하나의 대상에 여러 제어자를 같이 사용 가능 (접근 제어자는 하나만)

접근제어자 : public, protected, (default), private

그 외 : static, final, abstract, native ... 등

 

static (클래스의, 공통적인)

제어자 대상 의미
static 멤버변수 모든 인스턴스에 공통적으로 사용되는 클래스 변수
클래스 변수는 인스턴스를 생성하지 않고도 사용 가능
클래스가 메모리에 로드될 때 사용
메서드 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드
static 메서드 내에서 인스턴스 멤버들을 직접 사용할 수 없음

class StaticTest{
    static int width = 200;
    static int height = 120; //클래스 변수(static 변수)

    static { // 클래스 초기화 블럭
        // static 변수의 복잡한 초기화 수정
    }

    static int max(int a, int b) { //클래스 메서드(static 메서드)
        return a> b ? a : b;
    }
}

final (마지막의, 변경될 수 없는)

제어자 대상 의미
final 클래스 변경될 수 없는 클래스, 확장될 수 없는 클래스
final로 지정된 클래스는 다른 클래스의 조상이 될 수 없음
메서드 변경될 수 없는 메서드
final로 지정된 메서드는 오버라이딩을 통해서 재정의 될 수 없음
멤버 변수 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 됨
지역 변수


final class FinalTest{                     //조상이 될 수 없는 클래스
    final int MAX_SIZE = 10;           //값을 변경할 수 없는 멤버변수 (상수)

    final void getMaxSize() {           // 오버라이딩할 수 없는 메서드(변경불가 )
         final int LV = MAX_SIZE;      //값을 변경할 수 없는 지역변수 (상수)
         return MAX_SIZE;
    }
}

abstratc (추상의, 미완성의)

제어자 대상 의미
abstract  클래스 클래스 내에 추상 메서드가 선언되어 있음을 의미
메서드 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드

abstract class AbstractTest{        //추상 클래스 (추상 메서드를 포함한 클래스)
    abstract void move();           // 추상 메서드 (구현부{}가 없는 메서드)
}

* 추상클래스의 인스턴스 생성 불가
AbstractTest a = new AbstractTEst() ; // 에러 (미완성 설계도이기 때문에)

추상클래스를 상속받아서 완전한 클래스를 만든 후에 객체 생성 가능

 

접근제어자 (access modifier)

private : 같은 클래스 내에서만 접근 가능

default : 같은 패키지 내에서만 접근 가능

protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능

public : 접근 제한이 전혀 없음

접근 제어자는 4개 중 한개만 사용 가능함

public > protectd  > default > private (범위가 큰 순)

* 클래스 앞에는 public 아니면 default만 사용 가능

* 멤버 변수앞에는 4개다 사용 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package pkg1;
// 하나의 소스파일에 public 클래스가 하나만 있어야 함 
// MyParent를 public 클래스로 만들려면 
// MyParentTest는 public 지워야함 
// 소스파일이름과 public클래스 이름과 일치하여야함
public class MyParent{
    private   int prv;     // 같은 클래스
              int dft;     // 같은 패키지 
    protected int prt;     // 같은 패키지 + 다른 패키지 자손
    public       int pub;  // 접근 제한 X 
    
    public void printMembers() {
        System.out.println(prv);
        System.out.println(dft);
        System.out.println(prt);
        System.out.println(pub);
    }
}
class MyParentTest {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyParent p = new MyParent();
        //System.out.println(p.prv);
        System.out.println(p.dft);
        System.out.println(p.prt);
        System.out.println(p.pub);
    }
 
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package pkg2;
 
import pkg1.MyParent;
 
class MyChild extends MyParent{   // MyParent 접근제어자가 default따라서 같은 패키지 안에서만 사용 가능 
    public void printMembers() {
//        System.out.println(prv);    // 에러 같은 클래스
//        System.out.println(dft);    // 같은 패키지 
        System.out.println(prt);
        System.out.println(pub);
    }
}
public class MyParentTest2 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyParent p = new MyParent();
//        System.out.println(p.prv);        // 에러 
//        System.out.println(p.dft);        // 에러 
//        System.out.println(p.prt);        // 에러 
        System.out.println(p.pub);
    }
 
}
 
 
cs
반응형

댓글