들어가기 전, 조각 지식
- 객체(사전적 의미)
: 객체는 변수, 데이터 구조, 함수, 메서드가 될 수 있으며 식별자가 참조하는 메모리의 값이다. 그리고 객체는 클래스를 기반으로 생성된다.
- 의존한다.
: A클래스가 실행하는 것에 있어서 B클래스의 메소드가 필요하다 -> A는 B에 의존한다.
1
2
3
4
5
6
7
8
class A {
public int head() {...}
}
class B {
public int face(head h) {...}
public A face() {...}
}
위에서 class A 는 class B의 존재도 모르고 B가 바뀐다고 하여도, 변경사항이 없다. class B는 class A가 변경될경우, 로직이 변경되어야 한다 -> class B가 A를 의존하고 있다.
객체란
: 어떤 기능을 제공하는가? 기능을 제공하는 단위.(사용하는 입장에서)
그렇기에, 메소드(메소드명, parameter, return 값)를 이용해서 기능을 명세한다.
즉, 기능을 사용한다 == 메소드를 호출한다.
기능을 호출하면서 객체들이 엮인다. 메세지: 객체 간의 상호 작용
아래와 같이 기능이 없고 단순히 getter,setter만 있으면 data class 라고 칭한다.
1
2
3
4
5
6
@Getter
@Setter
public class Student {
private Long id;
private String name;
}
캡슐화(정보 은닉)
: class에 주요한 로직을 넣어서 외부로부터 은닉한다. -> 외부의 영향 없이 내부 구현을 변경하기 위해서
- 변화에 따라 로직을 변경해야하는 상황이 발생한다.
- 캡슐화를 하는 과정에서 기능에 대한 이해가 커짐(기능에 대해 이해해야 기능을 캡슐화할수있음)
- 캡슐화를 잘하면 수정사항으로 인한 연쇄적인 수정을 최소화할 수 있다. (한 군데 수정만으로)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Getter
@Setter
public class Student {
private Long id;
private String name;
/**
* 학생인지 판단하는 로직
*/
public boolean isStudent() {
if (this.student == student) {
return true;
}
return false;
}
}
- 규칙 1) data를 가지고 와서 하는게 아니라, 메소드로 감싸기
- 규칙 2) 여러 메소드를 연속해서 나열하지 않고 특정메소드 하나로 캡슐화한다.
- 메소드에서 생성한 객체의 메소드만 호출
- 파라미터로 받은 객체의 메소드만 호출
- 필드로 참조하는 객체의 메소드만 호출
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 규칙1
public String findAdult() {
if(member.getAge() > 20) {
return adult;
} else {
return student;
}
}
// 상단의 조건문을 아래와 같이 캡슐화
public String findAdult() {
if(AdultOrNot()) {
return adult;
} else {
return student;
}
}
//member class 안에서 구현
public Boolean AdultOrNot() {
if (member.getAge > 20) {
return true;
}
return false;
}
1
2
3
4
5
6
// 규칙2 Demeter’s Law
Date birth = member.getBirthDate();
birth.isAfter(now);
member.getBirthDate().isAfter(now)
-> member.isPassed(now) // 위의 메소드를 isPassed로 캡술화한다.
출처: 최범균, “객체 지향 프로그래밍 입문”, 인프런