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
반응형