Study Java

접근제한자

SangJune238 2025. 1. 16. 17:26

접근제한자는 말 그대로 접근을 제한하기 위해 사용된다. 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 필드나 메서드를 사용하지 못하도록 막아야 되는 경우가 있다. 이를 위해서 해당 구조에 접근할 수 잇는 범위를 설정해주는 것이 접근제한자이다.

 

접근 제한자는 public, protected, default, private로 4가지가 있다.

  • public : 단어 뜻 그대로 어디서든(동일 패키지, 외부 패키지 모두) 접근 가능하다.  클래스와 필드, 메서드에 사용 가능
  • protected : 같은 패키지 또는 다른 패키지인 경우 상속관계에 있을 때만 접근 가능하다. 필드와 메서드에 사용 가능
  • default : 같은 패키지에서만 접근 가능하다. 클래스와 필드, 메서드에 사용 가능
  • private : 오직 해당 클래스에서만 접근 가능하다. 외부에 접근을 막아 데이터를 의도에 맞게 사용할 수 있게 만든다. 필드와 메서드에 사용가능

 

클래스 접근 제한

클래스를 선언할 때 해당 클래스를 같은 패키지에서만 사용할 것인지, 다른 패키지에서도 사용가능하도록 할 것인지를 결정해야 한다. 클래스에서는 public, default 접근 제한자를 사용가능하다.

class 클래스명 { //default 접근 제한자
}

public class 클래스명 { //public 접근 제한자
}

 

클래스를 선언할 때 public을 생략하면 default 접근 제한을 가지게 됩니다. public 접근 제한을 사용하면 같은 패키지 뿐만 아니라 다른 패키지에서도 아무런 제한 없이 클래스를 사용할 수 있게 됩니다.

 

필드와 메서드 접근 제한

필드와 메서드를 선언할 때 해당 필드와 메서드를 클래스 내부에서만 사용할 것인지, 패키지 내에서만 사용할 것인지, 아니면 다른 패키지에서도 사용할 수 있도록 할 것인지를 결정해야 한다. 필드와 메서드에서는 public, default, private, protected 접근 제한자를 사용가능 합니다.

//필드 선언
[ public | protected | private ] [ static ] 타입 필드명;

//메서드 선언
[ public | protected | private ] [ static ] 리턴타입 메서드(...) {
}

 

  • default 접근 제한 : 필드와 메서드를 선언할 때도 접근 제한자를 생략하면 default 접근 제한을 가지게 됩니다. default 접근 제한은 패키지에서는 아무런 제한 없이 필드와 메서들 사용할 수 있으나 다른 패키지에서는 default접근 제한한 필드나 메서드를 사용할 수 없도록 제한합니다.
  • public 접근 제한 : public 접근 제한은 모든 패키지에서 아무런 제한 없이 필드와 메서드를 사용할 수 있도록 합니다.
  • protected 접근 제한 : protected 접근 제한은 default 접근 제한과 마찬가지로 같은 패키지에 속하는 클래스에서 필드와 메서드를 사용할 수 있도록 합니다. 하지만 다른 패키지에 속한 클래스가 protected 접근 제한한 클래스의 자식 클래스이면 필드와 메서드를 사용할 수 있습니다. 즉, 상속관계에 있으면 사용가능합니다.
  • private 접근 제한 : private 접근 제한은 클래스 내부에서만 사용 가능합니다.

 

 

학생 3명의 국어 점수, 수학 점수, 영어 점수를 가지고 평균 75점이고 국어점수와 영어점수가 각각 60점 이상이면 합격, 미만이면 불합격을 출력하도록 만들어 보겠습니다.

package z.practice.object.ex3;


//이름, 평균합격컷, 국어최저점수, 영어최저점수
public class University {
	
	String name;
	int evgCut;
	int koCut;
	int enCut;
	
	public University() {
		super();
	}
    
	public University(String name, int evgCut, int koCut, int enCut) {
		super();
		this.name = name;
		this.evgCut = evgCut;
		this.koCut = koCut;
		this.enCut = enCut;
	}
	
	//지원한뒤 합격이면 true / 불합격이면 fasle 리턴
	public void apply(Student st) {
		if(st.getAvg() >= this.evgCut && st.enScore >= this.enCut && st.koScore >= this.koCut) {
			System.out.println(st.name + "님 합격입니다.");
		} else {
			System.out.println(st.name + "님 불합격입니다.");
		}
	}
		public void apply(String name, double avg, double enScore, double koScore) {
			if(avg >= this.evgCut && enScore >= this.enCut && koScore >= this.koCut) {
				System.out.println(name + "님 합격입니다.");
			} else {
				System.out.println(name + "님 불합격입니다.");
			}
	}
}
package z.practice.object.ex3;

