본문 바로가기
개발언어/Kotlin : 코틀린

코틀릭 익히기 5 - 클래스와 객체

by 개발자D 2023. 9. 21.

클래스와 객체

자바 쉽게 배우기 6 - 클래스와 객체의 도입부를 자바 > 코틀린으로 고쳐서 인용하겠습니다.

이번글에서는 클래스와 객체에 대해 알아봅시다. 그전에 왜 코틀린에서는 클래스와 객체를 사용하는 지부터 살펴봅시다. 코틀린은 객체지향 프로그래밍 언어입니다. 객체가 무엇일까요? 넓은 의미에서 객체는 이 세상에 존재하는 모든 것들을 의미합니다. 형상이 있는 것과 없는 것 모두 객체가 될 수 있습니다. 

 

컴퓨터에게 실제 세계를 이해시키기 위해서는 현실의 사물을 컴퓨터가 이해할 수 있는 방식으로 해석해 주는 과정이 필요합니다. 우리는 그 과정에서 객체를 사용하게 되죠. 

 

철수라는 객체를 만들어 봅시다. 철수 객체에는 나이, 성별, 직업, 하는 행동 (블로그 포스팅, 개발, 유튜브 시청) 등의 정보가 포함되어 있습니다. 물론 현실의 철수가 가지는 정보만큼 방대한 양을 담는 것은 무리겠지만 철수를 표현하는 것에는 무리가 없어 보입니다. 이런 식으로 영희, 강아지, 집 등을 만들어 그들 간의 관계를 설정해 줄 수도 있습니다.

 

이렇듯 객체 지향 프로그래밍은 현실의 객체를 컴퓨터가 이해할 수 있는 형태로 만들어 이것들을 조립하여 사용하는 방식으로 이루어집니다. 객체 지향 프로그래밍을 사용하면 상속을 통해 코드를 재사용하거나 확장하기에 용이하고, 모델링을 쉽고 효율적으로 할 수 있다는 장점이 있습니다. 이제 각설하고 클래스와 객체에 대해 알아봅시다.

 

클래스(Class)와 객체(Object) 

클래스

클래스는 객체를 정의해 놓은 매뉴얼(설계도)입니다. 클래스를 통해 인스턴스를 생성할 수 있습니다. 같은 클래스를 통해 생성된 인스턴스는 같은 정의에 의해 생성되었기 때문에 비슷한 성격을 갖습니다. 완전히 같은 인스턴스를 만들 수도 있지만, 조금 다른 인스턴스 만드는 것도 가능합니다. [사람] 클래스를 사용해 [철수]와 [영희] 인스턴스를 만들 때, 각각 다른 정보를 넘겨주면 사람이라는 공통된 성격을 가지고 있지만 다른 특징을 가진 인스턴스가 만들어집니다.

 

예시 )

철수와 영희 모두 사람이기 때문에 이족보행을 한다는 공통된 성격을 갖는다.

하지만 철수는 남자 20세, 영희는 여자 30세의 다른 특징을 갖는다.

 

객체(Object), 인스턴스(Instance)

클래스는 매뉴얼(설계도)이기 때문에 그 자체로는 객체로서 사용할 수 없습니다. 클래스로부터 객체를 생성하여 메모리 영역에 올려야 사용이 가능해지죠.

이렇게 메모리에 올리는 과정을 인스턴스화라고 하고, 생성된 객체를 인스턴스라고 부릅니다. 보통 특정 클래스에서 생성된 객체를 말할 땐 인스턴스라고 표현합니다.

 

클래스 : 설계도, 객체 : 건물, 인스턴스 : 서울시 강남구 oo빌딩

 


객체의 구성요소 - 프로퍼티, 메서드 (객체의 멤버) 

프로퍼티(property)

예시 ) 철수의 나이, 성별, 직업

val(var) 변수명 : 자료형 = 값

val(var) 변수명 = 값 

 

프로퍼티는 지난 글 코틀린 익히기 2 - 자료형, 연산자에서 배운 변수와 같습니다. 클래스 안에 선언된 변수를 프로퍼티라고 부릅니다.

 

메서드(method)

예시 ) 철수가 하는 행동 : 블로그 포스팅, 개발, 유튜브 시청

fun 메서드명(매개변수: 매개변수타입, ..): 반환타입 {
	...
}

 

메서드는 지난 글 코틀린 익히기 4 - 함수형 프로그래밍에서 학습했습니다.

 

생성자

