티스토리 뷰

728x90

1. Data Class

- java

변수에 따른 Getter,Setter, 그리고 부가적인 toString(), hashCode(), equals() 함수들도 작성해야 한다. 

public final class UserInfo {
    private String name;
    private int age;
    
    public UserInfo(String name, int age) {
    	this.name = name;
        this.age = age;
    }
    
    /*
    Getter, Setter
    */
    
    public String toString() {
    	return "UserInfo(name =" + this.name + ", age=" + this.age + ")";
    }
    
    public int hashCode() {
    	return (this.name != null ? this.name.hashCode():0) * 31 + this.age;
    }
    
    public boolean equals(Object var1) {
    	if (obj == this) return true;
        if((obj instanceof UserInfo) == false) {
            return false;
        }
        UserInfo userInfo = (UserInfo) obj;
        return userInfo.name.equals(name) &&
            userInfo.age == age;
    }
}

 


- kotlin

data class UserInfo(var name: String?, var age: Int?)

일반 class의 경우, 생성자 변수의 Getter, Setter 함수는 만들어지지만, 부가적인 toString(), hashCode(), equals() 함수들은 생성되지 않는다.

이 경우, data class 선언을 하면 문제가 해결된다. 

 


2. Singleton

- java

<방법 1>

public class Eager {
    private static Eager instance = new Eager();
    
    private Eager() {}
    
    public static Eager getInstance() {
    	return instance;
    }
}  
  

<방법 2> - lazy initialization 

public class Lazy {
    private static Lazy instance = null;
    
    private Lazy() { }
    
    public static Lazy getInstance() {
    	if (instance == null) {
        	instance = new Lazy();
        }
        return instance;
    }
}    

이 코드는 thread로 실행 시에 Lazy()가 여러개 생성될 수 있다.

<방법 2-1> -  lazy initialization with thread safe

public class ThreadSfae {
    private static ThreadSafe instance = null;
    
    private ThreadSafe() {
    }
    
    public static ThreadSafe getInstance() {
    	if (instance != null) return instance;
        
        synchronized(ThreadSfae.class) {
        	if (instance == null) {
            	instance = new ThreadSafe();
            }
         }
         
         return instance;
    }
}

 

- kotlin

<방법 1> - object 사용

object Eager

but! 생성자는 가질 수 없다. (kotlin이 원래 그렇게 해놨어..)

<방법 2> - lazy

class Singleton {
   companion object {
         private val INSTANCE: Singleton by lazy {
     		Sigleton()
         }            
     
    	 @JvmStatic fun getInstance() = INSTANCE
     }
}

참고로 by lazy { ... }가 포함하는 코드는 정의된 프로퍼티가 사용되는 최초의 지점에서 초기화 과정을 실행합니다.

but 애도 생성자는 못가짐

<방법 3>

class Singleton private constructor(val name: String) {
    companion object {
    	@Volatile private var INSTANCE: singleton? = null
        
        fun getInstance(name: String): Singleton = 
        	INSTANCE ?: synchronized(this) {
            	INSTANCE ?: Singleton(name).also { INSTANCE = it }
            }
     }
}     

(위 코드는 Singleton 사용에 관한 Google Sample 코드이다.)

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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 27 28
29 30 31
글 보관함