[Kotlin] data class

Kotlin|2019. 9. 9. 18:10

자바에서는 모델 혹은 DTO 혹은 Entity 클래스들을 만들때 

툴에 getter setter 을 자동으로 만들어주는 기능이나 롬복을 활용하여

해당 노가다를 줄이곤 했습니다.

 

코틀린에서는 data class가 존재하여 해당 부분에 코드를 간편히 생성할수 있도록 제공하고 있었습니다.

 

일단 data 클래스에서 제공하는 것은 

 

1. 모든 필드 기반 hashCode & equals 자동 구현

2. 모든 필드 기반 toString 자동구현

3. getter 대신 compoentN() // N은 필드순, 1 부터

4. copy(필드들), (args를 해당 객체를 받지 않고 필드들을 받아서 거의 생성자느낌에 구현이..)

 

들을 지원합니다.

 

Emp 클래스에 empno와 ename 이 있다고 했을때

자바로 Emp 클래스를 만들면

public class Emp {
	private Integer empno;
	private String ename;
	public Integer getEmpno() {
		return empno;
	}
	public void setEmpno(Integer empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((empno == null) ? 0 : empno.hashCode());
		result = prime * result + ((ename == null) ? 0 : ename.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Emp other = (Emp) obj;
		if (empno == null) {
			if (other.empno != null)
				return false;
		} else if (!empno.equals(other.empno))
			return false;
		if (ename == null) {
			if (other.ename != null)
				return false;
		} else if (!ename.equals(other.ename))
			return false;
		return true;
	}
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Emp [empno=").append(empno).append(", ename=").append(ename).append("]");
		return builder.toString();
	}

}

이렇게 장황한 코드가

 

코틀린으로는

data class Emp(
	var empno: Int?,
	var ename: String
) {
	constructor() : this(null,"")
}

 

이렇게 간단한 코드가 됩니다.

 

개발시 모델 변경이 자주 발생한다면 더더욱 큰 차이라고 볼수 있고

 

"나는 모델 변경이 거의 없는데?" 라고 하더라도

이슈로 모델코드를 자바코드를 봤을때 절대적으로 라인 코드가 길기 때문에

혹시 잘못 구현한 hashCode()나 null처리 등 체크하는것만으로도 낭비 시간들이 발생할수 있을것으로 생각됩니다.

(물론 자바를 사용하더라도 롬복을 쓰면 차이가 없지만요^^;;)

 

댓글()