인스턴스를 생성할 때 기본적으로 호출되는 함수입니다. 기본적으로 함수와 동일한 성질을 갖습니다. 생성자는 보통 프로퍼티를 초기화할 때 사용합니다. 주 생성자의 매개변수를 선언할 때 val이나 var를 붙여 선언하면 클래스에 프로퍼티가 선언됨과 동시에 생성자의 매개변수로 받아온 값을 프로퍼티에 할당할 수 있게 됩니다.

class 클래스명 constructor(필요한 매개변수..) { // 주 생성자 (constructor 생략 가능)
	...
	constructor(필요한 매개변수..) {		 // 부 생성자
		...
	}
  [constructor(필요한 매개변수..) { ... }] 		 // 추가 부 생성자
	...
}

 

주 생성자나 부 생성자 중 하나를 사용할 수 있고, 두 개를 동시에 사용할 수도 있습니다.

주 생성자와 부 생성자를 모두 사용할 때는 this()를 사용하여 부 생성자에서 주 생성자를 호출해야 합니다. 

class 클래스명 constructor(필요한 매개변수..) { // 주 생성자 (constructor 생략 가능)
	...
	constructor(필요한 매개변수..): this(매개변수) {		 // 부 생성자
		...
	}
}

 

부 생성자는 오버로딩하여 여러 개의 부 생성자를 사용할 수 있습니다. 오버로딩은 아래에서 설명합니다.

 

초기화 블록

주생성자만을 사용하는 경우에는 필요한 프로퍼티 초기화 이외의 다른 코드를 실행할 수 없게 됩니다. 이를 해결하기 위해 초기화 블록을 사용할 수 있습니다. 초기화 블록은 init 키워드로 사용할 수 있습니다.

class 클래스명 {
    init {
    	...
    }
}

 

 

... 이외에도 중첩클래스, 이너클래스, 컴패니언 객체 등이 멤버가 될 수 있습니다. 

예습을 원하신다면 코틀린 익히기 6 - 프로퍼티와 object, 코틀린 익히기 7 - 다양한 클래스와 인터페이스를 참조하세요!

 


객체 지향 프로그래밍

코틀린으로 객체 지향 프로그래밍을 어떻게 구현할 수 있는지 살펴봅니다.

 

상속

상속은 상위 클래스의 멤버를 사용할 수 있는 하위 클래스를 만드는 방법입니다. 상위 클래스를 확장시키고 싶을 때 상속을 사용합니다.

예) 상위 클래스 : 새, 하위 클래스 : 오리, 참새, 타조

 

자바

기본적으로 선언하는 클래스 : 상속 가능한 클래스

상속할 수 없는 클래스로 선언 : final 키워드 사용

 

코틀린

기본적으로 선언하는 클래스 : 상속 불가능한 클래스

상속할 수 있는 클래스로 선언 : open 키워드 사용

 

코틀린에서는 : 를 사용하여 상속을 표현합니다. 변수의 자료형이나 함수의 반환자료형과 달리 : 앞뒤에 공백을 넣어줍니다. 의무는 아니나 관례입니다.

인터페이스를 구현할 때도 똑같이 표현합니다.

class 하위클래스 : 상위클래스()
class 구현클래스 : 인터페이스 

 

하위 클래스의 생성자에서는 상위 클래스를 호출해야 합니다.

open class SuperClass(args: Int)

// 주 생성자에서 상위 클래스 호출
class SubClass(args: Int) : SuperClass(args)

// 부 생성자에서 상위 클래스 호출
class SubClass : SuperClass { .. constructor(args: Int) : super(args){} .. } // 부 생성자만 사용 시

 

다형성

다형성은 이름은 같지만 서로 다른 형태나 다른 실행 결과를 가질 수 있는 성질입니다. 코틀린에서도 그대로 적용됩니다.

 

자바 쉽게 배우기 9 - 다형성

다형성 polymorphism 객체지향 프로그래밍 언어는 다섯 가지의 특징을 가집니다. [캡슐화], [정보 은닉], [추상화], [상속성], [다형성] 이 5가지입니다. [캡슐화]와 [정보은닉]은 접근 제어자를 설명드

devdharu.tistory.com

 

오버라이딩(overriding)

오버라이딩은 상위 클래스로부터 상속받은 메서드의 내용을 변경하는 것입니다. 오버로딩과 글자가 비슷하여 혼동하기 쉽지만 기능은 전혀 다릅니다. 

