열혈 Java 프로그래밍

[윤성우의 열혈 Java 프로그래밍] Chapter 09 Access-level Modifiers(public, private 등), 캡슐화 Encapsulation

잉여진행중 2020. 7. 31. 21:46

개인적으로 헷갈리는 것 중요한 것 위주로 정리해두고 연습문제를 풀어본 글입니다.

 

인스턴스 변수의 직접 접근을 허용하면 컴파일 중 오류가 발생할 수 있다.

이를 방지하기 위해 인스턴스 변수 앞에 private 선언을 하여 정보은닉을 한다.

private 선언을 하면 클래스 내에서만 변수에 접근이 가능한데 다른 클래스에서 이 변수를 사용하려 할 때

Getter 게터, Setter 세터를 사용한다.

 

- Getter 게터 (aka 접근자)           - Setter 세터 (aka 설정자)

  값을 참조(값을 갖고 온다)            값을 설정(외부에서 변경)

ex) getName                               setName

 

- Access-level Modifiers 접근수준지시자

 

클래스를 정의할 때 public, default를 사용할 수 있다.

public class Study{ } : 어디서든 해당 클래스의 인스턴스를 생성할 수 있다.

default class Study{ } : 패키지로 묶인 클래스 내에서만 생성이 가능한다.

 

인스턴스 변수와 메소드를 대상으로 public, protected, private, default

public : 어디서든 접근 가능

protected : 패키지, 상속 받은 클래스까지 접근 허용

private : 클래스 내부에서만 (패키지 X)

default : 패키지로 묶인 클래스 내에서만

 

지시자 클래스 내부 동일 패키지 상속 받은 클래스 이외의 영역
private O X X X
default O O X X
protected O O O X
public O O O O

public > protected > default > private

 

- 캡슐화

코드를 실행할 때 관련 되는 것들을 하나의 클래스에 넣어두는 것

//캡슐화 X
class SinivelCap {
    void take() {
        System.out.println("콧물이 싹~ 납니다.");
    }
}

class SneezeCap {
    void take() {
        System.out.println("재채기가 멎습니다.");
    }
}

class SnuffleCap {
    void take() {
        System.out.println("코가 뻥 뚫립니다.");
    }
}

class ColdPatient {
    void takeSinivelCap(SinivelCap cap) {
        cap.take();
    }
    void takeSneezeCap(SneezeCap cap) {
        cap.take();
    }
    void takeSnuffleCap(SnuffleCap cap) {
        cap.take();
    }
}

class BadEncapsulation {
    public static void main(String[] args) {
        ColdPatient suf = new ColdPatient();

        suf.takeSinivelCap(new SinivelCap());
        suf.takeSneezeCap(new SneezeCap());
        suf.takeSnuffleCap(new SnuffleCap());
    }
}
//하나의 클래스로 캡슐화
class SinusCap { //여기에 집합!
    void sniTake() {
        System.out.println("콧물이 싹~ 납니다.22");
    }
    void sneTake() {
        System.out.println("재채기가 멎습니다.22");
    }
    void snuTake() {
        System.out.println("코가 뻥 뚫립니다.22");
    }

    void take() {
        sniTake();
        sneTake();
        snuTake();
    }
}

class ColdPatient { //takeSinus 하나로 간결해짐
    void takeSinus(SinusCap cap) {
        cap.take();
    }
}

class OneClassEncapsulation {
    public static void main(String[] args) {
        ColdPatient suf = new ColdPatient();
        suf.takeSinus(new SinusCap());
    }
} 
//포함관계로 캡슐화
//한 클래스가 다른 클래스의 인스턴스를 멤버로 가짐
class SinivelCap3 {
    void take() {
        System.out.println("콧물이 싹~ 납니다.333");
    }
}

class SneezeCap3 {
    void take() {
        System.out.println("재채기가 멎습니다.333");
    }
}

class SnuffleCap3 {
    void take() {
        System.out.println("코가 뻥 뚫립니다.333");
    }
}

class SinusCap3 {
    SinivelCap3 siCap = new SinivelCap3();
    SneezeCap3 szCap = new SneezeCap3();
    SnuffleCap3 sfCap = new SnuffleCap3();
 
    void take() {
        siCap.take(); szCap.take(); sfCap.take();
    }
}
    
class ColdPatient {
    void takeSinus(SinusCap3 cap) {
        cap.take();
    }
}

class CompEncapsulation { 
    public static void main(String[] args) {
        ColdPatient suf = new ColdPatient();
        suf.takeSinus(new SinusCap3());
    }
}

<문제 09-1.>

class Point { //주어진 클래스
    int xPos, yPos;
    public Point(int x, int y) { //원의 중심을 정의한다.
        xPos = x;
        yPos = y;
    }
    public void showPointInfo() {
        System.out.println("[" + xPos + ", " + yPos + "]");
    }
}

class Circle { 
    int radius; 
    Point center; 

    public Circle(int x, int y, int r) {
        center = new Point(x, y); //원의 중심 Point클래스
        radius = r; //반지름
    }

    public void showCircleInfo() {
        center.showPointInfo();
        //System.out.println("[" + xPos + ", " + yPos + "]");
        System.out.println("반지름 : " + radius);
    }
}

class ExCircle {
    public static void main(String[] args) {
        Circle c = new Circle(2, 2, 4); //참조변수 생성, 변수 설정

        c.showCircleInfo();
        /*
        center.showPointInfo();
        System.out.println("반지름 : " + radius);
        */
    }
}