IT 정보/Java
[Java] 객체지향 프로그래밍 (2) - 캡슐화편
개발하는 동그리
2022. 5. 12. 16:26
728x90
반응형
캡슐화란!?
특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
캡슐화하는 목적
- 데이터 보호의 목적
- 내부적으로 사용하는 데이터의 불필요한 외부 노출 방지
- 외부로부터 속성과 기능의 접근과 변경을 금지
- 데이터가 변경되더라도 다른 객체에 영향을 주지 않도록 독립성을 가짐
- 유지보수와 코드 확장시에 오류범위를 최소화할 수 있어서 효과적으로 유지 보수할 수 있음
핵심적인 수단으로 접근 제어자를 통해 캡슐화를 진행하게 된다.
패키지란!?
목적을 공유하는 클래스와 인터페이스의 묶음
- 소스코드의 첫번째 줄이 반드시 'package 패키지명' 이 표시돼야 한다.
- 패키지 선언이 없으면 이름없는 패키지에 속하게 된다.
자바에서는 기본적으로 포함되어 있는 대표적인 패키지
- java.lang : 자바의 기본 클래스 모음
- java.util : 확장 클래스를 모아놓은 모음
- java.io & java.nio : 자바의 입출력과 관련된 클래스 모음
예를 들면 우리가 주로 사용하는 String 클래스의 실제 이름은 java.lang.String이다.
여기서 앞부분 java.lang 은 패키지 명으로. 사용해서 계층구조를 나타내고 있다.
패키지의 장점
- 같은 클래스의 이름이라도 다른 패키지에 있으면 충돌을 방지할 수 있다. (특히 규모가 큰 프로젝트에서 많이 발생)
- 접근 제어자의 범위를 설정하는데 있어서 패키지가 이용된다.
Import 문
import 문은 다른 패키지의 클래스를 사용하기 위해 사용
매번 패키지명을 포함해서 작성해야 하지만, Import 문을 사용해서 컴파일러에게 소스파일에 사용된 패키지에 대한 정보를 제공하여 편하게 다른 패키지의 클래스를 사용할 수 있다.
package testPackage.test2;
import testPackage.test1.TestClass // test1 패키지에 TestClass 클래스에 접근할 때
import testPackage.test1.* // test1 패키지내에 여러개 클래스에 접근할 때
public class TestClass2 {
public static void main(String[] args) {
TestClass apple = new TestClass(); //
}
}
제어자
자바에서 제어자는 클래스 필드 메서드 생성자 등에 부가적인 의미를 부여하는 키워드다.
- 접근 제어자 : public, protected, (defalut), private
- 기타 제어자 : static, final, abstract, native, transient, synchronized
접근 제어자 접근 제한 범위
접근 제어자 | 접근 제한 범위 |
private | 동일 클래스에서만 사용 가능 |
default | 동일 패키지 내에서만 사용 가능 |
protected | 동일 패키지 + 다른 패키지의 하위 클래스에서 접근가능 |
public | 접근 제한 없음 |
package package1; // package1
class Test { // Test 클래스의 접근 제어자는 default
public static void main(String[] args) {
Parent p = new Parent();
// System.out.println(p.a); // 동일 클래스가 아니기 때문에 에러발생!
System.out.println(p.b);
System.out.println(p.c);
System.out.println(p.d);
}
}
public class Parent { // Parent 클래스의 접근 제어자는 public
private int a = 1;
int b = 2;
protected int c = 3;
public int d = 4;
public void printEach() { // 동일 클래스이기 때문에 에러발생하지 않음
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
//----------------------------------------------------------------------------------
package package2; // package2
import package1.Parent;
public class Child extends package1.Parent { // package1으로부터 Parent 클래스를 상속
public void printEach() {
// System.out.println(a); // 에러 발생!
// System.out.println(b);
System.out.println(c); // 다른 패키지의 하위 클래스
System.out.println(d);
}
}
class Test2 {
public static void main(String[] args) {
Parent p = new Parent();
// System.out.println(p.a); // public을 제외한 모든 호출 에러!
// System.out.println(p.b);
// System.out.println(p.c);
System.out.println(p.d);
}
}
728x90
반응형