오버라이딩 할 메서드는

  • 상위 클래스의 메서드와 이름, 매개변수, 반환타입이 같아야 하고 접근제어자의 범위가 같거나 커야 합니다. (접근제어자는 아래에서 설명드리겠습니다.)
  • 상위 클래스에는 open 키워드를, 하위 클래스에는 override 키워드를 사용합니다.
  • 프로퍼티 오버라이딩 시 상위 클래스에 var로 정의된 경우, 하위에서 val로 변경할 수 없습니다. 반대로 변경하는 것은 가능합니다.
  • 상위 클래스보다 많은 예외를 선언할 수 없습니다.

오버로딩(overloading)

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것입니다. 하나의 메서드 이름으로 매개변수만 다르게 넣어 비슷한 기능을 수행할 수 있도록 할 수 있습니다.

int plus(int a, int b) { 
	return a + b;
}

int plus(int a, int b, int c) {
	return a + b + c;
}

float plus(float a, float b) {
	return a + b;
}
  • 메서드 이름이 같아야 합니다.
  • 매개변수의 개수 또는 타입이 달라야 합니다.

super, this

super : 상위 클래스의 멤버를 참조할 때 사용합니다.

this : 현재 클래스의 멤버를 참조할 때 사용합니다.

 

❗ 만약 내부클래스에서 외부클래스(상위 클래스가 아닙니다. 자세한 내용은 코틀린 익히기 7 - 다양한 클래스와 인터페이스에서 설명합니다.)의 멤버를 참조할 때는 super@외부클래스명.멤버 와 같은 형태로 사용합니다.

 클래스와 인터페이스를 동시에 상속, 구현했을 때 상위 클래스와 인터페이스에서 동일한 이름의 멤버를 가지고 있다면 이를 구분하기 위해 super<참조하고싶은클래스(인터페이스)명>.멤버 와 같은 형태로 사용합니다.

 

정보 은닉, 캡슐화

객체 지향 프로그래밍에서는 외부로부터 데이터를 보호하고 불필요한 부분을 감추기 위해 정보 은닉과 캡슐화를 사용합니다.

 

정보 은닉이란 클래스 내부의 세부 구현을 외부로부터 숨기는 것입니다. 구체적으로, 클래스의 내부 상태(멤버 변수)나 특정 메서드를 외부에서 접근하지 못하도록 하여, 클래스 내부의 데이터가 외부에 의해 의도치 않게 변경되거나 손상되지 않도록 보호합니다.

 

캡슐화는 객체지향 프로그래밍에서 데이터와 메서드를 하나의 단위(즉, 클래스)로 묶는 것을 의미합니다. 이로 인해 클래스 외부에서 내부 데이터에 직접 접근할 수 없고, 제공된 메서드를 통해서만 접근할 수 있습니다. 캡슐화는 정보 은닉을 구현하기 위한 방법 중 하나로 볼 수 있습니다.

 

접근 제어자 (가시성 지시자)

외부로부터 데이터를 보호하고 불필요한 부분을 감추기 위해사용합니다. 코틀린에서 접근 제어자가 생략된 경우 public 접근 제어자로 설정됩니다.

접근 제어자 접근 범위
private 같은 클래스 내에서만 접근 가능
protected 같은 클래스 내에서 혹은 하위 클래스에서 접근 가능, 최상위 요소에는 사용할 수 없음
internal 같은 정의의 모듈 내부에서 접근 가능
public 어디에서도 접근 가능 

 

선언 위치

[✅] <var | val> 전역 변수 이름
[✅] fun 함수이름() {}
[✅] [특정 키워드] class 클래스이름 [✅] constructor () {
	[✅] constructor() {}
	[✅] 프로퍼티
	[✅] 메서드
}

코틀린의 클래스와 객체에 대해 설명드렸습니다. 더불어 객체지향 프로그래밍에 관련한 내용도 덧붙여보았는데요. 코틀린이 객체지향 프로그래밍 언어인 만큼, 언어의 장점을 살리며 코드를 작성하는 게 좋겠죠? 다음 글에서는 프로퍼티와 object에 대해 살펴보겠습니다. 읽어주셔서 감사합니다.

 

코틀린 익히기 6 - 프로퍼티와 object

프로퍼티 코틀린의 프로퍼티는 자동으로 게터와 세터가 생성되어 인스턴스.프로퍼티 로 객체에 접근하거나 값을 변경하는 것이 가능합니다. 만약, 게터와 세터를 직접 지정하고 싶다면 다음과

devdharu.tistory.com