b

java답게 쓰지 않기 getter setter 본문

카테고리 없음

java답게 쓰지 않기 getter setter

dev.bistro 2019. 7. 3. 22:00

Java 에 대한 고민은 예전부터 있어왔는데, 특히 '쓸데 없이 많은 코드'가  많은거에 대한 것. 
처음 자바를 배웠을 때는 아래와 같은 private member, getter, setter이 당연한 것이었다. 

public class Seller {
    private Integer no;
    private String name;

    public Integer getNo() { return no; }

    public void setNo(Integer no) { this.no = no; }

    public String getName() { return name; }

    public void setName(String name) { this.name = name; }
}

이후 lombok 등이 등장함에 따라

@Data
public class Seller {
    private Integer no;
    private String name;
}

처럼 간편하게 사용 할 수 있었지만, 타이핑을 줄여주는 것 이상 장점은 보여지지 않았다.  

이후에는 변하지 않는 Seller.no 와 Seller.name 의 set method를 선언하지 않는 아래의 방식을 선호한다.

@Getter
public class Seller {
	public Seller(Integer no, String name) {
        this.no = no;
        this.name = name;
    }
    private Integer no;
    private String name;
}

 

여기에서 Getter는 필요한가? 라는 의문이 든다.

public class Seller {
    
    public Seller(Integer no, String name) {
        this.no = no;
        this.name = name;
    }

    public final Integer no;
    public final String name;
    
}

이런 형태로 사용 할 수 없을까? 

getter  / setter 가 반드시 필요한 경우가 있다.   목적이 분명한  데이터 검증등에서는 반드시 필요하고 이견이 없다.
하지만 짧지 않은 경력에서 본 대부분의 getter setter는 데이터를 넣고 빼는 단 한줄의 동작이 대부분이었다. 

    public String getDisplayName() {
        return (isBlank(getDisplayName())) ? this.name : this.displayName;
    }

    public void setDisplayName(String displayName) {
        if(equalsAnyIgnoreCase(displayName, this.name) throw exception
    }
//    setter getter가 추가적인 작업을 한다면 인정

 

setter 역시 아래처럼 공감할 수 없는 형태로 사용하는 코드가 많이 보였다.

public void transform(List<Seller> sellers){
        sellers.stream().map( seller -> {
            seller.setBlocked(true);
            return seller;
        });
    }  
// (peak를 사용하는걸 말하고자 하는게 아니다) 
// Seller를 가지고 setBlock을 호출한다음
// 다시 return seller 하는 이러한 형태를 공감 할 수 없기 때문이기도 하다.

 

물론 Java 세계에서의 CoC가 존재하고, 많은 프레임웍들이  디폴트생성자를 사용하기 때문에 원하는대로의 사용은 어려울 것이다.

10살즈음에 벽돌깨기나, 전화번호부를 만들어 쓴것도 코딩이라면 코딩을 시작한지 대략 30년 즈음된것 같다.   그 동안 많은 언어를 해보거나 공부를 했는데 Java 처럼  getter/ setter 가 없으면  코드리뷰에서 Unlike를 받는 언어가 있나? 생각해보면 잘 떠오르지 않는다.

파이선은 @property로 처리할 수 있지만, 자바처럼 강제되지 않는다
자바스크립트에서 `#`가 Node12+ / Chrome7x등에서 구현되었다고 하지만, 아직은 현실적이지 않다. Javascript에서도  getName , setName을 사용을 하지만 다른 니즈에 의해서 function을  추가한거지 this._name 자체를 직접 접근하지 못하는 것도 아니다. (좀 더 복잡하게 하면 어떻게는 this.name에 접근을 못 하게 할 수는 있지만...)

public class Seller {
    public Integer no;
    public String name;
}
// 라는 코드를 Java 개발자와 아닌 개발자가 보는 온도차이는 얼마나 될까?

scala는 말할 필요도 없이 class  자체가 이뮤터블이 기본이고 case calss를 자주 사용한다..
kotlin 초기 버전은 lateinit var 형태로 이상하게 사용했는데  최근 버전에서는 lazy 가 추가됨으로 좀 더 나아졌다고 하고 얘 역시 data calss가 존재한다.

혼자 일하는 것도 아니고, 내가 만든 코드 딴 사람이 봐야하고, 딴사람이 짠 코드 내가 봐야하는 경우가 많다. 이러한 형태의 getter , setter 은 계속되겠지만, 왜 이거 계속 선언하고 있는지에 대한 고민은 계속 될 듯 -ㅇ-;

 

 

 

 

Comments