자바 기본 배우기 -캡슐화와 접근제한자 1편-

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;으로 바꾼다면..?

 

제목 없음.jpg

 

이렇게 왜 바꿀 수 있는걸까.?

 

그냥 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("음식을 먹는다.");
    }
}

 

객체의 속성, 행위를 하나로 묶어 실제 구현 내용 일부를 외부에 감추어 숨기는 것을 캡슐화라고 부름

 

제목 없음.jpg

 

name, age같이 중요한 부분을 숨겨서 외부에서 호출 못하고 읽기, 쓰기도 못하게 하고

 

다만 이를 변경시킬 수 있는 메소드는 노출 시켜서 간접적으로는 바꿀 수 있게 만들어두는 행위가 캡슐화

 

 

2. 접근제한자(access modifier)

 

클래스, 멤버 변수, 멤버 메소드 등의 선언부에서 접근 허용 범위를 지정하는 역할의 키워드

 

2-1) 종류

 

1) public: 모든 위치에서 접근 가능

 

2) protected: 같은 패키지에서는 접근 가능, 다른 패키지에서는 접근 불가능

 

하지만 다른 패키지에서 클래스와 상속관계가 있는 클래스는 접근 가능하다

 

3) (default): 접근제한자로 아무것도 안쓰면 default 접근 제한자

 

같은 패키지에서만 접근이 허용된다

 

4) private: 현재 자신 클래스에서만 접근이 허용된다

 

 

2-2) 사용가능한 접근 제한자

 

1) 최외부 클래스에서는 public과 default만 사용가능

 

이클립스로 클래스 만들었을때 자동으로 생성되는 껍질부분 말한다는데

 

제목 없음.jpg
이거 말하는듯

 

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

 

제목 없음.jpg

 

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으로 선언되어 있다

728x90