// 사용자가 실제로 호출하는 인터페이스 정의
interface UserService {
fun registerUser(username: String, password: String): Boolean
fun loginUser(username: String, password: String): Boolean
fun getUserInfo(username: String): String
fun updateUserPassword(username: String, newPassword: String): Boolean
}
class UserServiceImpl : UserService {
private val userDatabase = mutableMapOf<String, String>() // 간단한 사용자 데이터베이스
override fun registerUser(username: String, password: String): Boolean {
if (userDatabase.containsKey(username)) {
println("Username already exists.")
return false
}
userDatabase[username] = password
println("User registered successfully.")
return true
}
override fun loginUser(username: String, password: String): Boolean {
if (userDatabase.containsKey(username) && userDatabase[username] == password) {
println("Login successful.")
return true
}
println("Invalid username or password.")
return false
}
override fun getUserInfo(username: String): String {
return "User: $username, Password: ${userDatabase[username] ?: "Not available"}"
}
override fun updateUserPassword(username: String, newPassword: String): Boolean {
if (userDatabase.containsKey(username)) {
userDatabase[username] = newPassword
println("Password updated successfully.")
return true
}
println("User not found.")
return false
}
}
fun main() {
val userService: UserService = UserServiceImpl()
userService.registerUser("john_doe", "password123")
userService.loginUser("john_doe", "password123")
println("User Info: ${userService.getUserInfo("john_doe")}")
userService.updateUserPassword("john_doe", "new_password")
userService.loginUser("john_doe", "new_password")
}
// User registered successfully.
// Login successful.
// User Info: User: john_doe, Password: password123
// Password updated successfully.
// Login successful.
✅ 범용적인 인터페이스 : 특정 도메인이나 기능에 제한되지 않고, 여러 다양한 상황에서 사용될 수 있는 일반적인 형태의 인터페이스
interface Animal {
fun makeSound()
}
class Cat : Animal {
override fun makeSound() {
println("냐옹")
}
}
class Dog : Animal {
override fun makeSound() {
println("멍멍")
}
}
fun main() {
val cat: Animal = Cat()
val dog: Animal = Dog()
cat.makeSound() // 냐옹
dog.makeSound() // 멍멍
}
interface ISmartPhone {
fun call(number: String)
fun message(number: String, text: String)
fun wirelessCharge()
fun AR()
fun biometrics()
}
class S20 : ISmartPhone {
override fun call(number: String) { /*...*/ }
override fun message(number: String, text: String) { /*...*/ }
override fun wirelessCharge() { /*...*/ }
override fun AR() { /*...*/ }
override fun biometrics() { /*...*/ }
}
class S21 : ISmartPhone {
override fun call(number: String) { /*...*/ }
override fun message(number: String, text: String) { /*...*/ }
override fun wirelessCharge() { /*...*/ }
override fun AR() { /*...*/ }
override fun biometrics() { /*...*/ }
}
class S3 : ISmartPhone {
override fun call(number: String) { /*...*/ }
override fun message(number: String, text: String) { /*...*/ }
override fun wirelessCharge() {
println("지원하지 않는 기능입니다.")
}
override fun AR() {
println("지원하지 않는 기능입니다.")
}
override fun biometrics() {
println("지원하지 않는 기능입니다.")
}
}
interface IPhone {
fun call(number: String) // 통화 기능
fun message(number: String, text: String) // 문제 메세지 전송 기능
}
interface WirelessChargable {
fun wirelessCharge() // 무선 충전 기능
}
interface ARable {
fun AR() // 증강 현실(AR) 기능
}
interface Biometricsable {
fun biometrics() // 생체 인식 기능
}
class S21 : IPhone, WirelessChargable, ARable, Biometricsable {
override fun call(number: String) { /*...*/ }}
override fun message(number: String, text: String) { /*...*/ }
override fun wirelessCharge() { /*...*/ }
override fun AR() { /*...*/ }
override fun biometrics() { /*...*/ }
}
class S3 : IPhone {
override fun call(number: String) { /*...*/ }
override fun message(number: String, text: String) { /*...*/ }
}
ISP는 SRP를 만족하면 성립되는가? : 반드시 그렇다고 볼 수 없다.
본래 인터페이스란 건 한번 구성하였으면 왠만해선 변하면 안되는 정책같은 개념이다. 따라서 처음 설계부터 기능의 변화를 생각해두고 인터페이스를 설계해야 하는데, 이는 현실적으로 참 힘든 부분이며 역시 개발자의 역량에 달렸다.