1. 캡슐화(encapsulation)
Person이라는 클래스가 다음과 같이 정의되어있다
public class Person {
public String name;
public int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void eat() {
System.out.println("음식을 먹는다.");
}
}
내가 인자를 받는 생성자 Person을 정의했기때문에, JVM은 기본 생성자를 제공하지 않는다
그러므로 Person의 인스턴스를 정의할때 인자를 주지 않으면 만들수없다
//에러
Person p = new Person();
//가능
Person p = new Person("김태연",28);
아무튼 내가 김태연이라는 28살의 인스턴스 p를 만들었는데 해커가 접근해서 p.age = 60;으로 바꾸거나 p.age = 3;으로 바꾼다면..?

이렇게 왜 바꿀 수 있는걸까.?
그냥 p의 age 속성에 p.age로 쉽게 접근할 수 있으니까..
이렇게 마음대로 바꾸지 못하게 할려면.? 접근하지 못하게 만들면 된다
클래스에서 public String name; public int age;라고 정의된 인스턴스 변수를 보면
public class Person {
public String name;
public int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void eat() {
System.out.println("음식을 먹는다.");
}
}
public은 누구나 접근할 수 있다는 뜻으로.. private으로 바꾼다면 누구나 쉽게 접근하지 못하게 된다
이를 접근제한자라고 부름
public class Person {
//접근제한자 변경
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void eat() {
System.out.println("음식을 먹는다.");
}
}
객체의 속성, 행위를 하나로 묶어 실제 구현 내용 일부를 외부에 감추어 숨기는 것을 캡슐화라고 부름

name, age같이 중요한 부분을 숨겨서 외부에서 호출 못하고 읽기, 쓰기도 못하게 하고
다만 이를 변경시킬 수 있는 메소드는 노출 시켜서 간접적으로는 바꿀 수 있게 만들어두는 행위가 캡슐화
2. 접근제한자(access modifier)
클래스, 멤버 변수, 멤버 메소드 등의 선언부에서 접근 허용 범위를 지정하는 역할의 키워드
2-1) 종류
1) public: 모든 위치에서 접근 가능
2) protected: 같은 패키지에서는 접근 가능, 다른 패키지에서는 접근 불가능
하지만 다른 패키지에서 클래스와 상속관계가 있는 클래스는 접근 가능하다
3) (default): 접근제한자로 아무것도 안쓰면 default 접근 제한자
같은 패키지에서만 접근이 허용된다
4) private: 현재 자신 클래스에서만 접근이 허용된다
2-2) 사용가능한 접근 제한자
1) 최외부 클래스에서는 public과 default만 사용가능
이클립스로 클래스 만들었을때 자동으로 생성되는 껍질부분 말한다는데

2) 하지만 내부 클래스, 멤버 변수(필드), 메소드는 4가지 접근제한자 모두 사용가능

2-3)
접근제한자 말고도 활동제한자 이런것도 있다
public static void main... 할때 이 static부분
여기서 static: 클래스 레벨의 요소를 설정
final: 요소를 더 이상 수정할 수 없게 만든다
abstract: 추상 메소드 및 추상 클래스를 작성
뭔소리여 이건..
3. 접근자(getter)와 설정자(setter)
클래스에서 선언된 변수 중 접근제한에 의해 접근할 수 없는 변수의 경우 다른 클래스에서 접근할 수 없기때문에
접근하기 위한 메소드인 설정자와 접근자를 public으로 선언하여 사용한다
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
여기서 name이랑 age가 private으로 선언되어있고
이를 다른데서 접근하거나 수정할 수 있는 getName, setName, getAge, setAge 등은 public으로 선언되어 있다
'프로그래밍 > Java' 카테고리의 다른 글
자바 기본 배우기 -패키지와 import- (0) | 2023.02.14 |
---|---|
자바 기본 배우기 -생성자란 무엇인가- (0) | 2023.02.13 |
자바 기본 배우기 -메소드와 JVM의 메모리 구조- (0) | 2023.02.12 |
자바 기본 배우기 -변수에 대해- (0) | 2023.02.11 |
자바 기본 배우기 -자바에서 함수와 클래스 기본- (0) | 2023.02.08 |