안드로이드 recyclerView에서 setHasFixedSize 역할

반응형
728x170

recyclerView를 사용한 앱들을 보면 setHasFixedSize를 사용하는 것을 볼 수 있다

 

이거의 역할은 무엇일까?


1. setHasFixSize의 역할

 

아래의 코드는 안드로이드 스튜디오 자바에 내장되어있는 recyclerView에 대한 함수 중 일부이다

void onItemsInsertedOrRemoved() {
   if (hasFixedSize) layoutChildren();
   else requestLayout();
}

내용을 간단하게 해석하면 hasFixedSize가 true 일 때는 지정한 item의 layout 정보를 가져오고

 

falsel일 때는 부모 layout의 layout 정보를 받아오게 한다

 

이게 무슨 뜻일까?

 

RecyclerView의 동작

 

RecyclerView는 내부 레이아웃이 변경될 때 마다 기본적으로 부모 레이아웃의 정보를 가져오고 

 

그것을 토대로 item의 레이아웃을 조절합니다.

 

hasFixedSize를 true로 하면 이 과정을 생략해서 더욱 빠르게 recyclerView를 갱신할 수 있고

 

생략한 만큼 리소스를 적게 잡아먹게 됩니다.

 


2. 그래서 setHasFixedSize 써도 되는거임?

300x250

일반적인 경우에는 쓰는 것이 좋습니다.

 

그 이유는 일반적인 recyclerView에선 레이아웃이 변경될 이유가 없기 때문입니다.

 


참조 사이트

https://woovictory.github.io/2020/06/24/Android-RecyclerView-Attr/

 

https://stackoverflow.com/questions/28709220/understanding-recyclerview-sethasfixedsize

 

Understanding RecyclerView setHasFixedSize

I'm having some trouble understanding setHasFixedSize(). I know that it is used for optimization when the size of RecyclerView doesn't change, from the docs. What does that mean though? In most co...

stackoverflow.com

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

반응형

댓글()

코틀린 안드로이드 정규식(Regex) 활용하기 -기본부터 심화

반응형
728x170

안드로이드에서 정규식은 주로 회원가입 같이 입력한 값이 특정한 양식을 따르는지 확인할 때 주로 사용됩니다.

 


1. 기본 개념 및 양식

 

^ : 문자열의 시작을 의미.
$ : 문자열의 끝을 의미.
 . : 문자 한 개를 의미. '.'이 위치한 곳에 어떤 문자든지 1개의 문자가 들어감.
[ ] : 대괄호에 있는 문자 중 한 개를 의미. [abc]는 a, b, c 중 하나를 선택.
[^] : not의 의미로, 대괄호에서 쓴다면 [^abc] : a, b, c 제외하고 나머지를 의미.
| : or을 의미. a|b : a 또는 b.
() : 공통되는 부분을 묶을 때, 서브 패턴을 지정할 때 사용. abc|abd -> ab(c|d)로 바꿀 수 있음.
? : 문자가 0회 또는 1회 등장. a? b는 a가 나올 수도, 없을 수도 있음. ab, b.
* : 문자가 0회 이상 등장. a*b : b, ab, aaab, aaab..
+ : 문자가 1회 이상 등장. a+b : ab, aab, aaab..
{n} : 문자가 n개 나옴. a {2} b : aab
{n,} : 문자가 n개 이상 나옴. a {2,} b : aab, aaab, aaaab..
{n, m} : 문자가 n개 이상 m개 이하로 나옴. a {1,3 } b : ab, aab, aaab
\s : 공백 제거
\t : 탭
\d : 숫자, [0-9]와 동일
\b : 단어의 경계, 문자 사이의 공백
\w : 알파벳이나 숫자, [a-zA-Z0-9_]와 동일

 

위의 \s, \t, \d, \b, \w는 대문자로 바꾸면 반대 의미가 됩니다. 

300x250

2. 사용 방법

 

정규식을 만드는 방법에는 여러가지 방법이 있지만

대표적인거 1개만 가르쳐드리겠습니다.

 

정규식 정의 방법

 val regex = Regex("[0-9|a-z]")

위와 같이 Regex 안에 정규식을 정의할 수 있습니다.

 

 

정규식을 사용해서 문자열 확인

 

아래의 코드는 Activity의 onCreate() 안에 정의했습니다.

// 웹 표준 형식 확인
val regexWeb = Regex("https://(.+)")
// 숫자만 있는지 확인
val regexOnlyNumber = Regex("-?\\d+(\\.\\d+)?")
// 파일 디렉토리인지 확인
val regexFileDirectory = Regex("(.+)/(.+)\\.(.+)")
// 숫자만 확인
val regexPickNumber = Regex("[^0-9]")

// 입력한 값이 https 웹 형식을 따르는지
binding.isHttpsWeb.setOnClickListener {
    if (isRegexRight(binding.editText.text.toString(), regexWeb)) {
        makeToast("알맞은 https 형식입니다.")
    } else {
        makeToast("틀린 https 형식입니다.")
    }
}

