1. 클래스
앞에서 했던 내용들하고 비교해보면 특별한건 없어보인다.
단 파라미터가 없는 메소드의 경우 가급적 '( )' 없이 사용하길 권장한다고 한다.
2. 게터와 세터 자동생성
class 내부에 age라는 변수만 초기화 해놨다.
별다른 표시가 없으면 멤버 접근권한은 기본적으로 public으로 존재한다.
이부분이 조금 매력적이다.
사용할때는 .age 하나인데, 이걸로 setter도 되고 getter의 기능도한다.
scala에서는 만약 멤버변수 int타입 age가 생성되면
의 형식으로 자동으로 내부적으로 생성한다.
그리고 멤버 변수가 var가 아닌 val으로 선언했다면
그 멤버의 setter는 생성되지 않는다.
또한 getter와 setter는 자동으로 생성은 됬지만,
입맛에 맞게 수정하여 사용할 수 도 있다.
3. 비공개필드
클래스에서 일부 필드를 비공개로 숨기는 기능이 있다.
대게 private한 변수들도 메소드내에서는 접근이 가능하다.
그런데 여기서는 이걸 불가능하게 하는 방법이 있다.
private뒤에[this] 라는 키워드를 덧붙이면 된다. 이렇게되면
other.value에 접근할수 없다는 에러메세지가 표시된다.
4. @BeanProperty
getValue, setValue를 명시적으로 생성해주는 키워드다.
5. 보조생성자 : this
scala에서는 기본생성자외에 this 로 표시되는 보조생성자가 추가로 있어서
클래스는 원하는 대로 생성자를 만들 수 있다.
단 보조생성자는 이전에 정의한 보조생성자나 기본 생성자 호출로 시작해야한다.
6. 기본생성자
클래스 파라미터 값을 받는다.
setter, getter 만들 필요도 없으니, 파라미터값만 설정해주면 끝.
기본생성자는 클래스 정의에 있는 모든 문을 실행한다.
클래스에 내에 print 함수가 있다면 새로운 객체가 생성될때마다 다음처럼 된다.
7. 중첩클래스
스칼라에서는 함수안에 다른함수, 클래스 안에 다른클래스를 정의할 수 있다.
chatter, myFace내에 Member 클래스는 당연히 서로 다른거다.
Network내에서 자신의 Member를 추가할수는 있지만 다른 Network간에는 불가능하다.
scala> class Counter { | private var value = 0 | def increment() { value += 1 } | def current() = value | } defined class Counter
앞에서 했던 내용들하고 비교해보면 특별한건 없어보인다.
단 파라미터가 없는 메소드의 경우 가급적 '( )' 없이 사용하길 권장한다고 한다.
2. 게터와 세터 자동생성
scala> class Person { var age =0 } defined class Person scala> val chang = new Person chang: Person = Person@157fe3d
class 내부에 age라는 변수만 초기화 해놨다.
별다른 표시가 없으면 멤버 접근권한은 기본적으로 public으로 존재한다.
scala> chang.age res9: Int = 0 scala> chang.age = 1 chang.age: Int = 1 scala> chang.age res10: Int = 1
이부분이 조금 매력적이다.
사용할때는 .age 하나인데, 이걸로 setter도 되고 getter의 기능도한다.
scala에서는 만약 멤버변수 int타입 age가 생성되면
getter는 int age() = age setter는 void age_=(int)
의 형식으로 자동으로 내부적으로 생성한다.
그리고 멤버 변수가 var가 아닌 val으로 선언했다면
그 멤버의 setter는 생성되지 않는다.
또한 getter와 setter는 자동으로 생성은 됬지만,
입맛에 맞게 수정하여 사용할 수 도 있다.
3. 비공개필드
클래스에서 일부 필드를 비공개로 숨기는 기능이 있다.
대게 private한 변수들도 메소드내에서는 접근이 가능하다.
그런데 여기서는 이걸 불가능하게 하는 방법이 있다.
private[this] var value = 0 def isLess(other : Counter) = value < other.value
private뒤에[this] 라는 키워드를 덧붙이면 된다. 이렇게되면
other.value에 접근할수 없다는 에러메세지가 표시된다.
4. @BeanProperty
getValue, setValue를 명시적으로 생성해주는 키워드다.
class Person{ @BeanProperty var name ="foo" }private으로 선언할 수 없다.
scala> var p = new Person p: Person = Person@15b5d86 scala> p.name res44: String = foo scala> p.setName("qq") scala> p.getName() res46: String = qq
5. 보조생성자 : this
scala에서는 기본생성자외에 this 로 표시되는 보조생성자가 추가로 있어서
클래스는 원하는 대로 생성자를 만들 수 있다.
단 보조생성자는 이전에 정의한 보조생성자나 기본 생성자 호출로 시작해야한다.
scala> class Person { | private var name = "" | private var age = 0 | | def this(name : String) { | this() // 기본생성자 | this.name = name | } | | def this(name : String, age : Int){ | this(name) | this.age = age | } | } defined class Person
scala> val p1 = new Person p1: Person = Person@c5dbb scala> val p2 = new Person("Fred") p2: Person = Person@30e71 scala> val p3 = new Person("Fred",42) p3: Person = Person@1aabda3
6. 기본생성자
클래스 파라미터 값을 받는다.
scala> class Person (val name : String, val age : Int) { | } defined class Person scala> val p5 = new Person("bob", 32) p5: Person = Person@e25ef0 scala> p5.name res15: String = bob scala> p5.age res16: Int = 32
setter, getter 만들 필요도 없으니, 파라미터값만 설정해주면 끝.
기본생성자는 클래스 정의에 있는 모든 문을 실행한다.
클래스에 내에 print 함수가 있다면 새로운 객체가 생성될때마다 다음처럼 된다.
scala> class Person (val name : String, val age : Int) { | println("Just constructed another person" + name); | } defined class Person scala> val p6 = new Person("Alice", 22) Just constructed another personAlice p6: Person = Person@d3e5cc
7. 중첩클래스
스칼라에서는 함수안에 다른함수, 클래스 안에 다른클래스를 정의할 수 있다.
scala> class Network{ | class Member(val name:String){ | val contacts = new ArrayBuffer[Member] | } | | private val members = new ArrayBuffer[Member] | | def join(name: String) = { | val m = new Member(name) | members += m | m | } | } defined class Network scala> val chatter = new Network chatter: Network = Network@dacf27 scala> val myFace = new Network myFace: Network = Network@18a36e6
chatter, myFace내에 Member 클래스는 당연히 서로 다른거다.
Network내에서 자신의 Member를 추가할수는 있지만 다른 Network간에는 불가능하다.
scala> val fred = chatter.join("Fred") fred: chatter.Member = Network$Member@61d064 scala> val wilma = chatter.join("Wilma") wilma: chatter.Member = Network$Member@1a87caa scala> fred.contacts += wilma res20: fred.contacts.type = ArrayBuffer(Network$Member@1a87caa) scala> val barney = myFace.join("Barney") barney: myFace.Member = Network$Member@509953 scala> fred.contacts += barney <console>:14: error: type mismatch; found : myFace.Member required: chatter.Member fred.contacts += barney
댓글
댓글 쓰기