'캡슐화'는 서로 멤버 필드의 여러 변수와 메서드 들을 묶어 하나의 객체로 나타내는 것을 의미합니다.따라서 캡슐화는 객체를 생성하기 위해서 필요한 구성요소에 대해 이해하셔야 합니다.
먼저 말씀드릴 구성요소는 '멤버 필드' 입니다.객체는 속성정보를 저장할 수 있어야 하는데 해당 역할을 수행하는 것이 '멤버 필드' 입니다.
class Student {
// 멤버 필드
// - 필드와 메서드는 반드시 클래스 바로 하위에만 작성해야 합니다
String name;
int age;
}
public class Velog {
public static void main(String[] args) {
// 해당 구역에 생성되는 변수는 지역변수 입니다
}
}
다음은 '멤버 메서드' 입니다.실생활에서도 객체를 생성하기 위해 설계도(클래스)와 재료(멤버 필드) 가 있다고 하더라도 도구(메서드) 없이는 생성할 수 없습니다.
class Student {
// 멤버 필드
// - 필드와 메서드는 반드시 클래스 바로 하위에만 작성해야 합니다
// - 멤버 필드는 함수 실행이 끝나도 객체가 남아있다면 데이터가 유지됩니다
String name;
int age;
void show() {
System.out.printf("이름은 %s이고, 나이는 %d살 입니다\n", name, age);
}
Student st1 = new Student();
st1.name = "이지은";
st1.age = 31;
st1.show();
// 메서드의 내용이 아무리 길어도 호출을 통하여 손쉽게 지시할 수 있다
Student st2 = new Student();
st2.name = "나단비"; // 멤버 필드는 객체마다 다른 속성을 저장할 수 있다
st2.age = 5;
st2.show();
}
'생성자'는 '객체'가 생성될 수 있도록 호출하는 독특한 역할을 수행하는 함수입니다.위에서 클래스를 설계도 에 멤버 필드를 재료, 메서드를 도구 로 설명드렸습니다.
class Product {
// 필드 (상품의 이름과 가격을 기재한다)
String name;
int price;
// 메서드 (상품정보를 간략히 출력하는 기능)
void show() {
System.out.printf("%s : %,d원\n", name, price);
}
}
public class Velog {
public static void main(String[] args) {
// 생성자는 클래스를 이용하여 객체를 생성할 때 호출하는 특수한 함수이다
p1.name = "아메리카노"; // 값을 전달하지 않고 생성했으니
p1.price = 2000; // 멤버 필드에 직접 값을 대입해야 한다
p1.show();
Product p2 = new Product("돌체라떼", 4000);
p2.show();
Product p3 = null;
p3.show();
<※ 결과는 다음과 같습니다.>
The constructor Product(String, int) is undefined해당 유형의 생성자를 찾을 수 없다는 구문입니다.
마지막 구성요소는 외부의 다른 객체와의 상호작용을 담당하는 '접근 제한자' 입니다.'접근 제한자'는 클래스에 작성된 멤버요소의 접근에 대하여 제한을 설정하는 키워드를 의미합니다.
private int n1 = 1;
int n2 = 2;
protected int n3 = 3;
public int n4 = 4;
// 메서드는 클래스 내부에서 수행되므로, private 이라도 접근하여 출력할 수 있다
void show() {
System.out.println("n1 : " + n1);
System.out.println("n2 : " + n2);
System.out.println("n3 : " + n3);
System.out.println("n4 : " + n4);
}
Test ob = new Test();
ob.show();
System.out.println("======================");
// The field Test.n1 is not visible
// 공개하지 않았기 때문에, 외부에서 볼 수 없다 (존재하지 않는다라고 하지 않고 보이지 않는다 라고함)
System.out.println("n1 : " + ob.n1);
System.out.println("n2 : " + ob.n2);
System.out.println("n3 : " + ob.n3);
System.out.println("n4 : " + ob.n4);
// private 필드의 값은 직접 참조할 수 없다
// 그러나, ob.show() 의 형태처럼[내부 메서드]를 통해서는 접근할 수 있다
<※ 결과는 다음과 같습니다.>