// 입력한 값에 숫자만 들어있는지 확인
binding.isOnlyNumber.setOnClickListener {
    if (isRegexRight(binding.editText.text.toString(), regexOnlyNumber)) {
        makeToast("숫자만 존재")
    } else {
        makeToast("문자 존재함")
    }
}

// 입력한 값이 파일 위치를 가리키는지 확인
binding.isFileDirectory.setOnClickListener {
    if (isRegexRight(binding.editText.text.toString(), regexFileDirectory)) {
        makeToast("올바른 파일 디렉토리")
    } else {
        makeToast("틀린 파일 디렉토리")
    }
}

// 입력한 값에서 숫자만 뽑아서 다시 반환하기
binding.pickOnlyNumbers.setOnClickListener {
    binding.textView.text =
        onlyRemainsCertainChar(binding.editText.text.toString(), regexPickNumber)
}

// 해당 정규식이 맞는지 아닌지 확인
private fun isRegexRight(text: String, regex: Regex): Boolean {
return text.matches(regex)
}

// 해당 정규식에 맞는 값을 제외하고는 전부 삭제하기
private fun onlyRemainsCertainChar(text: String, regex: Regex): String {
return text.replace(regex, "")
}

3. 주로 사용되는 정규식 모음

 

자주 사용될거로 예상되는 정규식만 따로 모아서 정의해봤습니다.

// 웹 표준 형식 확인
val regexWeb = Regex("https://(.+)")
// 숫자만 있는지 확인
val regexOnlyNumber = Regex("-?\\d+(\\.\\d+)?")
// 파일 디렉토리인지 확인
val regexFileDirectory = Regex("(.+)/(.+)\\.(.+)")
// 숫자만 확인
val regexPickNumber = Regex("[^0-9]")
// 이메일 양식인지 확인
val regexEmail = Regex("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$")
// 전화번호 양식인지 확인
val regexPhoneNumber = Regex("^\\d{2,3} - \\d{3,4} - \\d{4}\$")
// 숫자와 문자 포함 형태의 6 ~ 20글자의 간단한 비밀번호
val regexSimplePassword = Regex("^[A-Za-z0-9]{6,20}\$")
// 숫자와 문자 포함 형태의 6글자 이상의 간단한 비밀번호
val regexSimplePassword2 = Regex("^[A-Za-z0-9]{6}\$")
// 특수문자, 문자, 숫자를 포함한 6 ~ 20글자의 복잡한 비밀번호
val regexComplexPassword = Regex("^.*(?=^.{8,15}\$)(?=.*\\d)(?=.*[a-zA-Z])(?=.*[!@#\$%^&+=]).*\$")

4. 결과 화면

 

저는 이런식으로 화면을 구성하여 표현했습니다.

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

반응형

댓글()

JISULIFE-휴대용 목 선풍기 리뷰 후기 - 내돈내산

IT 관련 지식|2022. 7. 17. 09:31
반응형
728x170

여름 세일 때 산 알리발 목 선풍기 리뷰

 

< JISULIFE-휴대용 목 선풍기 >

[상품 링크]


1. 디자인

디자인은 전반적으로 예쁘다고 생각합니다.

실물 디자인

 

단지 한 가지 단점이 있다면 접을 수 있는 기능이 없기 때문에 휴대성이 조금 떨어진다는거?

 

그 이외에는 예쁘고 만족스러운 디자인이라고 생각됩니다.

 


2. 기능적 설명

 

1) 360도 전방위 바람

 

이라고 설명은 되어있지만

 

실제로는 

 

거의 이 부분 (앞부분)에서만 바람이 나옵니다 

 

목 앞부분에서만 대부분의 바람이 나옴

목 부분에도 구멍이 있긴 하지만 그쪽에서 나오는 건 전체 바람의 10% 정도...?

 

 

2) 3단계 조절 

 

한 번 클릭으로 1단계 -> 두 번째 클릭으로 2단계 -> 세 번째 클릭으로 3단계 -> 네 번째 클릭으로 끄기

 

오랫동안 누르기를 통해 바로 끌 수 있습니다. (이 부분은 좋네요!)

 

 

3) 배터리

 

배터리는 4000mAh라서 생각보다 오래갑니다

 

메이커 공식 16시간!

 

아마 주로 출퇴근이나 사무실에서 잠깐 사용할 건데 그런 면에서는 충분한 용량이라 생각됩니다.

 

참고로 충전 시간은 3~4시간입니다.

 

4) 소음

300x250

소음은 역시 팬이다 보니 생각보다 있습니다.

 

조용한 환경(도서관 정도) + 바로 옆이면 1단계만 하더라도 소음이 느껴집니다.

 

조용한 환경 + 1단계에서 소음이 안 느껴질 정도라면 3m는 떨어져 있어야 거의 안 느껴집니다.

 

하지만 제가 들고 있는 선풍기들(집에 4개 정도 있음;;)은 다 비교한 결과 

 

전부다 1단계에서는 이 정도 이상의 소음이 발생했기 때문에

 

특별히 이 선풍기가 소음이 더 크다! 이런 건 아니라고 생각합니다.

 

어떤 선풍기를 쓰더라도 이 정도 소음은 어쩔수없다랄까...?


3. 장단점

 

<장점>

