0101011001010111

kotlin4-1 접근제한자 본문

Kotlin/스파르타_코틀린 문법

kotlin4-1 접근제한자

[진주] 2023. 8. 2. 07:32
728x90
반응형

접근제한자

: 변수나 메소드의 접근을 제한 할 수 있는 기능

ㄴ 객체를 이용해서 변수나 메소드를 호출 할 수 있는지의 여부를 접근이라고 합니다.

 

+) 우리가 인스턴스 만든 객체이름 변수.xxx 했던거 이런게 접근하는거다 ^ㅁ^ (껄떡껄떡)


일단 접근제한자는 접근범위가 범위로 나뉘기 때문에 범위로 알아야한다.

[프로젝트 / 모듈 / 패키지]라는게 나오는데,

이건 코틀린에서 

이 Project를 누르고 보면 범위 확인이 좀 더 쉬워진다.


자, 그럼 강의로 돌아가서 

[프로젝트 / 모듈 / 패키지] 에 대해 알아보겠다.

 

1.프로젝트

: 최상단 개념이고 <모듈,패키지,클래스>를 포함한다.

 

이런건 그림 그리면서 이해하는게 최고! 

최 상단 개념인 프로젝트. 이녀석이 모든 녀석을 감쌀것이다.

 

안드로이드에서의 프로젝트 위치를 확인해보자.


2.모듈

모듈이라는 것은 프로젝트 아래에 있는 개념이고, 패키지/ 클래스를 포함합니다.

이런 느낌이다.

우클릭해서 모듈이 생성가능한지 확인해보자.

가장 최상단에 있는 app의 경우 모듈 생성이 가능하다.

최상단에 있는걸 우클릭해서는 만들 수 있지만, 하위에 있는 어떤걸 클릭해도 저 모듈이 나오지 않는다.

그러므로 강의 내용되로 최상단 (프로젝트) 바로 아래 위치하는 것이 모듈인 것을 한 번 더 확인 할 수있다.

ㄴ 직접 해봐야 머릿속에 잘 박힘.


3.패키지

: 패키지라는 건 모듈 아래의 개념이고 클래스를 포함한다.

짜란 'ㅇ' 크

 

 

 

패키지는 모듈 아래 만들 수 있고,

패키지 안에 또 패키지를 만들 수도 있는 것을 확인했다!!!!! 

   (ㅎ1ㅎ1 이건 강의내용과 달리 내가 발견해서 기쁘다)

쫌 코틀린 고수폼 나지 않는가? ('ㅇ'캬하핳핳ㅎ핳ㅎ핳... 강의 정리로 돌아가겟다.)

 

패키지는 익숙할거다. // 이게 우리가 알고 있는 일반적인 디렉터리 라고 보면 되겠다.


Kotlin 접근 제한자의 종류

 

public: 명시하지 않으면 기본적으로 public 입니다 (어디서나 접근할 수 있어요)
private: 동일한 클래스 내부에서만 접근할 수 있습니다
internal: 같은 모듈 내부에서만 접근할 수 있습니다
protected: 기본적으로 private이지만 상속을 받은경우에 타 모듈에서 접근할 수 있습니다

 

ㄴ 이 부분은 쓸 때마다 찾아봐야 할 것 같다.


접근제한자가 필요한 이유.

1. 접근 권한을 통해 데이터에 대한 무분별한 접근 막을 수 있음.

2. 클래스간에 접근하면 안되는 상황을 구분하기 때문에 향후 유지보수가 용이

 

: 난 게임을 좋아하니 게임에 비유하자면, 만약 유저가 골드나 캐시포인트 같은것에 조작할 수 있게 접근이 되면 안된다. 예를들어 운영자 계정으로만 접근이 가능하게 만든다던지...

이 아이템은 어떤 던전에서만 쓸수있게 설정해 놓는다던지

접근제한자는 여러모로 유용한 기능일 것 같다.

 


접근제한자의 예제

 

먼저, AccessTestClass.kt를(클래스) 만들고, 다음과 같이 코드를 작성해보자.

 

class AccessTestClass {
    public var a:Int = 1
    var b = 2
    private var c = 3
    internal var d = 4
    protected var e = 5
    
    public fun publicTest() {
        println("public 입니다")
    }

    fun publicTest2() {
        println("public 입니다")
    }

    private fun privateTest() {
        println("private 입니다")
    }

    internal fun internalTest() {
        println("internal 입니다")
    }

    protected fun protectedTest() {
        println("protected 입니다")
    }
}

 

 

아니 티블로그 이거 코드로 어떻게 표시하는지 티블로그 어제 처음 시작해서 잘 모르겠음.......

 

코드 하나하나 살펴보기 ▼

여기서 public은 어차피 안쓸경우 기본값이 public이기 때문에 없어도 된다.

 

public: 명시하지 않으면 기본적으로 public 입니다 (어디서나 접근할 수 있어요)
private: 동일한 클래스 내부에서만 접근할 수 있습니다
internal: 같은 모듈 내부에서만 접근할 수 있습니다
protected: 기본적으로 private이지만 상속을 받은경우에 타 모듈에서 접근할 수 있습니다

ㄴ 권한 내용 다시한 번 복기!!

 

