개인적으로 헷갈리는 것 중요한 것 위주로 정리해두고 연습문제를 풀어본 글입니다.
인스턴스 변수의 직접 접근을 허용하면 컴파일 중 오류가 발생할 수 있다.
이를 방지하기 위해 인스턴스 변수 앞에 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);
*/
}
}
'열혈 Java 프로그래밍' 카테고리의 다른 글
[윤성우의 열혈 Java 프로그래밍] Chapter 11 메소드 오버로딩, this, String 클래스 (0) | 2020.08.04 |
---|---|
[윤성우의 열혈 Java 프로그래밍] Chapter 10 클래스 변수, 클래스 메소드 (0) | 2020.08.03 |
[윤성우의 열혈 Java 프로그래밍] Chapter 08 ClassPath, Package (0) | 2020.07.30 |
[윤성우의 열혈 Java 프로그래밍] Chapter 07 클래스와 인스턴스 (0) | 2020.07.29 |
[윤성우의 열혈 Java 프로그래밍] Chapter 06 메소드 (0) | 2020.07.23 |