1. 긴 배터리 타임으로 하루 종일 사용 가능(1단계로 사용 시 16시간 사용 가능)

 

2. 생각보다 예쁨

 

3. KC 마크를 받았기 때문에 어느정도 안심하고 사용가능

 

 

<단점>

1. 바람이 나오는 구멍은 뒤에도 있는데 뒤쪽은 거의 나오지 않음 ㅠ (이 부분이 제일 슬픈 듯)

 

2. 다른 목 선풍기에 비해 조금 무거운 편임(258g) (대신 배터리가 큼 ㅎ)

 

3. 배터리 잔량을 표시해주는 기능이 없음

 

 

저는 전반적으로 만족하는 중입니다.

 

일단 목에 상당히 안정적으로 얹어져 있기 때문에 가방을 메고 사용해도

 

떨어지거나 거슬리는 부분이 전혀 없고

 

단지, 목 부분에만 바람이 좀 더 갔으면 정말 완벽한 제품이었을거 같네요 ㅠ

 

PS. 찾아보니까 목쪽에도 팬 달린 (그러니까 좌,우,목) 제품도 있네요... 아마 이 제품은 목 뒤쪽에도 바람이 갈거 같습니다

 

대신 조금 비쌈 ㅠ

 

혹시 모르니 해당 제품의 링크도 남겨 놓겠습니다.

 

목 쪽에도 팬 달린 목 선풍기

 

41388.0₩ 55% OFF|JISULFE 휴대용 날개 없는 전기 충전식 목선풍기, 목 받침대 디자인 4 단계 속도 조절

Smarter Shopping, Better Living! Aliexpress.com

ko.aliexpress.com

 

 

싼거도 있었음.... ㅠㅠㅠㅠ

 

팬 4개인 목 선풍기

 

9281.0₩ 69% OFF|휴대용 미니 목 팬 휴대용 Bladeless 팬 USB 충전식 Leafless 교수형 팬 공기 냉각기 냉각

Smarter Shopping, Better Living! Aliexpress.com

ko.aliexpress.com

 

근데 이런건 보통 싼건 싼 이유가 있기 때문에 어느정도 값되는걸 써야....


4. 추가 후기

 

한 2주간 출퇴근할 때 매일 써봤습니다.

 

목부분과 얼굴에만 바람이 와서 그닥 시원하지 않을거라 생각했는데

 

생각보다는 훨씬 좋았습니다.

 

사람이 목과 얼굴만 시원해도 더움을 느끼는 것이 상당히 줄어들더라고요 ㅎㅎ

 

솔직히 밖에서 사용하면 그렇게 큰 효과가 없지만

 

에어컨이 작동하는 대중교통이나 실내에서 사용하면 상당히 큰 효과가 있습니다.

 

이제는 친구보러 갈 때 아니면 왠만하면 이거 들고 나가게되네요;;

 

단지 이어폰을 쓰고 이거 사용하시는 분들은 꼭 노캔이 달린 이어폰을 쓰서야할거 같습니다...

 

아니면 바람 소리 때문에 거의 안들리게 되거든요...

반응형

댓글()

안드로이드 코틀린 숫자 돈 단위, 콤마 표시 DecimalFormat

IT 관련 지식|2022. 7. 3. 09:31
반응형
728x170

코틀린에서 숫자에 포맷을 넣어서 표현하는 방법을 알아보겠습니다.


1. 소스코드

DecimalFormat을 사용하여 숫자에 대한 포맷을 정의할 수 있습니다.

import java.text.DecimalFormat

//===== [코틀린 메인 시작 부분] ===== 
fun main(args : Array<String>) {
	
	/*
	[설 명]	
	1. DecimalFormat : 코틀린에서 숫자의 Format을 변경할 수 있습니다
	2. # : 10진수 표시로 빈자리를 채우지 않습니다
 	3. 0 : 10진수 표시로 빈자리를 0으로 채웁니다
	4. 필수 import 패키지 : import java.text.DecimalFormat 
	*/	
	
	println("[DecimalFormat 사용해 화폐 돈 단위 콤마 표시 실시 - 숫자 포맷 변경]")
	
	//int 변수 선언 실시
	var int_money = 1000000
	println("원본 : "+int_money)
	
	//DecimalFormat 객체 선언 실시 (소수점 표시 안함)
	val t_dec_up = DecimalFormat("#,###")
	var str_change_money_up = t_dec_up.format(int_money)
	println("화폐 표시 : "+str_change_money_up)
	
	//DecimalFormat 객체 선언 실시 (소수점 표시)
	val t_dec_down = DecimalFormat("#,###.00")
	var str_change_money_down = t_dec_down.format(int_money)
	println("화폐 표시 (소수점) : "+str_change_money_down)
	
}

DecimalFormat

 

[요약 설명]

1. DecimalFormat : 코틀린에서 숫자의 Format을 변경할 수 있습니다

2. # : 10진수 표시로 빈자리를 채우지 않습니다

3. 0 : 10진수 표시로 빈자리를 0으로 채웁니다

4. 필수 import 패키지 : import java.text.DecimalFormat

300x250

2. 실행 결과

반응형

댓글()