안녕하세요~ 

이번 시간에는 접근제한자의 종류와 개념 및 역할에 대해 알아보려고 하는데요. 활용 예시를 함께 살펴볼까요?

모든 접근제한자를 활용하는 코드

package day11;

public class Study {

	private int a = 10;
	protected int b = 20;

	public void setA(int n){
        a = n;
    }
    public int getA(){
        return a;
    }
    
    protected void run() {
    	a++;
    }
    
    void print() {
    	System.out.println(a);
    }
}


package day11_2;

import day11.Study;

public class Study2{
	
	public Study2() {
		run();
	}
	
	protected Study2(int c) {
		b = c;
	}
	
}

 

package day11;

import day11_2.Study2;

public class Main {
    public static void main(String[] args) {
    	Study s = new Study();
    	System.out.println(s.a);
    	s.run();
    	s.print();
    	
    	Study2 s2 = new Study2();
    	s2.run();
    	s2.print();
    }
}

접근제한자의 4가지 종류를 모두 사용한 코드인데 뭐가 부족한지 문제가 많네요. 같이 해결해볼까요?

오늘의 핵심 키워드 

1.  public은 아무 제약없이 사용 가능하다. 또한 클래스, 생성자, 변수, 메소드 모두 사용한다.

2. private은 오직 같은 클래스에서만 사용 가능하다.  클래스를 제외한 생성자, 변수, 메소드에서 사용한다.

3. default는 접근제한자를 사용하지 않았을 때 자동으로 적용되는 기본값으로 같은 패키지 내에서 사용 가능하다. 클래스, 생성자, 변수, 메소드 모두 사용한다.

4. protected는 같은 패키지, 또는 상속 관계일 때 자식 클래스에서 사용 가능하다. 클래스를 제외한 생성자, 변수, 메소드에서 사용한다.

  Main 클래스에서 Study 클래스와 Study2 클래스 객체를 생성하고 각각 메소드를 사용해보려고 합니다.

*첫번째 오류 = s.a

Study 클래스에 있는 a 변수는 'private'으로 선언이 되어 Study 클래스 내에서만 사용 가능하기 때문에 대신 'public'으로 선언한 setA( ) 메소드와 getA( ) 메소드를 사용하여 a 변수를 다룰 수 있습니다.

*두번째 오류 = s2.run( ), s2.print( )

Study2 클래스는 Main 클래스와 패키지가 다르기 때문에 'protected'로 선언된 run( ) 메소드와 'default'로 선언된 print( ) 메소드는 같은 패키지 내에서만 사용 가능하기 때문에 Main 클래스에서는 사용 불가합니다.

 Study2 클래스에서 run() 메소드와 변수 b를 사용하고자 합니다.

*첫번째 오류 = run( )

Study 클래스에 있는 run() 메소드는 'protected'으로 선언되어 같은 패키지 또는 상속 관계에 있는 자식 클래스에서 사용 가능하기 때문에 다른 패키지에 속하는 Study2 클래스는  Study 클래스를 상속받아 해결합니다.

*두번째 오류 = b

마찬가지로 Study 클래스에서 'protected'로 선언된 변수 b는 Study 클래스를 상속받으면 해결됩니다.


모든 오류를 해결하고 알아보기 쉽게 문구를 추가하여 실행한 모습입니다.

최종 완성본

package day11;

public class Study {

	private int a = 10;
	protected int b = 20;

	public void setA(int n){
        a = n;
    }
    public int getA(){
        return a;
    }
    
    protected void run() {
    	System.out.println("run메소드 실행!");
    	a++;
    }
    
    void print() {
    	System.out.println("print메소드 실행 a : "+a);
    }
}


package day11;

import day11_2.Study2;

public class Main {
    public static void main(String[] args) {
    	Study s = new Study();
    	System.out.println("바꾸기 전 a : "+s.getA());
    	s.setA(20);
    	System.out.println("바꾸기 전 a : "+s.getA());
    	s.run();
    	s.print();
    	
    	Study2 s2 = new Study2();
    	
    }
}


package day11_2;

import day11.Study;

public class Study2 extends Study{
	
	public Study2() {
		run();
		System.out.println("Study2 기본 생성자 실행");
	}
	
	protected Study2(int c) {
		b = c;
	}
	
}
꼭 봐야되는 마지막 꿀팁!
  •  다른 곳에서 자주 사용하는 클래스, 생성자, 변수, 메소드에는 public 사용하기!
  • 개발자만 알아도 되는 민감한 정보(데이터)부분은 private으로 선언을 하고 따로 public으로 메소드를 선언하여 사용하기!

▲영상으로 한번 더 복습하세요 :)