티스토리 뷰
클래스를 이해하기 위해서는 우선 OOP의 개념을 알아야 합니다.
OOP는 Object Oriented Programming의 약자로, 한글로는 객체지향프로그래밍이라고 일컫습니다.
OOP와 대비되는 개념은 절차지향프로그래밍 기법으로 코드가 위에서 아래로 절차에 따라 실행되는 것을 의미합니다.
이에 반해, 객체지향프로그래밍은 필요한 객체들을 만들고, 유기적인 객체들을 필요에 따라 불러와서 코드를 실행하는 것을 의미합니다. 객체마다 역할을 부여해서 임무를 수행한다고 보면 이해가 쉽습니다.
클래스를 이해하기 위해서, 장난감 '레고'의 개념을 비유해 봅시다.
레고를 조립하기 위해서 우리는 설명서가 필요합니다. 설명서에 따라 원하는 레고 자동차, 레고 건물 등을 만들 수 있습니다. 이 때, 설명서 역할은 하는 것이 클래스입니다. 그리고 메인 함수에서 객체를 찍어 내는데, 만들어진 설명서(클래스)를 기반으로 레고 자동차, 레고 비행기 등의 객체를 메인 함수에서 찍어 낸다고 생각하시면 이해가 쉽습니다.
우선 레고 조립에 필요한 설명서를 만들어 봅시다.
//축약된 클래스 선언
class Lego constructor(var circle: String, var square: String) {
}
//일반적인 클래스 선언.
//생성자 선언
//init 선언
//기능 선언
class Lego {
var circle: String
var square: String
constructor(circle: String, square: String){
this.circle = circle
this.square = square
}
init {
println("레고 완성되었습니다")
}
fun run(){
println("레고 달리기")
}
fun jump(){
println("레고 점프")
}
fun jump(destination: String){
println("레고 $destination으로 점프")
}
fun move(destniation: String){
println("$destniation 으로 레고 이동")
}
}
먼저 축약된 클래스 선언 부분을 봅시다. 예약어 class를 사용하면 클래스가 만들어집니다. 생성자 constructor는 생략이 가능합니다. 레고를 만들기 위해 필요한 요소가 변수들이 됩니다. circle, square 처럼 2가지 블록이 필요하다고 가정합니다.
두 번째, 일반적인 클래스 선언을 보면, 생성자, init, 기능까지 선언되어 있습니다. 레고가 조립된다면 사용 가능한 기능을 함수로 정의해 봅시다. 생성자란 객체를 생성할 때 항상 실행되는 것으로, 객체를 초기화해주기 위해 맨 처음 실행되는 메소드를 의미합니다. 따라서, 생성자 내용에는 this를 사용하는데 전역/지역 변수에 대해서는 나중에 설명하겠습니다.
init은 설명서 대로 레고가 생성될 때 무조건 실행시키 위한 하나의 전달 사항이라고 보시면 됩니다. 실행되는 부분이 함수가 될 수도 있고 원하는 부분을 반드시 처음에 실행하기 위해서 코딩합니다.
레고가 기능이 있다고 가정해 봅시다. 달리기, 점프, 목적지 이동 기능이 있다고 가정하며, 해당 기능들을 각기 함수로 구성해서 설명서 안에 담을 수 있습니다.
설명서가 완성이 되었다면, 설명서를 보고 레고를 '실제'로 만들어야 겠죠?
fun main(array: Array<String>) {
val lego: Lego = Lego(circle = "red", square = "yellow")
lego.run()
lego.jump()
lego.jump("하늘")
lego.move("연못")
}
실제로 레고를 만드는 것은 메인 함수에서 진행합니다. 이렇게 설명서(클래스)를 기반으로 실제로 레고를 제작하는 것을 '개체를 생성한다', '개체화', '인스턴스화', '인스턴스를 만든다' 등으로 표현합니다.
위에 예문에서 알 수 있듯이, 빨간색의 원형 블록, 노란색의 사각형 블록으로 레고를 만듭니다. 이 때, 변수 lego의 타입은 설명서(클래스)였던 Lego가 됩니다. 즉, lego의 타입은 Lego가 됩니다.
lego의 타입이 설명서였던 Lego이기 때문에, 설명서에 기술된 '기능'들을 사용할 수 있습니다.
기능을 사용할 때는 콤마로 원하는 기능을 사용하면 됩니다.
또한, jump의 기능이 두 가지 있는데, 하나는 받는 인수값이 없는 기능이고, 하나는 목적지 값을 받는 기능입니다. 이렇게 함수(기능)의 명칭이 동일하지만, 받는 인수값이 있는 경우, 없는 경우에 따라 구분이 되는데, 이러한 경우를 메소드 오버로딩이라고 부릅니다. 클래스 내에서 명칭이 같은 함수를 중복하여 선언할 수 없지만, 전달받는 인수값이 다른 경우에는 오버로딩에 의해 가능합니다.
'Kotlin' 카테고리의 다른 글
코틀린 접근제어자 Kotlin Access Modifier (0) | 2021.07.06 |
---|---|
코틀린 전역 변수, 지역 변수 (Global Variables, Local Variables) (0) | 2021.07.06 |
코틀린 반복문 2편 Kotlin Iterators (0) | 2021.07.06 |
코틀린 반복문 Kotlin Iterators (0) | 2021.07.06 |
코틀린 컬렉션 Kotlin Collections (0) | 2021.07.06 |
- Total
- Today
- Yesterday
- findViewById
- 안드로이드 앱 만들기
- bmi 계산기 만들기
- ToDo List 앱 만들기
- 안드로이드 프로젝트
- 2019년 사건사고
- addView
- 애드뷰
- 자바스크립트 배열
- 메소드 오버라이딩
- 리스트뷰
- 대한민국 미제사건
- RecyclerView
- 미제사건
- tabLayout
- view binding
- lazy init
- 탭레이아웃
- 상대적 레이아웃
- 뷰 바인딩
- 2007년 사건사고
- 리사이클러뷰
- notifyDataSetChanged
- 안드로이드 어댑터
- 인텐트
- Bmi Calculator
- 안드로이드 스튜디오 에러
- 2021년 사건사고
- 선형 레이아웃
- android adapter
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |