자바 기본 배우기 -캡슐화와 접근제한자 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;으로 바꾼다면..?

 

 

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

 

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

TAGS.

Comments