개발자/kotlin 코틀린

kotlin 06. 연산자, 프로퍼티, 생성자, 오버로딩

지구빵집 2022. 8. 16. 08:23
반응형

 

 

051 = = =, != = 연산자

 

String 타입의 리터럴로 이루어진 표현식에 한해서 참조변수에 동일한 문자열을 저장하면 컴파일러는 매번 새로운 문자열을 생성하지 않고 하나의 문자열을 가리키도록 만든다. 코틀린의 === 연산자는 자바의 == 연산자와 같다. 

 

fun main(args: Array<String>)
{
	var a = "one"
	var b = "one"

	println(a === b)

	b = "on"
	b += "e"
	println(a !== b)

	b = a
	println(a === b)
}

결과

true
true
true

 

052 멤버 함수(Member Function)

클래스에 내장된 함수를 말한다. 

fun main(args: Array<String>)
{
	val building = Building()
	building.name = "A 오피스텔"
	building.date = "2017-12-13"
	building.area = 120 * 8

	building.print()
}

class Building
{
	var name ="" // 건물명
	var date = "" // 건축일자
	var area = 0 // 면적 (㎡)

	fun print()
	{
		println("이름: " + this.name)
		println("건축일자: " + this.date)
		println("면적: ${this.area} ㎡")
	}
}

결과

이름: A 오피스텔
건축일자: 2017-12-13
면적: 960 ㎡

 

053 프로퍼티와 멤버 함수의 매개변수 이름이 중복될 때

 

class AAA
{
	var num = 15

	fun memberFunc(num: Int)
	{
		println(num)
		println(this.num)
	}
}

fun main(args: Array<String>)
{
	val a = AAA()
	a.memberFunc(53)
}

결과

53
15

 

054 생성자(Constructor)와 초기화(Initializer) 블록

 

class Person constructor(name: String, age: Int)
{
	val name: String
	val age:Int

	init
	{
		this.name = name
		this.age = age
	}
}

fun main(args: Array<String>)
{
	val person = Person("홍길동", 46)
	println("이름: ${person.name}")
	println("나이: ${person.age}")
}

결과

이름: 홍길동
나이: 46

 

055 init 블록 나누어 쓰기

 

class Size(width: Int, height: Int)
{
	val width = width
	val height: Int

	init
	{
		this.height = height
	}

	val area: Int

	init
	{
		area = width * height
	}
}

fun main(args: Array<String>)
{
	val size = Size(10, 50)
	println(size.area)
}

결과

500

 

056 생성자와 프로퍼티 한 번에 쓰기

매개변수 앞에 val, var 키워드를 붙이면 동일한 이름의 프로퍼티가 같이 선언된다. 생성자 매개변수에 들어온 인수가 프로퍼티의 초기값이 된다. 

class Car(val name: String, val speed: Int = 0)

fun main(args: Array<String>)
{
	val car = Car("My Car")
	println(car.name)
	println(car.speed)
}

결과

My Car
0

 

057 보조 생성자(Secondary Constructor)

 

클래스 내부에 오는 생성자, 여러 개가 올 수 있다. 

class Time(val second: Int)
{
	init
	{
		println("init 블록 실행 중")
	}

	// 보조 생성자 1
	constructor(minute: Int, second: Int) : this(minute * 60 + second)
	{
		println("보조 생성자 1 실행 중")
	}

	// 보조 생성자 2
	constructor(hour: Int, minute: Int, second: Int) : this(hour * 60 + minute, second)
	{
		println("보조 생성자 2 실행 중")
	}

	init
	{
		println("또 다른 init 블록 실행 중")
	}
}

fun main(args: Array<String>)
{
	println("${Time(15, 6).second} 초")
	println("${Time(6, 3, 17).second} 초")
}

결과

init 블록 실행 중
또 다른 init 블록 실행 중
보조 생성자 1 실행 중
906 초
init 블록 실행 중
또 다른 init 블록 실행 중
보조 생성자 1 실행 중
보조 생성자 2 실행 중
21797 초

 

 

058 프로퍼티와 Getter/Setter

 

프로퍼티는 실제로 저장되는 공간(field), 저장된 값을 읽으려고 할 때 호출되는 함수는 Getter 값을 저장하려고 할 때 호출되는 함수는 Setter로 이루어져 있다. 코틀린에서는 프로퍼티에 디폴트 getter/setter가 포함이 되어있기 때문에 따로 만들 필요가 없다. getter/setter의 동작을 커스터마이징 하고 싶다면 별도로 정의를 해야 한다. 

 

fun main(args: Array<String>)
{
	val person = Person()
	person.age = -30
	println(person.age)
}

class Person
{
	var age: Int = 0
		get()
		{
			return field
		}
		set(value)
		{
			field = if (value >= 0) value else 0
		}
}

결과

0

 

059 연산자 오버로딩(Operator Overloading)

 

fun main(args: Array<String>)
{
	val pt1 = Point(3, 7)
	val pt2 = Point(2, -6)

	val pt3 = pt1 + pt2
	val pt4 = pt3 * 6
	val pt5 = pt4 / 3

	pt3.print()
	pt4.print()
	pt5.print()
}

class Point(var x: Int = 0, var y: Int = 0)
{
	operator fun plus(other: Point): Point
	{
		return Point(x + other.x, y + other.y)
	}

	operator fun minus(other: Point): Point
	{
		return Point(x - other.x, y - other.y)
	}

	operator fun times(number: Int): Point
	{
		return Point(x * number, y * number)
	}

	operator fun div(number: Int): Point
	{
		return Point(x / number, y / number)
	}

	// 좌표 값을 출력한다.
	fun print()
	{
		println("x: $x, y: $y")
	}
}

결과

x: 5, y: 1
x: 30, y: 6
x: 10, y: 2

 

060 번호 붙은 접근 연산자(Indexed Access Operator) [ ] 

 

fun main(args: Array<String>)
{
	val person = Person("Kotlin", "2016-02-15")
	println(person[0])
	println(person[1])
	println(person[-1])

	person[0] = "Java"
	println(person.name)
}

class Person(var name: String, var birthday: String)
{
	operator fun get(position: Int): String
	{
		return when (position) {
			0 -> name
			1 -> birthday
			else -> "알 수 없음"
		}
	}

	operator fun set(position: Int, value: String)
	{
		when (position)
		{
			0 -> name = value
			1 -> birthday = value
		}
	}
}

결과

Kotlin
2016-02-15
알 수 없음
Java

 

 

 

 

 

반응형