코틀린의 설계도구와 접근 제한자
설계 도구
객체지향 프로그래밍은 구현(실제 로직을 갖는 코딩)과 설계(껍데기만 있는 코딩)로 구분할 수 있는데
구현이 아닌 프로그래밍 설계에 사용하는 도구가 설계 도구이다
설계 기법은 굉장히 방대하다
꼭 포함되는 기본 내용 중에 필요한 몇 가지를 알아보자
- 패키지 (package)
코딩하면서 파일을 분류하고, 이름을 짓고, 특정 디렉터리에 모아 놓는 것(클래스와 인터페이스의 집합)이 모두 설계로
클래스와 소스 파일을 관리하기 위한 디렉터리 구조의 저장 공간이다
현재 클래스가 어떤 패키지(디렉터리)에 있는지 표시하고
디렉터리가 계층 구조로 만들어져 있으면 온점(.)으로 구분해서 각 디렉터리를 모두 나열해 준다
package 메인 디렉터리.서브 디렉터리
class 클래스 {
}
- 추상화
프로그래밍을 하기 전 개념 설계를 하는 단계에서
클래스의 이름과 클래스 안에 있음 직한 기능을 유추해서 메서드 이름으로 먼저 나열하는데
이때 명확한 코드는 설계 단계에서 메서드 블록 안에 직접 코드를 작성하고
그렇지 않은 경우에는 구현 단계에서 코드를 작성하도록 메서드의 이름만 작성한다
abstract 키워드를 사용해서 명시한다
구현 단계에서는 추상화된 클래스를 상속받아서 아직 구현되지 않은 부분을 마저 구현한다
1. 상속받을 자식 클래스의 특징에 따라 코드가 결정될 가능성이 있다면 해당 기능도 모두 abstract 키워드로 추상화
2. 실제 구현 클래스는 이 추상 클래스를 상속받아서 아직 구현되지 않은 추상화되어 있는 기능을 모두 구현
3. 추상 클래스는 독립적으로 인스턴스화할 수 없기 때문에 구현 단계가 고려되지 않는다면 잘못된 설계가 될 수 있음
abstract class Design {
abstract fun drawText() // 추상화
abstract fun draw() // 추상화
fun showWindow() {
// 코드
}
}
class Implements : Design() {
override fun drawText() {
// 구현 코드
}
override fun draw() {
// 구현 코드
}
}
- 인터페이스
실행 코드 없이 메서드 이름만 가진 추상 클래스라고 볼 수 있다
(개념 클래스 중에 실행 코드가 한 줄이라도 있으면 추상화, 코드 없이 메서드 이름만 나열되어 있으면 인터페이스)
상속 관계의 설계보다는 외부 모듈에서 내가 만든 모듈을 사용할 수 있게 메서드의 이름을 나열해 둔 일종의 명세서
interface 예약어를 사용해서 정의할 수 있고 인터페이스에 정의된 메서드를 오버라이드해서 구현할 수 있다
class 키워드는 사용되지 않는다
interface 인터페이스명 {
var 변수: String // var 앞에 abstract 키워드가 생략
fun 메서드1() :반환타입
fun 메서드2() :반환타입 // 일반 fun과 같이 생략할 수 있는 부분은 생략
}
class 클래스명: 인터페이스명 () {
override fun 메서드1(){
// 인터페이스의 메서드를 클래스에서 구현할때는 override
}
인터페이스 클래스에서 구현하기
1. interface 예약어로 인터페이스를 정의
2. 메서드는 코드 블록 없이 이름만 작성
3. 인터페이스의 프로퍼티와 메서드 앞에는 abstract 키워드가 생략된 형태
💡Kotlin은 프로퍼티도 인터페이스 내부에 정의할 수 있는데, 대부분의 객체지향 언어에서는 지원하지 않는다
- 접근 제한자 (Visibility Modifiers)
함수형 언어라는 특성 때문에 코틀린은 기존 객체지향에서 접근 제한자의 기준으로 삼았던 패키지 대신 모듈 개념이 도입
클래스, 인터페이스, 메서드, 프로퍼티는 모두 접근 제한자를 가질 수 있다
접근 제한자의 종류 | 제한 범위 |
private | 다른 파일에서 접근할 수 없다 |
internal | 같은 모듈에 있는 파일에서만 접근할 수 있다 |
protected | private와 같지만 상속 관계의 자식 클래스는 접근할 수 있다 |
public | 모든 파일에서 접근할 수 있다 |
각 변수나 클래스 이름 앞에 아무런 예약어를 붙이지 않았을 대는 기본적으로 public 접근 제한자가 적용된다
💡코틀린에서 모듈이란 한 번에 같이 컴파일되는 모든 파일이다