GDSC HUFS 3기/Android with Kotlin Team 2

[2팀] Kotlin Section7_OOP(1)

어둠의 그림자 2021. 10. 5. 06:29

이 글은 udemy 강의를 참고하여 작성하였습니다.

작성자 : 김민서

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


1. 함수(22)

 

a) 매개변수( parameter )

fun printToLog(message: String, secondMessage: String, MyInt:Int){
        Log.i("FUNCTION RUNNED : ", message+ secondMessage)
    }

✔ 위의 함수에서 매개변수 MyInt 와 같이, 사용하지않는 매개변수를 작성해도 오류가 나지않는다.

 

b) 반환값 (return)

✔ kotlin에서 모든함수는 기본적으로 void형이다.

✔ 아래와 같이 함수뒤에 세미콜론으로 반환형을 적어주면 된다

//Int 반환형 예시
fun getAsum(a:Int, b: Int): Int{
	return a+b
}
     
 //float 반환형 예시
 fun getBsum(radius:Float):Float{
 	return 3.14f*(radius*radius)
 }

✔ return문을 break나 goto문 처럼 사용하기도 함

//return을 다시 calling code로 돌아가기위해 사용
    fun printUpTo3(aNumber: Int){
        if(aNumber > 3){
            Log.i("a Number is","TOO BIG")
            return
        }
        Log.i("a Number is", " NUMBER")
    }

2. OOP(객체 지향 프로그래밍)(23-25)

: 요구사항을 관리하기 쉬운 덩어리(객체)들로 나누는 방식

이 객체들은 다른 프로그램들에서 잠재적으로 사용가능하다

클래스 : 함수를 포함하는 코드 묶음의 컨테이너(blueprint;설계도)

 

 

a) OOP의 핵심원칙

 

  • 캡슐화(capsulizaiton): 사용자가 지정한 변수및 함수만 허용하는 기능 (private,public와 같은 접근제한자 사용)
  • 다형성(polymorphism): 같은 모양의 코드가 다른 기능을 하는것(오버라이딩, 오버로딩)
  • 상속(inheritance): 자식클래스가 부모클래스를 선택하여 사용하는것

다형성을 잘 이용하면 상속을 통해 기능을 확장및 변경을 가능하게 해주며, 코드길이도 줄여줄수있음

상속을 이용함으로써 다른클래스의 이점을 활용할수있음

(강좌에서는 예시로 세상에서 가장강한남자와 똑똑한여자의 자녀를 상속의 예로 들음)

다형성 참고사이트

 

 

b) 클래스 사용하기(객체(instance)로 찍어내기)

OOP의 개념을 적용한 클래스를 사용해보자

클래스는 주로

클래스 선언 -> 객체 생성

순으로 사용된다.

기본 사용방식은 아래 코드와 같다.

//객체 생성Syntax
//선언형 객체이름 = 클래스()
val soldier1 = Soldier()

//class 선언 syntax
//class 클래스이름{
//포함하고싶은 함수,변수 작성
//}
class Soldier{
	val name = "John"
    val rank = "Private"
    val missing = true
    val dob = 1988
  
}

아래의 코드를 통해서 device에 클래스 변수들을 출력해보고, boolMissing 변수의 경우 값에 따라 텍스트를 출력하는 실습을 진행했다

//예제 코드
val soldier1 = Soldier()
//soldier1.getStatus()
val isMissing: TextView = findViewById(R.id.isMissing)
val soldierName: TextView = findViewById(R.id.soldierName)
val soldierRank: TextView = findViewById(R.id.soldierRank)

val textName = soldier1.name
val textRank = soldier1.rank
val boolMissing: Boolean = soldier1.missing
val DOBsoldier: Int= soldier1.dob

if (boolMissing){
	isMissing.setText("SOLDIER MISSING")
    }
soldierName.setText(textName)
soldierRank.setText(textRank)
soldierDOB.setText(DOBsoldier.toString())

class Soldier{

	val name = "John"
    val rank = "Private"
    val missing = true
    val dob = 1988
    
    fun getStatus(){
    	var status ='$rank'
        if(missing){
        	status = "$status SOLDIER IS MISSING"
       }else{
       		status = "$status, READY FOR DUTY"
            }
         }
  
}

 

C) getter,setter

👏getter, setter란?

  :OOP에서는 객체의 데이터는 객체외부에서 직접적으로 접근함을 지양한다. 따라서 데이터는 외부에서 접근하지못하도록 막고, 메소드는 공개하여 외부에서 메소드를 통해 접근하도록 하는것이다.

여기서 getter는 필드값을 가져올때 (외부에서 객체의 데이터를 읽을때)

setter는 외부에서 필드값을 변경할때 사용한다.

 

ex) 클래스에 선언한 변수의값을 가져올때 soldier.name와 같이 DOT구문을 사용한다 : 코틀린은 내부적으로 setter를 사용함의 예시

✔ 변수형에 따라  getter, setter의 작동유무가 다름

    - var : getter, setter 제공 ( 다시 선언될수있음)

    - val : getter만 제공 (앱이 돌아가는동안 한번만 선언될수있음)'

참고블로그1

참고블로그2

//getter,setter 활용예제
var soldier = Soldier()
Log.i("BULLETS= ","${soldier.bullets}") // GETTER 실행
soldier.bullets--
Log.i("BULLETS= ","${soldier.bullets}") // SETTER 실행


class Soldier{

   val name = "John"
    val rank = "Private"
    val missing = true
    val dob = 1988
    
    var bullets = 100
    	get() {
        	Log.i("Getter is USED", "VALUE:$field")
            return field
        }
        set(value){
        	field = if(value<0) 0 else value
            Log.i("SETTER is USED", "NEW VALUE:$field")
        
        }
    
    fun getStatus(){
    	var status ='$rank'
        if(missing){
        	status = "$status SOLDIER IS MISSING"
       }else{
       		status = "$status, READY FOR DUTY"
            }
         }
  
}