public class Student {

//이름, 나이, 수학, 영어, 국어점수를 가지고있는 학생 클래스
	//필드
	String name; //이름
	int age; //나이
	double mathScore; //수학점수
	double enScore; //영어점수
	double koScore; //국어점수
	
	//생성자
	//객체를 초기화해주기 위한 특수목적 메서드
	//개발자가 생성해주지 않으면 기능이 없는 디폴트 생성자가 컴파일 과정에서 생성됨.
	//생성자는 class와 이름이 동일하다.
	//반환형이 존재하지 않는다.
	//alt+shift+s 단축키 이용가능
	public Student() {
		super();
	}
	
	//생성자도 메서드 오버로딩이 가능하다.
	//생성자는 alt + shift + s -> o
	public Student(String name, int age, double mathScore, double enScore, double koScore) {
		super();
		this.name = name;
		this.age = age;
		this.mathScore = mathScore;
		this.enScore = enScore;
		this.koScore = koScore;
	}

	//메서드
	public void myInfo(){ //내 정보를 출력하는 기능
		int age = 20;
		System.out.println("안녕하세요. 저는 " + this.age + "살의 " + name + "입니다.");
		
	}
	public double getAvg() {
		return (this.enScore + this.koScore + this.mathScore)/3.0;
	}
}
package z.practice.object.ex3;

import java.util.Scanner;

public class Run {
	public static void main(String[] args) {
		//choi 객체 생성 최지원, 15살, 수학 : 80,  영어 : 60, 국어 : 90
		//kim 객체 생성 김민수, 17살,  수학 : 60, 영어 : 75, 국어 : 70
		//park 객체 생성 박지민, 19살,  수학 : 90, 영어 : 45, 국어 : 85
		
		Student choi = new Student("최지민", 15, 80, 60, 90);
		Student kim = new Student("김민수", 17, 60, 75, 70);
		Student park = new Student("박지민", 19, 90, 45, 85);
		
		//각 학생의 평균을 구하세요
		double choiAvg = (choi.enScore + choi.koScore + choi.mathScore)/3.0;
		double kimAvg = (kim.enScore + kim.koScore + kim.mathScore)/3.0;
		double parkAvg = (park.enScore + park.koScore + park.mathScore)/3.0;
		

		double choiAvg2 = choi.getAvg();
		double kimAvg2 = kim.getAvg();
		double parkAvg2 = park.getAvg();
		
		choi.myInfo();
		kim.myInfo();
		park.myInfo();
		
		System.out.println(choi.name + "의 평균 : " + choiAvg);
		System.out.println(kim.name + "의 평균 : " + kimAvg);
		System.out.println(park.name + "의 평균 : " + parkAvg);
		System.out.println("=========================================");
		System.out.println(choi.name + "의 평균 : " + choiAvg2);
		System.out.println(kim.name + "의 평균 : " + kimAvg2);
		System.out.println(park.name + "의 평균 : " + parkAvg2);
		System.out.println("=========================================");
		
		//lee라는 객체를 만들 것이다.
		//사용자로부터 이름, 나이, 영어점수, 수학점수, 국어점수를 입력받아
		//평균을 구해서 출력하는 프로그램
		Scanner sc = new Scanner(System.in);
		
		String name;
		int age;
		double mathScore, koScore, enScore;
		
		System.out.print("이름 : ");
		name = sc.next();
		System.out.print("나이 : ");
		age = sc.nextInt();
		System.out.print("수학 점수 : ");
		mathScore = sc.nextDouble();
		System.out.print("영어 점수 : ");
		enScore = sc.nextDouble();
		System.out.print("국어 점수 : ");
		koScore = sc.nextDouble();
		
		Student lee = new Student(name, age, mathScore, enScore, koScore);
		
		double leeAvg = (lee.mathScore + lee.koScore + lee.enScore)/3.0;
		System.out.println(lee.name + "의 평균 : " + leeAvg);
		System.out.println("=========================================");

		//kh대학교 evgcut : 75, encut : 60, kocut : 60
		University kh = new University("kh대학교", 75, 60, 60);
		
		kh.apply(lee);
		kh.apply(park);
		kh.apply(kim);
		kh.apply(choi);
		
		System.out.println("=========================================");
		kh.apply(lee.name, lee.getAvg(), lee.enScore, lee.koScore);
		kh.apply(park.name, park.getAvg(), park.enScore, park.koScore);
		kh.apply(kim.name, kim.getAvg(), kim.enScore, kim.koScore);
		kh.apply(choi.name, choi.getAvg(), choi.enScore, choi.koScore);
		
	}
}

'Study Java' 카테고리의 다른 글

메서드, 클래스  (3) 2025.01.15
형변환과 배열  (6) 2025.01.14
Java 프로젝트 생성  (2) 2025.01.07
Java, eclipse 설치  (5) 2025.01.07