객체란?
Kotlin은 객체지향 프로그래밍을 지원하는 프로그래밍 언어입니다. 객체는 속성과 동작을 가지는 개체로 클래스를 통해 정의됩니다. 즉 객체는 해당 객체와 관련이 있는 데이터로 구성된 클래스의 인스턴스입니다.
그렇다면 객체를 만들기 위해서는 일단 클래스가 있어야 합니다. 먼저 클래스를 정의하고 이 정의된 클래스 내의 생성자를 호출해서 객체를 생성해 보겠습니다.
✔ 클래스(class): 클래스를 정의하는 예약어이며 객체를 생성하는 템플릿 도구이다.
✔ 생성자(constructor): 클래스 정의 이후 객체를 생성하는 기능이다. 보통 클래스 이름으로 호출하고 생성자를 실행하면 객체 내의 속성들을 초기화 처리한다.
아래는 `Hello` 라는 클래스를 생성했습니다.
class Hello {
val hello = "Hello"
}
이제 생성자를 호출해 객체를 생성해 보겠습니다. 생성자를 호출하는 방법은 클래스 이름과 호출 연산자인 괄호를 사용하면 됩니다.
fun main() {
val h = Hello()
println(h.javaClass)
}
// 출력 - class Hello
객체 표현과 주석
리터럴 표기법
객체는 다른 방식으로 생성될 수도 있습니다. 바로 리터럴(literal) 표기법입니다.
Kotlin에서는 기본형 타입(Primitive Type)이 제공됩니다. 기본형 타입들은 리터럴 표기법으로 작성될 수 있으며 작성하면 객체이면서 값으로 사용됩니다. 리터럴과 연산자를 여러 번 연결해 표현식을 작성할 수 있습니다.
✔ 리터럴(literal): 리터럴이란 하나의 값을 말하며 보통 숫자, 문자, 문자열이다. 클래스를 만들어 객체로 만든 값은 모두 리터럴이다. 코틀린에서도 숫자, 문자, 문자열은 객체이다.
✔ 연산자(operator): 연산자는 두 개의 리터럴을 연산할 때 사용하는 도구이다. 보통 기호로 표시하지만 코틀린 내부에서는 메서드로 처리한다.
✔ 표현식(expression): 표현식은 여러 리터럴과 연산자가 연결된 수식을 말한다. 이 수식은 즉시 평가되어 하나의 값으로 변환된다.
아래는 Kotlin의 기본형 타입에 대한 설명과 이에 대한 리터럴 예시를 나타낸 표입니다.
기본형 | 타입설명 | 리터럴 예시 |
`Boolean` | 논리값 (참 또는 거짓) | true, false |
`Byte` | 8비트 정수 | 10, -128, 127 |
`Short` | 16비트 정수 | 100, -32768 |
`Int` | 32비트 정수 | 42, -1000 |
`Long` | 64비트 정수 | 123456L, -9876L |
`Float` | 32비트 부동 소수점 (실수) | 3.14f, -0.5f |
`Double` | 64비트 부동 소수점 (실수) | 3.14, -0.5 |
`Char` | 16비트 유니코드 문자 | 'A', 'b', '1' |
`String` | 문자열 | "Hello", "Kotlin" |
아래 예제는 기본형 타입을 리터럴 표기법으로 작성한 예시입니다.
fun main() {
val booleanValue: Boolean = true
val byteValue: Byte = 10
val shortValue: Short = 100
val intValue: Int = 42
val longValue: Long = 123456L
val floatValue: Float = 3.14f
val doubleValue: Double = 3.14
val charValue: Char = 'A'
val stringValue: String = "Hello"
println(booleanValue.javaClass) // boolean
println(byteValue.javaClass) // byte
println(shortValue.javaClass) // short
println(intValue.javaClass) // int
println(longValue.javaClass) // long
println(floatValue.javaClass) // float
println(doubleValue.javaClass) // double
println(charValue.javaClass) // char
println(stringValue.javaClass) // class java.lang.String
}
의문점
❓ 그런데 처음에 객체는 해당 객체와 관련이 있는 데이터로 구성된 클래스의 인스턴스라는 말을 했습니다.
기본형 타입이 객체라면 해당 객체와 관련이 있는 데이터로 구성된 클래스가 있어야 합니다.
이를 확인하는 법은 간단합니다. 타입에 마우스를 올리면 해당 클래스를 확인할 수 있습니다. 기본형 클래스들은 Kotlin 표준 라이브러리에 저장되어 있습니다. Int 클래스는 Number 클래스를 상속하고 Comparable 인터페이스를 구현하고 있습니다. Number 클래스를 자세히 더 찾아보겠습니다.
public abstract class Number {
/**
* Returns the value of this number as a [Double], which may involve rounding.
*/
public abstract fun toDouble(): Double
/**
* Returns the value of this number as a [Float], which may involve rounding.
*/
public abstract fun toFloat(): Float
/**
* Returns the value of this number as a [Long], which may involve rounding or truncation.
*/
public abstract fun toLong(): Long
/**
* Returns the value of this number as an [Int], which may involve rounding or truncation.
*/
public abstract fun toInt(): Int
/**
* Returns the [Char] with the numeric value equal to this number, truncated to 16 bits if appropriate.
*/
// @Deprecated("Direct conversion to Char is deprecated. Use toInt().toChar() or Char constructor instead.", ReplaceWith("this.toInt().toChar()"))
public abstract fun toChar(): Char
/**
* Returns the value of this number as a [Short], which may involve rounding or truncation.
*/
public abstract fun toShort(): Short
/**
* Returns the value of this number as a [Byte], which may involve rounding or truncation.
*/
public abstract fun toByte(): Byte
}
Number는 숫자 타입을 나타내는 추상 클래스입니다. 다양한 숫자 타입간의 변환을 제공하는 메서드를 정의하고 있습니다.
이렇게 해서 기본형 타입도 해당 객체와 관련이 있는 데이터로 구성된 클래스의 인스턴스라는 것을 알아보았습니다.
객체는 메서드로 연산을 수행한다.
모든 객체는 속성과 메서드를 가집니다. 기본 생성자들도 속성과 메서드를 가집니다. 하지만 보통 숫자 객체는 변경할 수 없는 객체이므로 연산자를 수행하면 새로운 객체를 생성할 수 있습니다.
✔ 메서드(method): 메서드는 클래스 내부에 정의한 함수인데 객체가 점연산자로 접근해서 실행할 수 있다.
✔ 함수(function): 함수는 함수 이름과 호출연산자로 실행한다.
연산자에 대한 설명은 나중에 더 자세히 하겠습니다.
주석 처리
우리가 코드를 작성하면 코드는 컴파일러나 인터프리터에 의해 실행 파일로 변경됩니다. 다만 주석(comment)는 실행 파일로 변환되지 않고 프로그램을 설명하는 용도로 사용됩니다. 주석은 크게 3가지로 나눌 수 있습니다.
한 줄 주석
한 줄 주석은 하나의 줄을 설명하는 용도입니다. 두 개의 슬래시(//)를 쓰고 해당 줄을 설명하면 됩니다.
val hello = "Hello" // 변수를 지정
println(hello) // 변수를 출력
여러 줄 주석
코드의 설명이 길어질 때는 여러 줄 주석으로 작성합니다 여러 줄 주석은 /* ~ */ 사이에 설명을 적습니다. 보통 함수나 클래스 등을 설명할 때 여러 줄 주석을 사용합니다.
/* 아래의 함수는 hello 변수에 "Hello"라는 문자열을 지정하고
해당 변수를 출력하는 함수입니다.
*/
fun hello() {
val hello = "Hello" // 변수를 지정
println(hello) // 변수를 출력
}
문서화 주석
클래스나 함수 등이 어떤 내용인지 규칙에 맞춰 작성하면 이를 문서화할 수 있습니다. 문서화 주석은 /** ~ */ 사이에 설명을 적습니다.
/**
* 클래스에 대한 멤버 구성.
*
* 클래스에 대한 매개변수, 생성자 등 멤버 설명
*/
class Hello {
val hello = "Hello" // 변수를 지정
fun hello() {
println(hello) // 변수를 출력
}
}
문자열
문자열은 두 개의 따옴표 사이에 문자들을 순서대로 나열한 구조입니다. 문자열, 예약어, 변수명은 코드 내부에서 처리하는 기준이 다르기에 문자열을 어떻게 구분하는지 잘 알아야 합니다.
문자는 2Byte인 Char 클래스로 만듭니다. 문자열은 빈문자도 포함하는 여러 개의 문자 묶음입니다. 문자열 클래스는 String입니다.
문자열 템플릿
문자열 템플릿(String Template)을 사용하면 기존의 정의된 변수나 표현식을 쉽게 활용해 출력할 수 있습니다.
val name = "준형"
val a = 1
val b = 2
println("이름 : $name") // $+ 변수명을 지정해서 출력
println("a + b = ${a + b}") // ${표현식}을 지정해서 출력
이름 : 준형
a + b = 3
이스케이프 문자
문자열을 작성할 때 문자열 내부의 정보를 제공하는 이스케이프 문자가 존재합니다.
\n | 줄 바꿈 (New Line) |
\r | 캐리지 리턴 (Carriage Return) |
\t | 탭 (Tab) |
\\ | 역슬래시 (Backslash) |
\" | 큰따옴표 (Double Quote) |
\' | 작은따옴표 (Single Quote) |
\b | 백스페이스 (Backspace) |
\uXXXX | 16진수 유니코드 문자 (Unicode) |
원시 문자열
일반 문자나 이스케이프 문자를 그대로 문자로 인식해서 처리하는 문자열을 원시 문자열(Raw String)이라고 합니다. 코틀린에서 원시 문자열은 큰따옴표 3개를 사용합니다. 원시 문자열에도 탬플릿 기능을 추가할 수 있습니다.
val name = """문자열에 \n 이스케이프 문자를 넣고 처리"""
val a = """a + b = ${1 + 2}"""
println(name)
println(a)
문자열에 \n 이스케이프 문자를 넣고 처리
a + b = 3
형식문자 포매팅
형식문자 포매팅(String Formatting)은 특수한 편집기호를 사용합니다.
val value = 42
val formattedValue = String.format("The value is %d", value)
println(formattedValue) // 출력: The value is 42
아래는 일반적으로 사용되는 형식 지정자 입니다.
%d | 10진수 정수 |
%f | 실수 |
%e | 지수 표기법 실수 |
%s | 문자열 |
%c | 문자 |
%b | 논리값 |
%x | 16진수 정수 |
%o | 8진수 정수 |
%t | 날짜 및 시간 |
'스터디 > 코틀린 언어' 카테고리의 다른 글
[Kotlin] 클래스 (2) - week 5 (0) | 2023.08.08 |
---|---|
[Kotlin] 클래스 (1) - week 5 (0) | 2023.08.07 |
[Kotlin] 함수 알아보기 - week 4 (0) | 2023.08.03 |
[Kotlin] 문장 제어처리 - week 3 (0) | 2023.07.21 |
[Kotlin] 변수와 상수 - week 2 (2) (0) | 2023.07.19 |