オブジェクトの値をコピーする

case class Foo(key:Int, key2:String, key3:Int)
のクラスからオブジェクトを生成し、それを他のオブジェクトにコピーしたいとき、scalaではcopyメソッドが使える。
val foo = Foo(100, "test", 200)

val zoo = foo.copy(key = 300)

とすると、keyは300がセットされ、他の値は元のオブジェクトからコピーされる。ただし、この機能はcaseクラスのみで、コピーされる対象は()内のプロパティのみ。
case class Foo(key:Int) {
var v1:String =_
var v2:Int = _
}
だと、v1, v2はコピーされない。

となると、caseクラスのプロパティはすべて()内に書いちゃうほうがいいのかな。キーになる項目だけ(equalsで比較の対象となるべきものだけ)を定義するものだと思っていたんだけど。