캡슐화
특정 객체 안에 관련된 속성, 기능을 하나의 캡슐로 만들어서
데이터를 외부로부터 보호하는 것
사용 이유 ?
데이터 보호가 가장 큰 목적이고
내부적으로 사용되는 데이터에 대한 불필요한 외부 노출을 방지하기 위함일 것이다
이걸 수행하기 위해 핵심적인 접근 제어자를 중점으로 다룰 필요가 있다
그보다 전에 자바 패키지에 대한 내용을 먼저 다뤄야 한다
패키지
특정 목적을 공유하는 클래스와 인터페이스의 묶음
인터페이스는 나중에 자세히 배워보도록 하고 일단 넘어간다
클래스들을 그룹 단위로 묶어서 효과적으로 관리하기 위한 목적을 가지고 있다
물리적인 디렉토리라고도 말할 수 있으면서 계층구조를 가지고 있는데
계층구조 구분은 점(.) 으로 표현된다
패키지가 있는 경우에 소드 코드 첫 줄에 반드시 package 패키지명 이 표시되어야 하고
패키지 선언이 없으면 이름없는 패키지에 속하게 된다
자바에 기본적으로 포함되어 있는 대표적인 패키지로 자바 기본 클래스들을 모아놓은 java.lang,
확장 클래스를 묶어 놓은 java.util, 자바 입출력 클래스 모아놓은 java.io , java.nio 등이 있다
String 클래스의 실제 이름은 java.lang.String , java.lang이 패키지명이고 점을 사용해서 디렉토리 계층구조를 나타낸다
이렇게 패키지로 클래스를 묶어놓으면
같은 클래스의 이름을 가지고 있더라도 다른 패키지에 포함되어 있으면
협업 할 때 같은 클래스를 사용하게 된다고 해도 구별이 가능해서 충돌을 방지할 수 있다
규모가 큰 프로젝트에선 클래스명 중복이 빈번하게 발생할 수 있는데 이걸 효과적으로 방지할 수 있다
import 문
다른 패키지 내의 클래스를 사용하기 위해 사용하고 패키지 구문과 클래스문 사이에 작성한다
본래, 코드를 작성할 때 다른 패키지의 클래스를 사용하기 위해서는 매번 패키지명을 붙여서 작성해야 할테지만
import 문은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공해서 번거로움을 줄여준다
제어자 (Modifier)
자바에서 제어자라는건 클래스, 필드, 메소드, 생성자 같은 것에 부가적인 의미를 부여해주는 키워드다
접근 제어자와 기타 제어자로 구분 할 수 있고
다음과 같은 것들이 있다
접근 제어자 public, protected, (default), private
기타 제어자 static, final, abstract, native, transient, synchronized 등
제어자는 하나의 대상에 대해 여러 제어자를 사용할 수 있지만
각 대상에 대한 접근 제어자는 딱 한 번만 사용할 수 있다
기타 제어자는 static, final, abstract 이 주로 사용되니까 이거 중심으로 공부를 해보자
접근 제어자 (Access Modifier)
캡슐화를 구현하기 위해 핵심적인 방법, 접근 제어자
접근 제어자 접근 제한 범위
private | 동일 클래스에서만 접근 가능 |
default | 동일 패키지 내에서만 접근 가능 |
protected | 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능 |
public | 접근 제한 없음 |
제한 범위는 public > protected > default > private 순으로 정리할 수 있다
자바 클래스는 private 멤버로 정보를 숨기고 public 멤버로 사용자, 프로그램간 인터페이스를 구축한다
protected 멤버는 보통 상위클래스에 대해 public 멤버처럼 취급되고 외부에선 private 멤버 취급된다
쉽게말하면 같은 패키지 끼리 접근이 가능하며 경우에 따라
protected 멤버, 이 클래스를 상속 받은 하위 클래스의 멤버일 경우에 접근이 가능하다
default 의 경우는 아무런 접근 제어자를 붙이지 않는 것을 의미한다
그러니 변수명 앞에 접근 제어자가 없으면 그건 자동으로 default가 된다
public은 전체공개라고 생각하면 된다
getter / setter
데이터 보호, 은닉의 목적으로 접근 제어자를 사용하는 자바에서
이러한 캡슐화 목적을 달성하면서도
데이터의 변경이 필요할 경우에는 어떻게 해야 하는가?
예시로, private 접근 제어자가 포함된 객체 변수 데이터 값을 추가하거나 수정하고 싶을 때는 어떻게 해야 하는 가?
그럴 때 getter와 setter 메소드를 사용한다
setter 메소드는 외부에서 메소드에 접근해 조건에 맞을 경우, 데이터 값을 변경 가능하게 해준다
일반적으로 메소드명에 set- 을 붙여 정의한다
private 필드는 직접 접근하는 것이 불가능하기 때문에
객체는 입력 값을 setter 메소드의 매개 값으로 넘겨준 다음
그 값을 검사하고나서 적절할 경우에만 저장하게 되는 개념이다
그러니까,
어떤 class에 private 접근제어자를 사용해서 변수를 지정했는데 이 값을 다른 클래스에서 수정을 하고 싶으면
getter setter 메소드를 작성해두고 그 다른 클래스에 가서 이 메소드를 가져오면 수정이 가능하다 라는 개념인 것이다
package Student_Person;
public class Student extends Person {
private String studentID;
private int grade;
private double GPA;
public String getStudentID() {
return studentID;
}
public void setStudentID(String studentID) {
this.studentID = studentID;
}
public double getGPA(){
return GPA;
}
public void setGPA(double GPA){
this.GPA = GPA;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public class Person {
private String name;
private int age;
private int height;
private int weight;
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;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public class Main_studentPerson {
public static void main(String[] args) {
Student student = new Student();
student.setStudentID("jp");
student.setAge(28);
student.setGPA(3.2);
student.setGrade(2);
System.out.println(student.getStudentID());
System.out.println(student.getAge());
System.out.println(student.getGPA());
System.out.println(student.getGrade());
}
}
private로 선언된 것들을 다른 클래스에서 변경하거나 가져오는 것을 알 수 있다
'Java' 카테고리의 다른 글
[Java OOP 심화] 다형성(Polymorphism) (0) | 2022.05.29 |
---|---|
[Java OOP 심화] 추상화 (Abstract) (0) | 2022.05.29 |
[Java OOP 심화] 상속( Inheritance) (0) | 2022.05.25 |
[Java OOP 기초] 생성자 (0) | 2022.05.25 |
[Java OOP 기초] 필드와 메소드 (0) | 2022.05.25 |
댓글