GDSC HUFS 4기/Kotlin Team #3

[3팀] Android-12-kotlin : OOP, Class, 섀도잉

eeunbii 2022. 10. 7. 22:28

이 글은 이것이 안드로이드다 with 코틀린(개정판)를 참고하여 작성하였습니다.

작성자 : 김은비

개발환경은 Windows, Android Studio입니다.

 

 

1. OOP( Object Oriented Programming, 객체지향 프로그래밍) 

ex) 자바, C#, 코틀린 등

 

< 개념 > 

  1. 변수, 타입
  2. 흐름제어
  3. 함수
  4. 컬렉션
  5. 클래스, 객체 

변수

= 저장공간에서의 위치 

-> 저장공간이 어디인지 나타내기 위해 고유의 이름(ID)을 정해야 함

 

흐름제어

= 조건이 맞는 경우에만 코드 실행, 조건이 맞는한 코드를 반복해서 실행

 

함수

= 코드를 나눠주고 필요시 코드 블록을 실행

-> 코드 재사용시 용이

 

컬렉션

= 많은 요소를 한 군데에 저장하게 해주고 흐름제어의 도움을 받아 여러 요소를 반복 실행 해줌

-> 한 곳에서 여러 값을 저장하고 싶은 경우 사용

 

클래스

= 직접 데이터 타입을 만들게 해주고, 데이터 멤버와 데이터 메서드를 한 곳에서 관리

-> 여기서 데이터 메서드는 코드를 알아보기 쉽고 유지 가능하게 도와줌

 

2. 클래스와 객체 ( Classes & Objects )

ex) 자동차 클래스

 

클래스 = 몸체

속성 = 최고 속도, 바퀴 개수, 창문 개수, 문 개수 등 ---> 변수

기술 = 운행, 정지 ---> 메서드

 

클래스와 객체

 

클래스를 만드는 것 = 새로운 설계도를 만드는 것

 

클래스 = 속성과 기술을 정의해주는 설계도

객체 = 클래스로 만들어진 결과물

 

3. 클래스와 초기화

// class 생성
class Person (_firstName: String, _lastName: String) {

    // 멤버변수(특성)
    var firstName: String = _firstName
    var lastName: String = _lastName
 
    // 초기화
    init {
        println("Initialized a new Person object with firstName = $firstName and lastName = $lastName")
    }
}

// class 생성 with 보조생성자
class Person constructor(_firstName: String, _lastName: String) { // constructor = 보조생성자 -> 기본 생성자와 다른 생성자를 제공 -> 객체(인스턴스) 생성 시 편의 제공 or 추가적 구문 수행 
    // 멤버변수(특성)
    var firstName: String
    var lastName: String
 
    // 초기화
    init {
        this.firstName = _firstName
        this.lastName = _lastName
 
        println("Initialized a new Person object with firstName = $firstName and lastName = $lastName")
    }
}
 
// class 생성 with 멤버변수
class Person(var firstName: String, var lastName: String) {
    // 초기화
    init {
        println("Initialized a new Person object with firstName = $firstName and lastName = $lastName")
    }
}
 
// class 생성 with 멤버변수 + 기본값 할당
class Person(var firstName: String = "John", var lastName: String= "Doe") {
    // 초기화
    init {
        println("Initialized a new Person object with firstName = $firstName and lastName = $lastName")
    }
}
 
// 객체 생성
    val denis = Person("denis", "Panjuta")
    val john = Person()
    val johnPeterson = Person(lastname: "Peterson")

 

4. 변수 영역과 섀도잉

 

fun main(){
	//함수의 매개변수는 생성 시 값을 가질 수 없고, 함수가 호출될 때만 인자를 가질 수 있음
    myFunction(a:5)
}

// parameter(매개변수)
fun myFunction(a:Int){
	// a = 변수
    var a = a // -> print 5
    
    var a = 4 // -> print 4
    
    
    /*
    	Point
    	1. 7번째줄 a와 9번째줄 var a는 다른 존재
        2. 코틀린 메서드에서 변수와 매개변수의 이름을 같게 설정하면 발생하는 문제
        	= 섀도잉
            = 매개변수와 인자가 같은 이름을 가질 경우 지역 매개변수가 외부 스코프(함수)에 있는 인자를 가림 
            -> 시스템 내 다른 곳으로부터 코드를 디커플링하는데 힘듦
            (디커플링 = 인터페이스를 사용하여 모듈 끼리의 의존성을 감소시키고 유지보수 효과를 높이는 방법)
    */
}