private var c = 3

c의 경우 private가 붙었다.

private: 동일한 클래스 내부에서만 접근할 수 있습니다

 

internal var d = 4

internal: 같은 모듈 내부에서만 접근할 수 있습니다

 

protected var e = 5

 

protected: 기본적으로 private이지만 상속을 받은경우에 타 모듈에서 접근할 수 있습니다


객체. xxx

하는게 접근이라고 했으니까 직접 실험을 해보자.

아까 만든 클래스 말고, Main.kt를 만들어, main함수를 작성해주자.

 

자 이렇게 실행할 경우, a,b,d만 나오는 것이 보인다.

왜 ? 

public var a:Int = 1

a : public임 // 어디서나 접근 가능한 친구.

var b = 2

b : 앞에 아무것도 안쓸경우 public임. // 이친구도 어디서나 접근가능 

internal var d = 4

d :  internal // 같은 모듈 내부에서만 접근할 수 있습니다

자 이 파일의 구조를 보면 app이라는 모듈 안에 accessTestClass와 Main이 함께있음.

그렇기 때문에 같은 모듈 안이라 접근 가능한 것임.

private var c = 3
protected var e = 5

c,e가 안되는 이유?

- c : 동일한 클래스 내부에서만 접근할 수 있으므로 main에서는 접근할 수 없다.

- e : 상속을 받는다면 접근 가능하겠지만, 위 코드에서는 상속을 하지 않았기 때문에 private로 취급된다.

 

public: 명시하지 않으면 기본적으로 public 입니다 (어디서나 접근할 수 있어요)
private: 동일한 클래스 내부에서만 접근할 수 있습니다
internal: 같은 모듈 내부에서만 접근할 수 있습니다
protected: 기본적으로 private이지만 상속을 받은경우에 타 모듈에서 접근할 수 있습니다

 


위에 배운 4개 중 protected가 제일 헷갈릴텐데

(물론 나도... 어디서 상속을 받아야하는지, 누가 수퍼클래스고 서브클래스여야 가능한건지 개념이 안잡힘)

 

그래서 예제를 보자.

 

먼저 AccessTestChildClass.kt를 하나 만들자

 

그리고 이렇게 작성하고 

class AccessTestChildClass: AccessTestClass() {

    fun protectedTest1() {
        println("e의 값은 ${e}")
    }
}

 

class AccessTestChildClass: AccessTestClass()

이걸 보고 강사님은 class AccessTestChildClass는 AccessTestClass()를 상속 받으려 하고 있다고 말했다.

ㄴ ? 어딜 보면 그렇게 되는건데 ? (이해못함)

 

지난번 블로그 포스팅 한 것을 확인해 보니, 

상속 받으려고 하는 애 ( 자식 이라고 부르기도하고 서브클래스 라고 부르기도 한다)

형식이

 

자식이 상속받는 방법: 

class 자식() : 부모()

이런 형태로 상속을 받는다.

 

엄마한테 class 나() : 엄마() 라고 카톡을 보내고 open 해달라고 하면 ㅎ ㅔ..헤.....?

엄마미안 

 

부모는 앞에 open!

이엇고... 쨋든

 

 

저건 자식 옆에 괄호가 없...는데 ? 

 

일단 강의를 더 보도록하자

여기 괄호 잘못쓰셧나봄 쓱 지우심 

나도 지우고 다시 따라가보기

 

자 오류 밑줄이 뜨는데

이렇게 뜬다.

 

자, 생각해보자

 

코틀린 입장에서는 

AccessTestChildClass < 얘가 어이가 없을거다.

AccessTestClass는 쟤 부모가 아닌데 상속해달라고 징징거린다.

 

경고로 넌 부모 없자나 를 좋은 말로 표현해서

Make'AccessTestClass''open'  이라고 돌려말한다. (부모를 만들어오세용 고갱님 ^ㅁ^// 이런뜻)


부모없는 AccessTestChildClass에게 부모(수퍼클래스)를 만들어주자.

이 친구는 AccessTestClass를 부모로 두길 원한다.

 

그럼 간단하다.

 

AccessTestClass 클래스 들어가서

여기 표기해둔 맨앞에 open 이라고 적기만하면 된다.

자식이 이렇게 저장해놨다면 조심하자

자, 이제 부모가 되었으니, 아까 강사님이 지웠던 그 소괄호를 () 다시 넣자 ( 이걸 받아준다고 표현하시더라)

자, 이상태에서는 e를 쓸수 있다. 

protected var e = 5

e는 protected 

protected: 기본적으로 private이지만 상속을 받은경우에 타 모듈에서 접근할 수 있습니다.


여기까지 스무스하게 이해했다.

 

다음은 Main.kt에  다음 코드를 넣어 확인해보자.

 

fun main() {
    var accessTestClass = AccessTestClass()   <<얘는 이제 의미 없는 애가 됨.어디서도 안쓰임 지금
    var accessTestChildClass = AccessTestChildClass()

// . 하고 접근가능한 요소를 확인
//    accessTestClass. 
    accessTestChildClass.protectedTest1()
}

 

 

이런 결과 값이 왜 나오는지 이해하였다. 넘어가자 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형