티스토리 뷰

챌린지반 3주차 세션 과제

 

과제 1

 

과제 내용

 요구사항에 맞춰 디자인 패턴 2개를 구현한다. 

 

 

Singleton 패턴

object Logger{
    fun log(message: String){
        println("log: $message")
    }
}

fun main() {
    Logger.log("Hello, World")
}

Object로 Logger 클래스를 선언하여 싱글톤 패턴을 구현한다.

해당 클래스는 시스템 전체에서 단 하나의 인스턴스만 존재하게 된다.

 

클래스.메소드 형식으로 오브젝트의 메소드를 호출할 수 있다.

 

 

Stragety 패턴

interface TextAlignmentStrategy {
    fun textAlign(text: String) : String
}

class LeftAlignment : TextAlignmentStrategy{
    override fun textAlign(text: String) : String{
        return text
    }
}

class RightAlignment : TextAlignmentStrategy{
    override fun textAlign(text: String):String{
        return text.padStart(30)
    }
}

class CenterAlignment : TextAlignmentStrategy{
    override fun textAlign(text: String):String{
        val padding = (30 - text.length) / 2
        return text.padStart(padding + text.length).padEnd(30)
    }
}

TextAlignmentSrategy라는 인터페이스를 정의하고

각 정렬 클래스는 해당 인터페이스를 상속하여 구현한다.

 

각 클래스에 정렬 동작을 구현하여 캡슐화를 진행하였다.

 

class TextEditor(var alignmentStrategy: TextAlignmentStrategy) {
    fun alignText(text: String): String {
        return alignmentStrategy.textAlign(text)
    }

    fun setAlignmentStrategy(strategy: TextAlignmentStrategy) {
        alignmentStrategy = strategy
    }
}

TextEditor 클래스는 정렬 전략 클래스를 생성자로 받아서

텍스트를 해당하는 정렬방식에 따라 정렬하며,

필요할 때 정렬 방식을 바꿀 수 있는 기능을 제공한다.

 

fun main(){
    val text = "Kotlin"

    val textEditor = TextEditor(LeftAlignment())
    println(textEditor.alignText(text))

    textEditor.setAlignmentStrategy(RightAlignment())
    println(textEditor.alignText(text))

    textEditor.setAlignmentStrategy(CenterAlignment())
    println(textEditor.alignText(text))
}

정렬 전략 클래스를 사용하여 텍스트를 각 방향으로 정렬한다.

 

 

 

과제 2

 

과제 내용

회원가입 페이지를 MVVM 패턴으로 변경한다.

 

 

구현 사항

회원정보(이름, 아이디, 비밀번호)를 입력 후 “회원가입” 버튼을

클릭하면 Toast에 회원정보 노출시킨다.

 

 

폴더 구조

 

프로젝트 폴더내에 model, viewModel 폴더를 추가한다.

 

 

유저 모델

data class User(
    val name: String,
    val id: String,
    val pw: String
)

모델은 데이터 클래스에 해당한다.

유저 클래스의 프로퍼티는 입력할 회원정보로 구성된다.

 

 

회원가입 뷰모델

class SignUpViewModel : ViewModel() {
    // MutableLiveData는 데이터의 변경을 관찰할 수 있도록 함
    private val _user = MutableLiveData<User>()
	
    // 외부에서 _user에 접근할 수 있도록 하는 public 변수 선언
    val user: LiveData<User> get() = _user
	
    // 유저정보를 받아서 _user의 값을 변경한다.
    fun changeUser(name: String, id: String, pw: String) {
        _user.value = User(name, id, pw)
    }
}

사용자 정보(User)를 관리하기 위한 뷰모델을 작성해준다.

 

해당 뷰모델은 User 객체를 LiveData로 관리하며,

LiveData를 사용하여 데이터의 변화를 관찰하고 UI를 업데이트할 수 있다.

 

 

회원가입 액티비티

class SignUpActivity : AppCompatActivity() {

    private lateinit var viewModel: SignUpViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_sign_up)

        val etName = findViewById<EditText>(R.id.et_name)
        val etId = findViewById<EditText>(R.id.et_id)
        val etPw = findViewById<EditText>(R.id.et_pw)
        val btnSignUp = findViewById<Button>(R.id.btn_signUp)
		
        // 뷰모델 초기화
        viewModel = ViewModelProvider(this).get(SignUpViewModel::class.java)
		
        // 뷰모델의 옵저버 설정
        viewModel.user.observe(this) {
            Toast.makeText(this, viewModel.user.value.toString(), Toast.LENGTH_SHORT).show()
        }

        btnSignUp.setOnClickListener {
            val name = etName.text.toString()
            val id = etId.text.toString()
            val pw = etPw.text.toString()
            if(name.isBlank() || id.isBlank() || pw.isBlank()){
                Toast.makeText(this, "모든 정보를 입력해야 합니다.", Toast.LENGTH_SHORT).show()
            } else {
                viewModel.changeUser(name, id, pw)
            }
        }
    }
}

뷰모델의 옵저버를 통해 user값의 변경을 감지하면 토스트메시지를 띄운다.

 

모든 정보를 입력한 뒤 회원가입 버튼을 눌렀을 때 뷰모델의

changeUser 메소드를 호출해 user값을 변경시킨다.

 

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