코드스테이츠_국비교육/[Section1]

13_객체지향 프로그래밍 심화(캡슐화)_22.09.06

생각없이 해도 생각보다 좋다. 2022. 9. 6. 14:49

학습 키워드

  • 캡슐화
  • 패키지의 개념
  • import문
  • 접근제어자
  • getter/setter 메서드

 

캡슐화

>의미

: 객체의 데이터(멤버)를 외부로부터 보호하는 것

>목적

  • 데이터 보호
  • 불필요한 외부 노출 방지

> 특징 및 장점

: 정보 은닉 및 정보 보호

: 오류 최소화

 

패키지

>의미

: 특정한 목적을 공유하는 클래스와 인터페이스의 묶음

: 물리적으로는 하나의 디렉토리를 의미

: 해당 디렉토리에 클래스 파일과 인테페이스 파일이 속해있음

//인터페이스는 추상화 부분 참고

>특징 및 장점

: 소스파일에 패키지를 선언하지 않으면 자동으로 unnamed package가 생긴다.
: 패키지를 지정하지 않은 모든 클래스는 같은 패키지(unnamed)에 속한다.
: unnamed package는 다른 패키지에서 import할 수 없다.
: 디렉토리의 계층 구조(경로)는 점( . )으로 구분한다.
: 클래스의 충돌을 방지한다. (다른 패키지면 같은 클래스 명이어도 충돌하지 않음)

>선언

: 한 소스 파일에 단 한 번 가능

: 맨 첫 문장에 패키지 선언을 한다.

>import문

: 다른 패키지를 사용할 때 편의를 주는 구문

: 해당 경로의 패키지의 클래스를 사용할 때, 클래스 명 앞에 패키지 경로를 자동으로 붙여줌.

: 실행 시간에는 영향이 없고, 컴파일 시간에 영향을 줌.

>코드 예시1; import 미사용

package exampack1;
//예시1. import를 사용하지 않았을 경우, 완전 불편
public class Main_Ex1 {
    public void pack1T(){
        System.out.println("테스트1");
    }
}
package exampack2;
//패키지 경로를 포함한 클래스 참조형과 생성자를 매번 작성해야함.
public class Main_Ex2 {
    public static void main(String[] args) {
        exampack1.Main printTest1 = new exampack1.Main();
        printTest1.pack1T();
        /*
        테스트1
        */
    }
}

>코드 예시2; import 사용

package exampack1;
//예시2. 예시1의 exampack1 과 변한게 없음.
public class Main_Ex1 {
    public void pack1T(){
        System.out.println("테스트1");
    }
}
package exampack2;
import exampack1.Main_Ex1;
//import를 통해 모든 경로를 쓰지 않음.
//import exampack1.*; 도 가능함.
//*을 사용할 경우, 해당 패키지의 모든 클래스를 사용할 수 있음.
public class Main_Ex2 {
    public static void main(String[] args) {
        Main_Ex1 printTest1 = new Main_Ex1();
        printTest1.pack1T();
        /*
        테스트1
        */
    }
}

접근 제어자

>의미

: 제어자 중 접근성에 관련된 정보를 제공하는 제어자

>제어자

: 부가적인 의미를 부여하는 키워드

>제어자 구분

  • 접근 제어자

: 접근 제어자는 딱 하나만 사용 가능

: public, protected, default, private

//default는 아무 제어자가 없는 경우를 의미

  • 기타 제어자

: 여러 기타 제어자를 동시에 사용 가능

: static, final, abstract

>접근 제어자의 제한 범위

  • public : 접근 제한 없음
  • protected : 동일 패키지와 상속 관계의 하위 클래스에서 접근 가능하다.
  • default : 동일 패키지 내에서만 가능
  • private : 같은 클래스 내에서만 가능

그림 01. 접근 제어자 표

getter와 setter 메서드

>의미

: 정해진 메서드가 아닌 개발자가 캡슐화를 위해 설정하는 메서드

>사용

: 클래스 내부 필드가 private으로 설정되어 있는 경우에 사용

: getter 메서드와 setter 메서드의 접근 제어자는 해당 메서드를 사용할 수 있는 접근 제어자로 설정해야한다.

>setter 메서드

: setter 메서드로 private으로 설정된 인스턴스 변수의 값을 수정할 수 있음.

//생성자와 비슷하지만, 생성자는 매번 새로운 인스턴스를 만들어야함.

>getter 메서드

: getter 메서드로 private으로 설정된 인스턴스 변수의 값을 반환할 수 있음.

>메서드명 관례

  • get+필드명
  • set+필드명

>코드 예시

public class Main {
    public static void main(String[] args) {
        Bread br1 = new Bread("붕어빵", "슈크림");
        Bread br2 = new Bread("피자빵", "소세지");
        /*
        빵 생성
        빵 생성
        */
        System.out.print(br1.getStuff());
        System.out.println(br1.getType());
        System.out.print(br2.getStuff());
        System.out.println(br2.getType());
        /*
        슈크림붕어빵
        소세지피자빵
        */
        br1.setStuff("팥");
        br2.setStuff("치즈");
        System.out.print(br1.getStuff());
        System.out.println(br1.getType());
        System.out.print(br2.getStuff());
        System.out.println(br2.getType());
        /*
        팥붕어빵
        치즈피자빵
        */
    }
}

class Bread{
    private String type; // 빵 종류 저장 변수
    private String stuff; // 재료 종류 저장 변수
    //빵 생성자(빵 종류, 재료 종류 초기화
    Bread(String type, String stuff){
        this.type = type;
        this.stuff = stuff;
        System.out.println("빵 생성");
    }
    //빵 종류 setter
    public void setType(String type){
        this.type = type;
    }
    //재료 종류 setter
    public void setStuff(String stuff){
        this.stuff = stuff;
    }
    //빵 종류 getter
    public String getType(){
        return type;
    }
    //재료 종류 getter
    public String getStuff(){
        return stuff;
    }
}