티스토리 뷰
포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.
자바에는 접근제한자라는 것이 있다.
접근제한자가 무엇일까?
객체 내 요소(필드, 메서드) 혹은 객체 자체에 접근을 제한하기 위해 사용하는 것이다.
그러면 이러한 접근 제한자가 필요한 이유가 무엇일까?
그전에 접근제한자에 대해 설명하기 전에 먼저 캡슐화에 대해 아주 간단히 알아보자
캡슐화(Encapsulation) : 기능, 데이터를 묶어 외부에서의 접근을 제어하는 것
자 그러면 캡슐화랑 접근제한자랑의 무슨 연관이 있는 것일까?
바로 자바의 접근 제한자의 존재로 캡슐화가 완전해지기 때문이다.
어떻게?
예시를 통해 이해해 보자.
public class BankAccout {
private int balance; // 돈
public BankAccout() { // 생성자
this.balance = 0;
}
public void deposit(int amount) { // 입금
if(isAmountValid(amount)) {
balance += amount;
} else{
System.out.println("유효하지 않은 금액입니다.");
}
}
public void withdraw(int amount){ // 출금
if (isAmountValid(amount) && balance - amount >= 0){
balance -= amount;
} else{
System.out.println("유효하지 않은 금액이거나 잔액이 부족합니다.");
}
}
public int getBalance(){ // 잔액 조회
return balance;
}
public boolean isAmountValid(int amount){ // 입력값 유효성 검사
// 금액이 0보다 커야함
return amount > 0 ;
}
}
위 코드에서 우리는 계좌 객체를 만들었다.
BankAccount Class이며, balance라는 이름을 가진 int 타입의 멤버변수가 있다. (돈)
계좌 객체는 돈을 다루며 돈은 아주 민감한 데이터이다.
아래와 같은 코드로 해당 객체를 생성해 이용해 보자.
public class BankAccountMain {
public static void main(String[] args) {
BankAccout accout = new BankAccout();
accout.deposit(20000); // 입금
accout.withdraw(10000); // 출금
System.out.println("잔액 = " + accout.getBalance());
}
}
실행 결과
메서드 호출을 통해 20000원을 입금하였고, 10000원을 출금하였다.
마지막으로 남은 잔액 10000원을 출력하였다.
위 과정은 모두 Account 객체가 가진 메서드호출을 통해 Account 멤버변수의 값에 접근하였다.
이렇게 정상적으로만 이용이 된다면 사실상 문제는 없을 것이다.
다만 위 코드가 조금 더 복잡하며, 개발이 미숙한 새로운 개발자가 들어와서 해당 코드를 수정해야 하는 일이 생겼다고 가정해 보자.
만약 Account 객체에서 balance 멤버변수에 접근제한자 private가 없었다면?
아래와 같은 코드가 정상실행 된다.
public class BankAccountMain {
public static void main(String[] args) {
BankAccout accout = new BankAccout();
accout.balance = 1000000000;
System.out.println("잔액 : " + accout.getBalance());
}
}
실행 결과
Account 객체에 있는 멤버변수에 직접 접근하여 수정할 수 있게 되었다.
이런 의도치 않은 접근을 막기 위해 접근제한자가 필요한 것이다.
이것이 접근제한자 존재의 이유이며 캡슐화와 관련이 있는 이유이다.
자 이제 접근제한자의 종류와 기능에 대해 알아보자.
접근제한자 | 설명 | 접근 가능 범위 |
public | 모든 클래스에서 접근 가능 | 같은 패키지 내의 클래스 및 다른 패키지의 클래스 |
protected | 같은 패키지 내의 클래스와 상속관계 | 같은 패키지 내의 클래스 및 상속 관계 |
default (private package) | (접근 제한자를 명시하지 않은 경우 기본값) 같은 패키지 내에서만 접근 가능 | 같은 패키지 내의 클래스 |
private | 해당 클래스 내에서만 접근 가능 | 해당 클래스 내의 코드만 접근 가능 |
접근제한자는 총 4가지로 구성되어 있다.
접근이 가능한 범위 순은 public > protected > default(private package) > private 순이다.
접근제한자에 대한 팁을 알아보자.
TIP
1. 지역 변수에는 private, public 이 사용 불가하다.
2. private은 같은 클래스 내에서 접근 가능하지만 public 메서드에서 private 필드값, 메서드를 컨트롤하면 외부에서 public 메서드 호출을 통해 private 멤버변수에 접근이 가능하다.
3. 생성자에도 접근제어자 사용이 가능하며, 메서드와 적용 범위가 같다.
4. Class 접근 제어자는 public, default 만 가능하다.
5. public Class는 반드시 자바 파일과 이름이 같아야만 한다.
아마 2번 팁이 한 번에 이해가 되지 않을 수 있다.
아까 Account 객체를 다시 떠올려보자.
외부에서 입금 메서드를 호출하여 Account 멤버 변수 값에 접근하였지 않았는가?
그 말이다.
즉 고정관념을 깨기 위한 설명이었다.
단순히 private으로 접근제한이 걸려있어도 내부 메소드를 통해 값을 수정할 수 있으니 이 부분을 상기하자
또한 캡슐화(Encapsulation)에 대해 조금만 더 간단히 알아보자
캡슐화를 할 때 2가지를 중점으로 설계하면 된다.
1. 데이터를 숨겨라
2. 기능을 숨겨라
데이터를 숨기는 건 이해가 되는데, 기능을 숨기는게 이해가 되지 않을 수 있다.
모든 기능을 숨기라는 것이 아니라, 외부에서 반드시 접근이 필요한 기능을 제외한 다른 기능을 숨기라는 뜻이다.
마찬가지로 Account Class를 통해 예시를 들어보자
public boolean isAmountValid(int amount){ // 입력값 유효성 검사
// 금액이 0보다 커야함
return amount > 0 ;
이러한 메소드가 있다.
이 값은 사용자의 입력값이 유효한지 검증하는 코드 부분이다.
따라서 외부에서 이 메서드를 굳이 호출할 필요가 없는 기능이다.
이러한 기능을 숨기라는 뜻이다.
끝
'기술스택 > 자바(Spring)' 카테고리의 다른 글
자바 static (1) | 2025.02.08 |
---|---|
자바 메모리 구조 - 메서드, 스택, 힙 영역 (2) | 2025.02.08 |
자바 NullPointException (1) | 2025.02.05 |
자바 기본 형/참조 형 (+Garbage Collection) (0) | 2025.02.05 |
자바 클래스(static)와 인스턴스(non-static) 접근 가능 방향 (1) | 2025.02.05 |
- Total
- Today
- Yesterday
- 프로그래머스
- ys.k
- los 15단계
- 프로그래머스 상품을 구매한 회원 비율 구하기 파이썬
- 스프링
- 김영한 실전 자바 중급
- Los
- 코딩테스트 준비
- 김영한 실전 자바 기본
- 상품을 구매한 회원 비율 구하기 파이썬
- 백준
- 기술스택
- 김영한
- extends
- java
- 김영한 실전 자바 기초
- zixem
- 프로그래머스 상품을 구매한 회원 비율 구하기
- 상속
- lord of sql
- samron
- 백준 피보나치 수열
- 백준 피보나치
- webhacking.kr
- static
- 코딩테스트
- los 15
- 자바
- samron3
- spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |