Kotlin Study(2) 값을 담아두기

chanykim·2021년 5월 1일
0

Kotlin

목록 보기
2/2

missing constraints in constraintlayout 오류 해결방법

빈 화면에 plain Text를 넣으니까 이러한 오류 메세지가 나왔다.
그럴 때 아래 그림에서 빨간색 동그라미를 누르면 해결이 된다.

그러면 이러한 오류를 보인 이유가 무엇이고, 저 버튼은 뭐길래 누르니까 해결되는 것일까.

일단 저 버튼의 이름은 infer constraints으로 레이아웃을 검사하여 모든 보기에 가장 효과적인 제약조건 집합을 결정하는 기능이라 한다. 즉, 정렬되지 않은 위젯들을 자동으로 정렬해주는 기능이다!

오류 상태일 때

infer constraints버튼을 눌렀을 때

변수 선언

변수를 선언하는 것은 C언어같이 int, double을 붙여서 하는게 아니라 var를 붙인다.
만약 변수의 크기를 지정해야한다면 변수의 이름 뒤에 콜론(:)기호를 붙이고 자료형을 지정한다.

형식: var 변수 이름:자료형 = 초깃값 
예제: var name:String = ""

이 변수에 값을 할당할 때는 등호(=)기호를 사용하는데 변수를 만들 때 값을 바로 할당할 수 있고 나중에 할당할 수도 있다.
저기 예제에서 변수를 만들면서 동시에 ""값을 할당하는데 ""값은 빈 문자열을 의미한다.

또 하나의 변수명이 있다. 바로 val.

형식: val 변수 이름:자료형 = 초깃값 
예제: val name:String = "무야호"

그러면 이 두개의 차이는 뭘까?

var name:String = "무야호"
val name:String = "무야호"

var는 변수에 값을 넣거나 뺴는 것이 모두 가능하지만 val는 변수에 한번 값을 넣으면 뺴는 것만 가능하다.
즉, 읽기 전용 변수를 말한다.

이렇게 값을 바꿀려고 하면 오류가 뜬다.

코틀린은 타입 기반의 언어이기 때문에 기본적으로 자료형을 함께 명시한다.
자바와 코틀린이 자료형을 명시하는 방식

java: int count = 0;
kotlin: var count : int = 0

항상 변수 이름 앞에 var나 val를 붙어야하는데 변수를 다른 것과 구별하기 위해서이다.
주의할 점은 두 개의 변수 앞에 똑같이 var을 붙였어도 메모리에 만들어진 실제 변수상자의 크기인 자료형은 각각 다를 수 있다는 것이다.
자료형을 명시하지 않고 변수 상자를 만드는 경우 변수상자의 크기를 변수에 할당된 값에 의해 결정된다.
즉, 정수가 할당되면 그것에 맞는 변수상자가 만들어지고 문자열이 할당되면 그 문자열에 맞는 변수상자가 만들어진다.

변수상자의 자료형을 생략한 경우 변수의 자료형을 알아서 결정할 수 없는 상태가 되어 문제가 생긴다. 따라서 자료형을 명시하지 않았을 때는 무조건 초깃값을 넣어야 한다.

<형식>
var 변수이름 = 초깃값
val 변수이름 = 초깃값

<예제>
var name = "무야호"
var count = 10

문자열 출력 표현식

큰따옴표 안에서 문자열을 출력할 때 의 형식

<형식>
$변수 이름
${표현식}

<예제>
$name
${a + b}

작은따옴표 안에서 문자열을 출력할 때 의 형식

<형식>
${'"'}
${'$'}

<예제>
${'"'} ${'$'quantity} ${'"'}

널 허용 자료형

널 허용 자료형으로 만들기

형식: val 변수 이름:자료형?
예제: val name:String?

널 허용 자료형을 원래의 자료형으로 언래핑

널 허용 자료형은 원래의 자료형이 가지는 값을 감싸고 있는 모양으로 만들어진다. 이것을 래핑이라 하고, 자료형을 감싸놓은 것을 벗기는 과정을 언래핑이라 한다.
그리고 자동으로 벗겨지도록 만들 수 있는데 이것을 암시적 언래핑이라고 한다.

형식: 변수 이름!!
예제: name!!

널 허용 자료형을 넣을 수 있는 널 허용 자료형

형식: val 변수 이름:자료형? 
예제: val name:String?

초깃값을 할당하고 싶지 않은 경우에 붙이는 lateinit

형식: lateinit var 변수 이름:자료형
예제: lateinit var mobile:String

이것을 늦은 초기화라고 부른다.

주의
1. lateinit은 var속성에서만 사용가능
2. 널 허용 자료형에는 사용 불가
3. 기본 자료형에 해당하는 속성에는 사용 불가
4. 생성자에는 lateinit 사용 불가
5. lateinit은 사용자 정의 Getter/Setter를 사용하는 속성에는 사용 불가

*안전한 호출 방식

안전한 호출 방식

형식: 변수 이름?.함수나 속성이름

?. 기호를 붙이면 변수에 들어있는 값이 null이 아닌 경우에만 뒤에 붙은 속성에 접근하거나 함수를 호출한다.

엘비스 연산자
null인 경우에도 어떤 기능을 실행하도록 하고 싶을 때 ?: 기호를 사용한다.

형식: 변수 이름?:함수나 속성 이름
에제: val nameLength = name?.length ?: 0

과제: 변수에 값을 저장한 후 화면에 출력하기

  • 다섯 개의 숫자를 입력받아 숫자로 변환한 후 합한 결과를 화면에 출력합니다.
  • 앱 화면에는 다섯 개의 입력상자, 한 개의 버튼, 그리고 하나의 텍스트뷰를 추가한다.
  • 입력상자의 inputType 속성 값을 numberSigned로 설정하여 입력시 숫자 입력 키패드가 뜨로록 한다.
  • 입력상자에 숫자를 입력하고 버튼을 누르면 입력상자에서 글자를 가져와 String? 자료형의 변수에 넣었다가 숫자로 형 변환하여 위에서 선언한 속성에 넣어줍니다.

이번 과제는 요구사항에 만족하면서 만들어야해서 좀 걸린 것 같다. 10분안에 하라고 하는데 30분은 더 걸린 것 같다.. 계속 보고 하면서 익숙해져야겠다.

class MainActivity : AppCompatActivity() {
    var num1:Int? = 0
    var num2:Int? = 0
    var num3:Int? = 0
    var num4:Int? = 0
    var num5:Int? = 0
    var sum:String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            val num1str:String? = value1.text.toString()
            val num2str:String? = value2.text.toString()
            val num3str:String? = value3.text.toString()
            val num4str:String? = value4.text.toString()
            val num5str:String? = value5.text.toString()

            num1 = num1str?.toInt()
            num2 = num2str?.toInt()
            num3 = num3str?.toInt()
            num4 = num4str?.toInt()
            num5 = num5str?.toInt()
            val result = num1!! + num2!! + num3!! + num4!! + num5!!

            outputTxet.setText("결과: ${result}")

        }
    }
}

결과

profile
오늘보다 더 나은 내일

0개의 댓글