-
Notifications
You must be signed in to change notification settings - Fork 0
객체지향 생활 체조 규칙
if(num < 0){
println("negative number")
return
}
println("positive number")
java)
void sell(int price);
//아래와 같이 바꾼다.
void sell(Money price);
class Money{
private int value;
Money(int value){
this.value = value;
}
}
kotlin)
fun sell(price:Int)
fun sell(price:Money)
class Money(value:Int){
private var value:Int = value
}
위와 같이 사용함으로 해당 객체에 의미를 부여할 수 있다.
또한
java)
class PositiveNum{
private int num;
PositiveNum(int num){
if(num < 0){
throw new IllegalException();
}
this.num = num
}
}
kotlin)
class PositiveNum(num:Int){
var positiveNumber:Int = 0
init{
if(num < 0){
throw IllegalException("It`s not Positive Number")
}
this.positiveNumber = num
}
}
위와 같이 의미 부여된 객체에 제약 조건을 줄 수 있다.
이러한 방법을 통해 PositiveNumber 객체를 만들어 양수를 보장할 수 있어 추가적인 예외처리를 하지 않아도 된다.
Demeter의 법칙을 지키자.
한 줄에는 점을 하나만 찍는다.
myService.getInstance()
.requestToMyAPI()
축약어는 절대 사용하지 않는다. 모든 변수와 함수 명은 해당 역할을 명확하게
간단하게 아래와 같이 사용하는 것을 의미한다.
다음과 같은 코드를
Map<String, String> tagList = new HashMap<>();
map.put("1","A tag");
map.put("2","B tag");
아래와 같이 감싸서 사용하는 것을 말한다.
public class TagList{
private Map<String, String> tagList;
public TagList(Map<String,String> tagList){
this.tagList = tagList
}
}
자세한 내용은 추후 공부를 통해 추가할 예정.
해당 사항이 필요할 경우는 목적이 분명한 데이터 검증이 있을 경우 사용한다.
그외는 getter,setter,property 대신 객체에 일을 해달라는 메시지를 보낸다.
굳이 예를 들자면
"A+10을 실행해야해, A 값을 줘!"
위의 경우 보다는 아래와 같이
"A에 10을 더해줘"
A.getValue + 10 (X)
A.add(10)
이렇게 사용함으로 데이터를 은닉할 수 있다고 한다.
객체는 내부 데이터 구현을 노출하면 안된다. 접근 메소드와 수정 메소드는 내부 데이터와 구현을 노출시키므로 유지 보수에 악영향을 미치고, 가능한 사용하지 않는다.
필드를 private으로 하고 get/set 메소드의 추가는 코드를 복잡하게 하고 아무런 이득이 없다
객체들 간의 관계를 세심히 디자인하면 대부분 클래스의 get,set 메소드는 필요하지 않다.
구현 은닉이 제대로 되어 있는가? 즉, 클래스의 구현 방식을 마음대로 바꾸어도 외부에 영향을 미치지 않는가?
어떠한 작업을 수행하는데 필요한 정보를 요구하지 말라. 대신 정보를 가진 객체에 일을 해달라 부탁해라.
두 자동차의 연식을 비교하여 출력해야하는 예시가 있다고 하면 다음과 같은 느낌이다.
java)
class Car implements Comparable<Car> {
private String modelName;
private int modelYear;
Car(String modelName, int modelYear, String color) {
this.modelName = modelName;
this.modelYear = modelYear;
}
public String getModel() {
return this.modelYear + "식 " + this.modelName;
}
public int compareTo(Car otherCar) {
if (this.modelYear == otherCar.modelYear) {
return 0;
} else if(this.modelYear < otherCar.modelYear) {
return -1;
} else {
return 1;
}
}
}
public class Comparable01 {
public static void main(String[] args) {
Car car01 = new Car("아반떼", 2016, "노란색");
Car car02 = new Car("소나타", 2010, "흰색");
System.out.println(car01.compareTo(car02));
}
}
kotlin)
class Car(
val modelName:String,
val modelYear:Int,
): Comparable<Car>{
fun getModle():String{
return "$modelYame 식 $modelName"
}
override fun comparTo(otherCar:Car):Int{
return when{
this.modelYear == otherCar.modelYear -> 0
this.modelYear < otherCar.modelYear -> -1
else -> 1
}
}
}
class Comparable01 {
fun main(args: Array<String>) {
val car1 = Car("아반떼", 2016)
val car2 = Car("소나타", 2010)
println(car1.comparTo(car2))
}
}