[SEB BE] Section 1. 캡슐화

박두팔이·2022년 12월 29일
0

자바

목록 보기
10/26

캡슐화란?

속성과 기능을 하나로 감싸 외부로부터 데이터를 보호하고 내부적으로만 사용되는 데이터를 외부로 노출시키지 않도록 하는 것을 의미한다.

  • 캡슐화의 가장 큰 장점은 정보 은닉이다.
  • 속성과 기능을 외부로부터 변경할 수 없도록 데이터를 보호한다.
  • 만일 변경되었다 하더라도 다른 객체에 영향을 주지 않도록 하는 독립성을 확보할 수 있다.
  • 캡슐화를 수행하기위한 수단으로는 접근제어자와 getter/setter메서드가 있다.
  • 접근제어자를 이해하기 위해서는 패키지에 대한 개념이 선행되어야 한다.

패키지란?

패키지란 목적이 같은 클래스와 인터페이스의 묶음이다. 클래스들을 그룹단위로 묶어 패키지로 관리하면 효과적으로 클래스들을 관리할 수 있다.

자바에서 패키지는 물리적인 하나의 디렉토리이며, 하나의 패키지에 속한 클래스나 인터페이스파일은 모두 해당 패키지속에 있다. 이 디렉토리는 계층구조를 가지고 있어 (.)으로 표현한다.

Import문

다른 패키지 내의 클래스를 사용하기 위해선 소스파일 상단의 패키지 구문과 클래스문 사이에 작성한다.

import문은 다른 패키지내의 클래스를 사용하기 위해 사용한다. 사전에 컴파일러에게 소스파일에 사용된 클래스에 대한 정보를 제공하여 이러한 번거로움을 덜어준다.

package practicepack.test2; // import문을 사용하지 않는 경우, 다른 패키지 클래스 사용방법

public class PackageImp {
		public static void main(String[] args) {
			practicepack.test.ExampleImport example = new practicepack.test.ExampleImport();
		}
}

import문을 사용하지 않는 경우 new 생성자의 이름이 길어진 것을 확인할 수 있다.

import 문법

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 동일 클래스

코드를 통해 이해하기

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

getter/setter()

캡슐화를 통하여 외부에서 내부데이터를 변경하려는 시도를 접근제어자를 통해 제어하였다. 그런데 데이터의 변경이 필요한 상황이 생겼다 그럴땐 어떻게 할 수 있을까?

대표적으로 private 접근제어자가 포함되어 있는 객체에 접근하여 데이터를 추가하거나 수정하고 싶은경우가 있다. 이럴 때 getter/setter()를 사용할 수 있다.

setter 메서드는 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 해주고 일반적으로 메서드명에 set-을 붙여서 정의한다.
getter 메서드는 이렇게 설정한 변수 값을 읽어오는데 사용하는 메서드다. 메서드명에 get-을 붙여서 정의한다.

 public class GetterSetterTest {
    public static void main(String[] args) {
        Worker w = new Worker(); // Worker 인스턴스 생성
        w.setName("김코딩"); // w객체의 Name을 "김코딩"으로 변경
        
        String name = w.getName(); // 현재클래스 name을 getName()으로 읽어옴
        System.out.println("근로자의 이름은 " + name);
	}
}  

class Worker {
    private String name; // 변수의 은닉화. 외부로부터 접근 불가
    private int age;
    private int id;

    public String getName() { // 멤버변수의 값 
        return name;
    }

    public void setName(String name) { // 멤버변수의 값 변경
        this.name = name;
    }   
        
        
        
profile
기억을 위한 기록 :>

0개의 댓글