본문 바로가기

전체 글100

TIL: 20231207 코틀린을 배우면서 느끼는 거지만 이 언어는 안전성을 최우선으로 두고 있는 것 같다. var orderList = ArrayList() var coffee= Drink() var tea= Drink() orderList += coffee // 들어간다 orderList += tea // 들어간다 var cat = Animal() orderList += cat // 안들어간다 하다보니 다른 타입의 객체를 한 리스트에 넣게 되었는데 컴파일에서 빨간 색으로 안된다고 표시를 해준다. 원시타입과 스트링 같은 경우는 같은 리스트에 넣을려면 컴패러블이라는 타입으로 둘 다 넣을 수 있어서 될 줄 알았는데 안되더라.... 왜 안되나 검색해보았다. 공변성과 반공변성 모든 타입을 넣을 수 있는 제너릭타입을 찾다가 나온 내용이.. 2023. 12. 7.
TIL: 클래스와 객체 클래스와 객체의 관계에 대해 설명할 때 붕어빵과 붕어빵틀이라는 예시를 자주 듣는다. 정말 와닿는 비유이다. 누가 처음 생각한지는 모르겠지만 좋은 비유라고 생각한다. 다만... 개념은 알겠는데 막상 '이제 만들어봐~' 하면 뭐부터 해야할지 난감하다. class 는 설계도같은거다. 가령 카페 주문 시스템을 만든다고 생각해보자. 과일주스, 에이드,커피,차,과자,케익 등 다양한 마실 것들을 팔 것이다. 이 모든 것들을 담을 수 있는 클래스를 만들려고 한다. 하나 예를 들면 커피는 음료수이면서 커피에는 디카페인 옵션도 있고 얼음을 추가할 수도 있다. 하지만 커피에는 과당이 들어가지 않는다. 탄산수도 들어가지 않는다. 이런 경우라면 어떻게 클래스를 만들어야할까? 우선 공통점과 차이점을 구분해보자. 공통점 마실 것,.. 2023. 12. 6.
TIL: 코틀린 readLine(), readln(), 숫자만 입력하기 readLine()과 readln()의 차이 var str:String = readLine() var str2:String = readln() 키보드로부터 입력받을 수 있는 함수이다. 둘 다 String타입으로 받는다. 이름이 비슷해서 똑같은 거 아니야? 라고 생각할 수 있지만 이 둘은 다르다. readLine()은 null 값도 받을 수 있다. 하지만 readln()은 null값을 받을 수 없다는 차이가 존재한다. 그러니 용도를 구분해서 쓰도록 하자. fun main() { var num = isNumber() } fun isNumber() : Int{ while (true) { try { var num = readln().toInt() return num } catch (e: NumberFormatE.. 2023. 12. 5.
TIL: git clone, git branch, git switch , data class , 생성자 ,상속, 인터페이스 git clone "주소" //프로젝트를 복사하기 git switch "브랜치 이름" //브랜치 바꾸기. 최근에 추가된 명령어이다. git checkout "브랜치 이름" //브랜치 바꾸기. 위랑 같은 역할 git branch //현재 브랜치 확인 git push origin "브랜치 이름" //해당 브랜치로 올리기 data class data class 클래스이름 { 정보1 정보2 } 프로퍼티만 갖고 있는 클래스이다. 앞에 data를 붙이면 된다는데 사용해본 적이 없어서 모르겠다. sealed class sealed class 부모클래스 { class 자식클래스1 : 부모클래스생성자 class 자식클래스2 : 부모클래스생성자 } open class를 붙이면 상속을 해줄 수 있다. 앞에 sealed를 붙.. 2023. 12. 4.
TIL: 변수, 상수, array,list,String 연산 변수 var myName: String = "Burt.K" var myAge: Int var myName = "Burt.K" 코틀린은 변수를 선언할 때 타입을 변수명 뒤에 :(타입명)으로 입력한다. 선언만 해놓을 때도 마찬가지인데 초기화값에 따라서 추론하기 때문에 타입을 굳이 명시하지 않아도 된다. val myName: String = "Burt.K" val myName = "Burt.K" val은 value의 약자로 바뀌는 것이 고정적인거라서 수정이나 불가능하다. 상수 fun main() { println(ExamClass.CONST_VAL) } class ExamClass(){ companion object{ const val CONST_VAL = 100 } } 우리가 아는 불변하는 값이 상수다. 예.. 2023. 12. 1.
TIL: readLine() , 매개변수 디폴트(기본값) 설정 var answer: String = readLine()!! var answer: String? = readLine() 키보드 입력을 받는 함수이다. 타입은 String? 으로 null값이 올수도 있다. class Custom(money:Int=50000000) { // =5000...이 디폴트값이다. var haveMoney:Int=money fun spend(money:Int){ haveMoney-=money } } class Custom(name:String="unknown") { // ="unknown"이 디폴트값이다. var haveMoney:Int=money fun spend(money:Int){ haveMoney-=money } } 매개변수 뒤에 = 하고 뒤에 붙여주면 된다. 2023. 11. 30.
TIL: 코틀린에서 !!의 뜻 코테에서 array[i]!!.get() 이런 식으로 뒤에 !!를 붙이는 답변을 봤다. 찾아보니 !! 의 뜻은 null이 아니다 라고 선언하는 것이다. val name1: String? = "과일" val name2: String = name1 // 에러 val name3: String? = name1 // 정상 val name4: String = name1!! // 정상 위에 예제를 보다싶이 String 과 String?은 같은 타입이 아니다. String?을 String에 넣어주려면 뒤에 !!을 붙어주어서 null일 수 없다고 알려줘야 넣을 수 있다. 2023. 11. 29.
TIL: 안드로이드 스튜디오 TableLayout, 프로젝트 생성 시 빨간 글씨 TableLayout //행 //열 //열 //행 //열 //열 계산기를 만들려다가 LinearLayout 보다는 TableLayout이 더 적당한 거 같아서 바꿨다. 말 그대로 표처럼 레이아웃을 짜고 싶을 때 쓰면 좋을 거 같다. android:layout_weight="1" weight는 50dp, 100dp 이렇게 딱 떨어지는 값이 아니라 비율로 화면을 분활하고 싶을 때 사용한다. weight의 총합이 10일 때 1은 10분의 1만큼 차지한다. 상대적인 값이다. 프로젝트 생성 시 빨간 글씨 new로 생성했는데 파일 전체가 빨간 글씨가 떴다. 분명 문법오류 없는데... 왜 그런가 했더니 git에 등록된 폴더에서 생성했기 때문에 그런거였다. 구글링해서 해결방법을 찾아봤지만 나한테 적용가능한 해결법은 없.. 2023. 11. 28.
신마법의 대륙 패왕의 진군 근황 : 전사 73리모탈 찍었다! 10년만에 오랜만에 생각나서 복귀했다. 자동사냥이 생겨서 그냥 켜놓고 다른 작업하면 되니 편해졌다. 원래 음유시인이었는데 파티사냥을 못해서 솔플이 쉬운 전사로 갈아탔다. 자동사냥 돌리다보니 어느덧 73리모. 방치형 게임처럼 키우고 있다. 성기사인데 네크로맨서이면서 악마를 소환한다니... 이 무슨 괴랄한 컨셉인가 싶지만 이 게임은 그게 가능하다. 환생(리모탈 뒤에 생긴 상위개념) 하면 해당 직업도 아닌데 직업전용스킬을 쓸 수 있다. 마법사+검사, 음유시인+검사, 전사+성직자 또는 전사+마법사+도둑+성직자+음유시인+소환술사로 모든 직업을 다 가질 수도 있다. 아쉬운 점은 소환술사나 네크로맨서가 된다고 해서 소환몹을 여러개 소환해서 때리는 게 아니라 한 마리만 가지고 다닐 수 있어서 매우 기대는 안하는 게 좋다. 2023. 11. 27.