본문 바로가기

개발일지/Java + Spring

[Java] 접근 제한자, final 예약어

 

접근제한자

변수, 메소드, 생성자, 클래스 등의 자원을 어떤 범위까지 접근가능한가 지정하는 예약어이다. 

 

private 해당 클래스 내에서만 접근이 가능. 손상을 막기 위해 다른 사람이 함부로 할 수 없다. (캡슐화)
default 접근제한자를 지정하지 않을 경우 붙는다. 기본적으로 같은 패키지 내에서만 접근이 가능하다.
protected 같은 패키지 내에서는 접근이 허용되고, 다른 패키지에서도 자식클래스에서는 접근이 가능하다.
public 모든 영역에서 접근이 가능. 다른 패키지에서도 접근이 가능하다.

 

package Private2;

public class PrivateData {
	private int privateVar = 10;
}

 

클래스는 public, 하지만 변수 앞에는 private로 지정이 되었다.

 

package Private2;

public class PrivateAccess {

	public static void main(String[] args) {
		PrivateData pd = new PrivateData();
//		System.out.println(pd.privateVar);
	}

}

 

접근 제한자가 private라면 변수 선언한 클래스(PrivateData) 안에서만 사용할 수 있기 때문에 에러가 뜬다.

 

 


final 예약어 

package Private2;

public class Main {

	public static void main(String[] args) {
		final int number = 10;
		//number = 5; 
		System.out.println(number);
	}

}

 

final이 붙으면 변경이 불가능하다. 주로 상수를 정의할 때 변수 앞에 사용이 되고, 위에서는 생략이 됐지만 PI, MAX 처럼 대문자로 정의를 한다. final 앞에 static 예약어가 오지 않으면 해당 객체에서만 공유가 된다. 변수 뿐만 아니라 메소드와 클래스 앞에도 붙을 수 있는데 method 앞에 붙으면 오버라이딩을 할 수 없다. class 앞에 오면 상속할 수 없다. File 앞에 오면 파일 수정을 할 수 없다.

 

 


private 사용 방법

 

[Java] private, get-set 메소드 쉽게 생성하기(상속)

접근제한자를 배우진 않았지만 그 전에 각 변수에 private 지정하는 법과 get,set 메소드를 통해 해당 변수에 쉽게 접근하는 방법을 배워보겠다. 이런 형태를 캡슐화 라고 한다. 한 눈에 보기에 복잡

choittolbok.tistory.com

private 접근제한자 사용시 get-set과 변수 초기화 쉽게 하는 법이 나와있어서 참고하기에 좋다.

 

package Test;

public class Parent {
	private String house;
	private String money;
	
	public String getHouse() {
		return house;
	}
	public void setHouse(String house) {
		this.house = house;
	}
	public String getMoney() {
		return money;
	}
	public void setMoney(String money) {
		this.money = money;
	}
	public Parent(String house, String money) {
		super();
		this.house = house;
		this.money = money;
	}
	public void show() {
		System.out.println("부모는 " + getHouse() + "와(과) " + getMoney() + "을(를) 소유하고 있습니다.");
	}
}

 

여기서 직접 손으로 써야 하는 부분은 마지막 show() 메소드이다. 자동으로 불러오기 하면 끝!

 

package Test;

public class Child extends Parent {
	private String car;
	private String ship;
	public String getCar() {
		return car;
	}
	public void setCar(String car) {
		this.car = car;
	}
	public String getShip() {
		return ship;
	}
	public void setShip(String ship) {
		this.ship = ship;
	}
	
	public Child(String house, String money, String car, String ship) {
		super(house, money);
		this.car = car;
		this.ship = ship;
	}
	public void show() {
		System.out.println("자녀는 " + getCar() + "와 " +getShip()+"를(을) 소유하고 있습니다.");
	}	
}

 

Parents를 상속 받은 Child 클래스 마찬가지로 private 접근제한자를 사용했다. 

 

package Test;

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String house; String money; String car; String ship;
		
		System.out.print("부모 집 ? ");
		house = sc.next();
		System.out.print("부모 돈 ? ");
		money = sc.next();
		System.out.print("나의 차 ? ");
		car = sc.next();
		System.out.print("나의 배 ? ");
		ship = sc.next();
		
		Child ch = new Child(house, money, car, ship);
		Parent pr = new Parent(house, money);
		ch.show();
		pr.show();
		sc.close();
	}
}