본문 바로가기

개발자/kotlin 코틀린

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

반응형

 

 

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

 

 

 

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