2018-2-26 TIL package and capsulation

패키지(Package)

  • 클래스패스 : 자바 가상머신이 클래스 파일을 찾는 경로
  • 패키지는 클래스를 묶는 수단이다.

  • 하나의 소스파일에는 public으로 선언된 클래스의 정의를 하나만 둘 수 있다.
  • 소스파일의 이름은 public으로 선언된 클래스의 이름과 동일해야 한다.

이름 충돌의 해결을 위한 패키지의 효과

  • 패키지 선언은 클래스의 접근방법을 구분할 뿐만 아니라 클래스 파일이 공간적으로 구분되게 한다.
  1. 클래스 접근 방법의 구분 : 서로 다른 패키지의 두 클래스는 인스턴스 생성 시 사용하는 이름이 다르다.
  2. 클래스의 공간적인 구분 : 서로 다른 패키지의 두 클래스 파일은 저장되는 위치가 다르다.

캡슐화

  • 자바에서 말하는 ‘정보’는 클래스의 ‘인스턴스 변수’를 의미한다. 정보를 은닉한다는 것은 인스턴스 변수를 숨긴다는 것이다.
package yoon;

class Circle {
    double rad = 0; // radius of circle
    final double PI = 3.14;

    public Circle(double r){
        setRad(r);
    }

    public void setRad(double r) {
        if (r < 0){
            rad = 0;
            return;
        } else {
            rad = r;
        }

    }

    public double getArea(){
        return (rad * rad) * PI;
    }
}

public class UnsafeCircle {
    public static void main(String [] args){
        Circle c = new Circle(1.5);
        System.out.println(c.getArea());

        c.setRad(2.5);
        System.out.println(c.getArea());

        c.setRad(-3.3);
        System.out.println(c.getArea());
        c.rad = -4.5; // 문제가 되는 부분
        System.out.println(c.getArea());
    }
}
//result
7.065
19.625
0.0
63.585

// 위와 같이 설정을 하면 c.rad = -4.5;처럼 옳지않은 접근을 따르게 된다.
  • 인스턴스 변수의 직접적인 접근을 허용하면, 컴파일 과정에서 문제가 생성이 될 수 있다. 위와같은 문제를 해결하기 위해 private을 이용한 ‘정보은닉’이 필요하다.
package yoon;

public class InfoHideCircle {
    public static void main(String [] args){
        Circle c = new Circle(1.5);
        System.out.println("반지름 : " + c.getRad());
        System.out.println("넓이 : " + c.getArea());

        c.setRad(3.4);
        System.out.println("반지름 : " + c.getRad());
        System.out.println("넓이 : " + c.getArea());
    }
}

//result
반지름 : 1.5
넓이 : 7.065
반지름 : 3.4
넓이 : 36.2984
  • 클래스 Circle에서 인스턴스변수를 private double rad = 0;으로 선언을 했다. 이는 클래스 내부 접근만 허용한다.
  • 인스턴스변수 rad를 private라 선언했으니, 두 메소드 setRad(설정메소드), getRad(참조메소드)를 정의해야한다.

  • 게터(Getter) : 인스턴스 변수의 값을 참조하는 용도로 정의된 메소드
  • 세터(Setter) : 인스턴스 변수의 값을 설정하는 용도로 정의된 메소드

오늘의 느낀점

  • 평상시에 pobi한테 리팩토링과 메소드분리, 간결화에 대해서 많은 이야기를 들었다. 오늘 공부를 하면서, 그것이 캡슐화와 관련이 있고, 객체지향에서 추구하는 방향이라는 것을 조금?은 느끼게 되고 생각이라는 것을 하게되었다.
Written on February 26, 2018