일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 우송대 라즈베리파이 피코
- 업캐스팅
- 공약수
- ATmega328p
- 카이캐드 다운로드
- ESP32_S2
- ESP32_S2_WROVER
- 개발 보드
- L293D
- 7세그먼트
- Arduoin
- 유클리드 호제법
- 약수 구하기
- 우송대학교
- string함수
- 추상화함수
- 아두이노 모터 드라이버
- GCD
- 재정의함수
- 우송대
- PICO4
- androidstudio
- 라즈베리파이 피코
- KiCad
- 카이캐드 설치
- 안드로이드스튜디오
- 아두이노
- kotlin
- 코틀린
- 카이캐드
- Today
- Total
개발자의 생활
스코프, 접근제한자 + 프로젝트 구조 본문
이번에는 접근 제한자 에 대해 알아보겠습니다.
접근제한자를 알기 위해서는 프로젝트 구조에 대해 먼저 알고있어야 하기 때문에 코틀린 프로젝트 구조를 먼저 살펴보겠습니다.
***프로젝트 구조는 자바와 동일하기 때문에 자바를 알고 계시다면 넘어가셔도 됩니다.***
프로젝트 구조는 물리구조와 논리구조로 구분할 수 있습니다.
물리구조
Hello 라는 이름의 프로젝트를 생성하게 되면 기본으로 Hello 라는 이름의 모듈이 자동으로 만들어지게 됩니다.
그리고 모듈 내부에 프로젝트를 구성하는데 필요한 기본적인 파일들과 폴더가 만들어져 있습니다.
모듈은 기본으로 생성되는것 이외에도 개발자가 추가로 생성할수도 있고 누군가 만들어 놓은 모듈을 가져다 사용할 수도 있습니다.
지금 위 구조가 물리구조에 해당합니다. 실제 프로젝트 내부에 파일로서 존재하기 때문에 물리구조라고 합니다.
논리구조
물리구조 모듈 내부에 있는 src 폴더 내부에는 패키지가 있고 패키지 내부에 클래스, 함수, 변수등 이 존재하게 됩니다.
위 구조를 논리구조라고 합니다.
사실 패키지도 물리적으로 폴더가 만들어지지만 패키지의 본질적인 목적과 역할이 코드를 논리적으로 그룹화 하기 때문에 논리구조에 속하게 됩니다.
스코프
스코프는 패키지, 클래스, 함수 사이에서 맴버를 공유할 수 있는 범위를 나타내는 것입니다.
예를들어
패키지 내부에 클래스와 함수 변수가 있으면 이 요소들은 패키지 스코프 내부에 존재하기 때문에 서로 공유할 수 있습니다.
그리고 스코프 범위에 있는 클래스에서 함수를 만들게 되면 이 함수는 클래스의 스코프 범위에 존재하게 됩니다.
스코프에는 규칙이 존재합니다. 사실 클래스를 배우면서 스코프 규칙을 따르고 있었는데요 이번에 자세히 한번 알아보겠습니다.
규칙1
스코프 외부에서는 내부에 있는 맴버를 참조 연산자를 이용해서 접근해야 합니다.
저의가 클래스를 만들고 클래스의 객체를 생성해서 클래스 내부의 함수나 변수를 사용하기 위해 "." 참조 연산자를 이용해서 접근하였습니다. 또한 아직 배우지는 않았지만 외부 패키지에서 클래스에 접근하기 위해서는 임포트를 해야합니다.
fun main() {
val testClassA = TestClassA()
testClassA.valueInt
}
class TestClassA{
val valueInt = 10
}
(예시코드)
규칙2
동일한 스코프 내에서는 맴버들을 바로 공유할 수 있습니다.
이것도 많이 사용하고 있습니다. 클래스 내에서 변수를 생성하면 동일한 클래스 내에 존재하는 함수에서 사용할 수 있는것입니다.
fun main() {
var valueInt = 5
println(valueInt)
valueInt = 10
for (i in 0..< 5){
valueInt += i
}
println(valueInt)
}
(예시코드)
규칙3
스코프 내부에서는 상위에 존재하는 맴버를 가져다 사용하는것을 물론 재정의를 할 수 있습니다.
클래스를 생성하고 변수를 생성하면 해당 변수는 클래스 내부에 존재하는 함수 내부에서 사용뿐 아니라 동일한 이름으로 재정의가 가능합니다.
var valueInt = 5
fun main() {
var valueInt = 0
println(valueInt)
valueInt = 10
for (i in 0..< 5){
valueInt += i
}
println(valueInt)
}
(예시코드)
접근 제한자
프로젝트를 진행하면서 다양한패키지와 클래스 함수등을 만들고 모듈을 만들면서 프로그램을 개발하게 되는데 각각의 패키지와 클래스 함수가 많아지고 연결되면서 프로젝트가 망가지거나 문제가 발생하지 않도록 사전에 미리 각각의 파트별로 접근을 제한하는것이 중요합니다.
예를들어
A클래스에서 B클래스를 상속받고 있는데 특정 변수나 함수는 변경하면 안되는데 변경이 가능하기 때문에 실수로 변경하는 코드를 만들게 되면 문제가 발생하게 됩니다. 이를 사전에 방지하기 위해 변경하면 안되는 것은 접근을 제한하여 변경을 못하도록 막아 놓으면 이렇한 불상사가 발생하지 않게 될 수 있습니다.
접근 제한자는 4가지 종류가 있습니다.
public | private | protected | internal |
모든 곳에서 접근가능 | 하위 스코프에서만 접근 가능 | private + 상속받은 클래스 접근가능 |
같은 모듈 내에서 접근가능 |
여기서 만약 아무것도 변수나 함수앞에 붇이지 않는다면 기본으로 public 로 동작을 하게 됩니다.
그리고 패키지에서는 protected 를 사용할 수 없습니다. 이유는 상속을 받아야만 접근이 가능하지만 패키지를 상속받을 수는 없기 때문에 의미가 없는것입니다.
참고출처: https://www.youtube.com/watch?v=ewrozSyi8kE&list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN&index=13
'kotlin(코틀린) 강좌' 카테고리의 다른 글
고차함수, 람다함수 (0) | 2024.10.24 |
---|---|
업, 다운 캐스팅 (다형성) (0) | 2024.10.22 |
class 사용 (4) | 2024.09.16 |
조건문, 반복문 (연산자) (2) | 2024.09.09 |
함수 (0) | 2024.08.30 |