WY J
학습 공간
WY J
  • 분류 전체보기 (95)
    • Java (38)
      • 알고리즘 (5)
      • 자료구조 (4)
      • 기초 (9)
      • OOP (10)
      • Collection (3)
      • Effective (5)
      • reator (2)
    • HTML&CSS (5)
    • macOS (3)
    • Git (5)
    • Network (5)
    • MySQL (2)
    • Spring Boot (31)
      • Core (5)
      • MVC (15)
      • Security (10)
    • 알고리즘 (1)
    • Cloud (3)
      • AWS (3)
    • Docker (1)
    • Project (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

hELLO · Designed By 정상우.
WY J

학습 공간

캡슐화(Encapsulation)
Java/OOP

캡슐화(Encapsulation)

2022. 7. 11. 16:22

 

 

캡슐화(Encapsulation)

  • 객체의 필드, 메소드를 하나로 묶어 실제 구현 내용을 외부에 감추는 것이다.
  • 객체 제공자와 이용자를 정확하게 나누며, 데이터의 직접 접근을 제한하므로 정보 은폐, 보안 등의 장점을 가진다.
  • 자바에서는 캡슐화된 멤버를 접근제어자를 사용하여 노출시킬지 숨길지 결정할 수 있다.

패키지(package)

  • 특정한 목적을 공유하는 클래스와 인터페이스들을 그룹 단위로 묶어 효과적으로 관리하기 위한 목적
  • 패키지는 하나의 디렉토리이고, 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지에 속해있다.
  • 패키지가 있는 경우 첫 번째 줄에 package 패키지명이 표시되어야 하고, 패키지 선언이 없으면 이름없는 패키지에 속하게 된다.
  • 같은 이름의 클래스가 있더라도 각각 다른 패키지에 소속되어 있다면, 이름명으로 인한 충돌이 발생하지 않는다.

예를 들면, 우리가 주로 사용하는 String 클래스의 실제 이름은 java.lang.String인데, 여기서 java.lang은 패키지명을 나타내고 점(.)을 사용하여 디렉터리 계층구조를 나타내고 있다.

 

Import문

  • 다른 패키지 내의 클래스를 사용하기 위해 사용하며, 일반적으로 패키지 구문과 클래스문 사이에 작성
  • import문 없이 다른 패키지의 클래스를 사용하기 위해서는 매번 패키지명을 붙여 주어야 하는데, import문을 사용하면 사전에 컴파일러에게 소스파일에 사용된 클래스에 대한 정보를 제공하여 이러한 번거로움을 덜어준다.
package practicepack.test;

public class ExampleImp {
		public int a = 10;
		public void print() {
			System.out.println("Import문 테스트")
}

// import 패키지명.클래스명; 또는 import 패키지명.*;

package practicepack.test2; // import문을 사용하는 경우

import practicepack.test.ExampleImp // import문 작성

public class PackageImp {
		public static void main(String[] args) {
			ExampleImp x = new ExampleImp(); // 이제 패키지명을 생략 가능
		}
}

제어자(Modifier)

  • 제어자는 클래스, 필드, 메소드, 생성자 등에 부가적인 의미를 부여하는 키워드를 의미
  • 제어자는 크게 접근 제어자와 기타 제어자로 구분 할 수 있다.
  • 각 대상에 대해서 접근 제어자는 단 한번만 사용할 수 있다.
접근 제어자 public, protected, (default), private
기타 제어자 static, final, abstract, native, transient, synchronized 등

 

접근 제어자(Access Modifier)

  • 클래스 외부로의 불필요한 데이터 노출을 방지(data hiding)할 수 있고, 외부로부터 데이터가 임의로 변경되지 않도록 막을 수 있다.
  • public(접근 제한 없음) > protected(동일 패키지 + 하위클래스) > default(동일 패키지) > private(동일 클래스) 순서

 

예시

package package1; // 패키지명 package1 

//파일명: Parent.java
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; // a,b,c,d에 각각 private, default, protected, public 접근제어자 지정
    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);
    }
}

// 출력값
2
3
4

 

다른 패키지에서 사용할 때

package package2; // package2 

//파일명 Test2.java
import package1.Parent; //다른 패키지 내의 클래스를 사용

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);
    }
}

public 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);
    }
}

'Java > OOP' 카테고리의 다른 글

추상화(Abstraction)  (0) 2022.07.12
다형성(Polymorphism)  (0) 2022.07.12
상속(Inheritance)  (0) 2022.07.11
내부 클래스(Inner Class)  (0) 2022.07.08
생성자(Constructor)  (0) 2022.07.08
    'Java/OOP' 카테고리의 다른 글
    • 추상화(Abstraction)
    • 다형성(Polymorphism)
    • 상속(Inheritance)
    • 내부 클래스(Inner Class)
    WY J
    WY J

    티스토리툴바