반응형

코틀린에서 개발 시 상수를 열거해야 하는 경우가 있습니다.

코틀린이나 JAVA에서는 상수를 열거하기 위해서

열거형 클래스(Enum Class)를 사용할 수 있습니다.

열거형 클래스(Enum Class) 사용하면 상수를 집합으로 관리할 수 있어 코드에 가독성이 높아집니다.

코틀린 열거형 클래스(Enum Class) 사용하기 위해서는 "enum class"로 선언됩니다.

순차적으로 적용되기 때문에 원하는 상수를 입력하면 됩니다.

enum class State{
    IDLE,
    RUNNING,
    FINISHED
}

fun enumprint(){
      val selecteditem = State.valueOf("IDLE")
      Log.d(TAG, (selecteditem == State.RUNNING).toString())
}

코틀린 열거형 클래스(Enum Class)는 자바와 동일하게 vlaueOf 메소드를 사용해서 열거형을 확인할 수 있습니다.

코드 실행 결과 "selecteditem"에 저장된 "IDLE" 열거형과 "State.RUNNING" 열거형이 다른 것을 확인할 수 있습니다.

상수 집합을 간단하게 사용할 수 있어 열거형 클래스(Enum Class)는 다양한 데이터 집합에 꼭 필요한 요소입니다.

    fun enumprint2()
    {
        for( state in State.values()){
            Log.d(TAG, "${state.name} == ${state.ordinal}")
        }
    }

열거형 클래스(Enum Class) 일반적으로 "values" 메소드를 사용해서 전체 열거형을 확인할 수 있습니다.

"name", "ordinal"을 사용해서 이름과 선언 값을 확인할 수 있습니다.

출력 결과 순차적으로 출력된 내용을 확인할 수 있습니다.

  fun enumprint3()
    {
        for( state in enumValues<State>())
        {
            Log.d(TAG, "enumValues : ${state.name} == ${state.ordinal}")
        }
    }

코틀린 열거형 클래스(Enum Class)는 도우미 메소드 enumValueOf를 이용해서도 열거형 클래스를 확인할 수 있습니다.

"enumValues"를 사용 후 열거형 클래스를 선언하면 전체 열거형 클래스를 for문으로 확인 가능합니다.

출력 결과 values 메소드를 사용한 결과와 동일한 내용을 확인할 수 있습니다.

코틀린(kotlin) 열거형 클래스(Enum Class)는 상수를 맞춤형 데이터로 연결할 수 있습니다.

일반적으로 선언할 경우 0번에서 부터 순차적으로 선언되지만, 별도 상수를 선언이 가능합니다.

코틀린 열거형 클래스(Enum Class) 선언 후 fun 별도 함수를 하나 추가했습니다.

enum class Color(val rgb: Int){
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF),
    YELLOW( 0xFFFF00);

    fun containsRed() = (this.rgb and 0xFF000 != 0)
}

fun enumprint4()
{
    val red = Color.RED
    Log.d(TAG, red.toString())
    Log.d(TAG, red.containsRed().toString())
    Log.d(TAG, Color.BLUE.containsRed().toString())
}

fun 함수는 열거형에 선언된 HEX 값을 확인하여 참, 거짓으로 리턴합니다.

red.containRed() 메서드를 실행하면 RED 값과 조건식이 맞기 때문에 참으로 출력됩니다.

반면 Color.BLUE.contatinsRed() 메서드를 선언하면 RED가 아니기 때문에 거짓을 리턴합니다.

코틀린(kotlin) 열거형 클래스(Enum Class) 집합된 상수를 사용할 수 있어 가독성이 떨어지는 Int형보다 편리하게 사용할 수 있는 클래스입니다.

다양한 열거형을 클래스 내부에서 사용하게 되면 가독성을 더욱더 높일 수 있습니다.

감사합니다.

play.kotlinlang.org/byExample/03_special_classes/02_Enum

 

Kotlin Playground: Edit, Run, Share Kotlin Code Online

 

play.kotlinlang.org

 

반응형
반응형

코틀린은 다양한 Class를 사용해서 가독성 높게 개발할 수 있습니다.

오늘은 데이터(Data)를 쉽게 사용할 수 있는 데이터 클래스(Data Class)를 알아보겠습니다.

서버에서 사용하는 데이터를 가져와서 저장하기 위해서 많이 사용되는 클래스입니다.

데이터 클래스(Data Class)는 애플리케이션 데이터 모델의 주요 구성요소입니다.

코틀린(Kotlin)에서는 클래스에 사용되는 속성에 게터, 세터가 지정됩니다.

var을 선언할 경우 읽기 쓰기 속성이기 때문에, 게터, 세터 모두 정의됩니다.

val을 선언할 경우는 읽기 속성만 있는 게터만 적용됩니다.

코틀린 데이터 클래스(Data Class)

데이터 클래스(Data Class)는 데이터의 무결성을 유지하기 위해서 val을 많이 사용합니다.

구조는 "data class"로 되어 있습니다.

class name을 지정하고 기본 인자를 선언하면 됩니다.

data class Book(val title:String, val price:Int, val type:Int)

Book 데이터 클래스는 val로 모두 선언되어 있어 직접 변경이 불가능합니다.

Book 데이터 클래스를 사용하기 위해서 다양한 함수를 적용했습니다.

fun books(){

        val book = Book("Kotlin", 20000, 1)

        Log.d(TAG, book.toString())

        val secondBook = Book("C#", 15000, 3)
        val thirdBook = Book("JAVA", 25000, 4)

        Log.d(TAG, book.hashCode().toString())
        Log.d(TAG, secondBook.hashCode().toString())
        Log.d(TAG, thirdBook.hashCode().toString())

        Log.d(TAG, book.copy().toString())
        Log.d(TAG,book.copy("Kotlin copy second").toString())
        Log.d(TAG,book.copy(price = 40000).toString())

        Log.d(TAG, secondBook.component1())
        Log.d(TAG, secondBook.component2().toString())
        Log.d(TAG, secondBook.component3().toString())

    }

클래스 선언은 JAVA와 다르게 new 없이 바로 선언하면 됩니다.

BOOK 클래스 타입을 확인하기 위해서. toString() 함수를 사용하면 모든 인수를 확인할 수 있습니다.

데이터 클래스는 두 인스턴스의 구조적 동등성을 비교하기 위해서 hashCode() 함수를 사용합니다.

hashCode() 함수를 사용할 경우 클래스 형식을 확인할 수 있습니다.

코틀린(Kotlin) 데이터 클래스(Data Class)는 직접 인수를 변경할 수 없기 때문에 copy() 함수를 사용해서 각 인수를 변경할 수 있습니다.

함수를 사용하기 위해서 MainActivity에 books() 함수를 호출했습니다.

데이터 클래스(Data Class) 인수를 확인하기 위해서는 component+번호() 함수를 사용할 수 있습니다.

데이터 클래스(Data Class) 인수에 따라서 함수가 순차적으로 변경됩니다.

함수 뒤에 자료형도 확인이 가능합니다.

모든 자료형은 .toString() 함수를 출력이 가능합니다.

Log View에서 출력된 데이터 클래스(Data Class) 정보를 확인할 수 있습니다.

.toString() 함수를 사용해서 인스턴스를 바로 확인할 수 있습니다.

HashCode() 함수를 사용하면 데이터 클래스의 Hash 값을 확인할 수 있습니다.

copy() 함수를 사용하면 인수를 변경할 수 있습니다.

코틀린(Kotlin) 데이터 클래스(Data Class)는 데이터 자료형을 프로그램에서 편리하게 사용할 수 있게 도와주는 매우 좋은 클래스입니다.

코틀린 파일을 따로 생성해서 데이터 클래스를 정의하면 더욱더 편리하게 사용할 수 있습니다.

감사합니다.

play.kotlinlang.org/byExample/03_special_classes/01_Data%20classes

 

Kotlin Playground: Edit, Run, Share Kotlin Code Online

 

play.kotlinlang.org

 

반응형
반응형

오늘은 Android에서 디버깅 로그 사용법을 알아보겠습니다.

디버깅 로그는 Print() 함수와 동일하게 cmd에 출력하는 구조입니다.

Android를 개발할 경우 코드를 확인하기 위해서 Toast를 많이 사용합니다.

하지만 Toast 메시지 함수는 많은 이벤트에서 사용하기 매우 불편한합니다.

Android에서 코트린을 사용해서 디버깅을 출력하기 위해서는 먼저 Logcat View를 활성화해야 합니다.

android Studio 하단에서 Logcat 탭을 클릭하면 컴파일 시 모든 내용을 확인할 수 있습니다.

로그를 출력할 경우 Logcat View 내용이 출력됩니다.

Android Kotlin Log CODE

기본적으로 로그를 사용하기 위해서는 "import android.util.Log"를 포함해야 합니다.

Log 함수는 TAG 값을 기준으로 메시지를 추가할 수 있습니다.

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val TAG:String = "MainActivity : "

        Log.d(TAG, "Log ----- START")
        Log.d(TAG, "Log ----- INSERT")
        Log.d(TAG, "Log ----- END")

}

TAG를 String 변수로 초기화 해주세요.

이후 Log를 추가하고 싶은 라인에 Log.d(TAG, 메시지)를 추가하면 됩니다.

Log는 Debug, Info, Error, VERBOSE 등 다양한 타입으로 출력이 가능합니다.

컴파일을 진행하면 Log를 Logcat View에서 확인할 수 있습니다.

Log 정보를 타입에 따라서 잘 사용하면 오류가 발생할 경우 쉽게 원인을 파악할 수 있습니다.

감사합니다.

developer.android.com/reference/kotlin/android/util/Log

 

Log  |  Android 개발자  |  Android Developers

 

developer.android.com

 

반응형
반응형

오늘은 코틀린 언어를 사용해서 Android에 설치된 모든 앱을 확인할 수 있는 프로그램을 만들어 보겠습니다.

코틀린(Kotlin)을 사용해서 설치된 안드로이드 앱을 확인하기 위해서는 많은 정보를 한눈에 확인할 수 있는 ListView를 사용하겠습니다.

안드로이드 ListView는 다양한 형태로 커스텀이 가능한 장점이 있습니다.

설치된 앱 이름과 아이콘을 ListView에 출력할 수 있는 구조로 만들어 보겠습니다.

먼저 ListView에 Item을 저장하기 위해서 새 파일 메뉴에서 kt class를 생성합니다.

item class에 String 변수 name과 Drawable 변수 image를 선언합니다.

package com.example.appcheck

import android.graphics.drawable.Drawable

class item ( val name : String,  val image : Drawable )

코틀린에서 class를 만드는 방법은 다양하지만, 쉽게 사용할 수 있는 생성자 초기화를 사용했습니다.

함수가 필요할 경우 "{, }"를 사용해서 선언하면 됩니다.

생성된 item class를 UI와 연동하기 위해서 layout 파일이 필요합니다.

신규 파일에서 layout을 선택하고 "main_lv_item.xml"을 생성해주세요.

main_lv_item.xml 파일에서 LinearLayout 하단에 item과 매핑할 수 있는 ImageView, TextView를 한 개씩 선언합니다.

가장 중요한 내용은 위치를 잡기 위해서 app:layout_constraintStart_toEndOf, app:layout_constraintTop_toTopOf에ImageView id인 AppImg로 설정해주세요.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto">

    <ImageView
            android:id="@+id/AppImg"
            android:layout_width="52dp"
            android:layout_height="52dp"
            android:layout_marginBottom="4dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="4dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:srcCompat="@mipmap/ic_launcher_round" />

    <TextView
            android:id="@+id/processname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:textSize="20sp"
            android:textStyle="bold"
            app:layout_constraintStart_toEndOf="@+id/AppImg"
            app:layout_constraintTop_toTopOf="@+id/AppImg"
            />
</LinearLayout>

class, layout이 설정되면 activity_main.xml에 ListView를 선언해주십시오.

ListView 사용법은 아래 링크를 참고해주세요.

developer.android.com/reference/android/widget/ListView

 

ListView  |  Android 개발자  |  Android Developers

 

developer.android.com

Android는 개발 관련 자료가 잘 정리되어 있어 공부하기 정말 좋습니다.

ListView는 id만 정확하게 입력하면 됩니다.

이젠 LisrView에 item을 연결하기 위한 Adapter가 필요합니다.

새 파일에서 코틀린(Kotlin) .kt class 파일을 생성해주세요.

기본적으로 BaseAdapter을 상속받아서 item Array에 item을 저장하면 됩니다.

BaseAdapter에서 사용하는 기본 함수를 override 해줍니다.

getView 함수에서 View를 호출하기 직전에 main_lv_item.xml에 입력된 name, image를 저장하는 구조입니다.

class MainListAdapter(val context: Context, val itemlist : ArrayList<item>) : BaseAdapter() {
    override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {

        val view:View = LayoutInflater.from(context).inflate(R.layout.main_lv_item, null)
        val processname = view.findViewById<TextView>(R.id.processname)
        val itemIcon = view.findViewById<ImageView>(R.id.AppImg)

        val positem = itemlist[p0]
        processname.text = positem.name
        itemIcon.setImageDrawable(positem.image)
        return view
    }

    override fun getItem(p0: Int): Any {
        return itemlist[p0]
    }

    override fun getItemId(p0: Int): Long {
        return 0
    }

    override fun getCount(): Int {
        return itemlist.size
    }
}

마지막으로 등록된 Adapter을 ListView에 연결해야 합니다.

MainActivity로 이동해주세요.

arrayListOf를 사용해서 item 리스트를 생성합니다.

설치된 앱을 확인하기 위해서는 packageManager을 사용해야 합니다.

developer.android.com/reference/android/content/pm/PackageManager#getInstalledPackages(int)

 

PackageManager  |  Android 개발자  |  Android Developers

 

developer.android.com

packageManager.getinstalledPackages() 함수는 패키지 정보를 반환합니다.

0으로 설정할 경우는 DIRECT_BOOT_AWARE로 설치된 앱 리스트만 리턴합니다.

만약 설치된 모든 리스트롤 확인하고 싶다면 MATCH_DIRECT_BOOT_UNAWARE로 입력하면 됩니다.

반환된 앱 정보를 사용해서 MainListAdapter에 item 리스트를 저장합니다.

 

컴파일 결과 설치된 앱 리스트를 아이콘과 함께 확인할 수 있습니다.

설치된 앱을 모두 확인하는 과정에서 조금 시간이 걸립니다.

이번 시간에는 아주 간단하게 ListView를 사용해서 설치된 앱 리스트를 확인했습니다.

감사합니다.

반응형
반응형

코틀린으로 안드로이드 개발 시 layout에 Activity_main.xml을 인식 못하는 오류가 발생했습니다.

소스에는 activity_main.xml이 존재하지만 찾을 수 없다는 오류가 출력됩니다.

Unresolved reference: activity_main 

이건 뭐여.

옵션 설정을 변경해도 동일한 에러가 계속 발생해서 구글링 해보니까.

import android.R 이 문제였습니다.

android.R이 import되면서 다른 내용을 찾고 있는 것으로 생각됩니다.

import android.R을 삭제하면 정상적으로 Activity_main을 확인할 수 있습니다.

 

반응형
반응형

오늘은 코틀린을 사용해서 안드로이드 인트로 화면을 만들어 보겠습니다.

코틀린 안드로이드 인트로

기본적인 인트로 화면으로 이미지를 추가해서 전환하는 방식으로 코드를 진행하겠습니다.

코틀린 안드로이드 인트로

먼저 안드로이드 스튜디오 및 IntelliJ을 사용해서 안드로이드 컴파일할 수 있는 환경을 구성해주세요.

전 유료 버전인 IntelliJ를 사용해보겠습니다.

안드로이드 스튜디오 개발 회사에서 만든 툴이기 때문에 비슷한 부분이 많이 있습니다.

먼저 "Empty Activity" 프로젝트를 생성해줍니다.

코틀린 안드로이드 인트로

안드로이드 인트로화면은 Activity를 호출해주는 방식이기 때문에 먼저 IntroActivity를 생성해줍니다.

이번에는 안드로이드 인트로에 사용할 이미지를 등록해주세요.

drawable 폴더에서 우클릭을 사용해서 Explorer을 오픈해서 이미지를 복사하면 자동으로 drawable 하위에 이미지가 등록됩니다.

코틀린 안드로이드 인트로

등록된 이미지를 클릭하면 확인할 수 있습니다.

코틀린 안드로이드 인트로

처음에 신규로 생성한 introlActivity.kt 파일을 클릭해서 코드를 입력해주세요.

class introlActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_introl)

        var handler = Handler()
        handler.postDelayed( {
            var intent = Intent( this, MainActivity::class.java)
            startActivity(intent)
        }, 3000)
    }

    override fun onPause() {
        super.onPause()
        finish()
    }
}

Intent를 사용해서 MainActivity를 3초 후에 이동하는 코드입니다.

onPause가 호출되면서 대기상태일 때 introActivity는 종료시키는 코드도 추가해주세요.

 

 

 

코틀린 안드로이드 인트로

인트로 레이아웃은 ImageView를 사용해서 고정시켜줍니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".introlActivity">

    <ImageView
            android:id="@+id/introlImg"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            android:src="@drawable/moon"
    />

</androidx.constraintlayout.widget.ConstraintLayout>

마지막으로 등록된 메인 Activity 정보를 변경해줍니다.

코틀린 안드로이드 인트로

AndroidManifest.xml에서 MainActivity와 .introlActivity를 바꿔주면 IntrolActivity가 먼저 호출되면서

3초 후 MainActivity가 호출됩니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.p365language">

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
        </activity>
        <activity android:name=".introlActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

정상적으로 코딩되었다면 빌드해주세요.

코틀린 안드로이드 인트로

인트로로 설정된 Activity가 먼저 호출되는 것을 확인할 수 있습니다.

코틀린 안드로이드 인트로

3초 후 메인화면으로 이동합니다.

인트로 화면은 앱 실행과 동시에 사용자에게 가장 큰 기대를 줄 수 있는 중요한 내용입니다.

안드로이드 인트로 화면을 사용해서 앱을 더욱더 멋지게 개발해보세요.

감사합니다.

반응형
반응형

맥북 에어 2020 버전을 1년 동안 사용했습니다.

기존 제품보다는 정말 좋은 성능으로 잘 사용하고 있지만, 펜 소음이 생각보다 매우 커서 조금 무거운 작업을 하거나, 일반 게임을 할 경우 문제가 발생했습니다.

그래서 오늘은 맥북 에어 2020 펜 소음 해결 방법을 알아보겠습니다.

맥북 에어 2020 펜은 CPU가 80% 이상일 경우 소음이 발생합니다.

문제는 한번 시작하면 CPU가 내려가지 않는 이상 점점더 빠르게 실행됩니다.

그래서 소음이 매우 심합니다.

팬 소음을 먼저 확인하기 위해서는 CPU 사용량을 확인해야 합니다.

CPU 사용량을 확인하기 위해서는 런처에서 "활성 상태 보기"를 검색해주세요.

다른 방법은 런처에서 기타를 클릭하고 "활성화 상태 보기"를 선택하면 됩니다.

저는 맥북 에어 2020에서 가장 CPU를 많이 차지하는 프로그램이 스팀, 에픽게임즈 런처였습니다.

두 런처 모두 시작 시점에 동작하게 되면서 CPU를 많이 사용하게 됩니다.

그래서 전원을 켜면 바로 펜이 동작하는 문제가 있었습니다.

그래서 런처를 모두 삭제하니까 CPU가 안정적으로 운영되었습니다.

맥북에서 프로그램을 삭제하는 방법 말고 펜을 직접 제어할 수 있는 방법이 있습니다.

crystalidea.com/macs-fan-control

 

Macs Fan Control - control fans on Apple computers, also on Windows via Boot Camp

“If you have concerns about the long term health of any machine that's running hot enough, use Macs Fan Control to bump up your fan speed.” – Linus Tech Tips

crystalidea.com

상기 사이트에서 "Download" 버튼을 클릭해주세요.

Windows에서도 사용이 가능한 프로그램입니다.

전 맥북 에어에 설치하기 위해서 macOS용을 다운로드했습니다.

다운로드가 완료되면 설치해주세요.

설치하게 되면 상단 메뉴바에 아이콘을 확인할 수 있습니다.

실행하면 맥북에 설치된 펜 리스트를 확인할 수 있습니다.

맥북 에어는 한개 펜이 적용되어 있고 맥북 프로 같은 경우 두개의 펜을 확인할 수 있습니다.

Macs Fan control은 동작하는 펜 RPM을 조절할 수 있습니다.

자동이 아닐 경우 무조건 설정된 RPM으로 동작합니다.

일반적으로 바로 사용하기는 조금 무리가 있으며, 펜이 심각하게 돌 경우 RPM을 조절할 수 있습니다.

펜이 동작하는 이유는 내부 열기를 방출하기 위한 동작이기 때문에 너무 자주 사용하게 되면 맥북에 문제가 발생할 수 있습니다.

지금은 M1 맥북 에어를 판매하고 있으니까, 무조건 펜 소음 걱정없는 M1 탑재 제품을 추천합니다.

펜 소음이 불편했다면 위 방법대로 한번 확인해보세요.

효과가 정말 좋습니다.

감사합니다.

반응형
반응형

C언어 문자열 함수

C언어에서 사용하는 문자열은 다양한 함수를 사용해서 변경이 가능합니다.

오늘은 문자열을 다루는 함수에 대해서 알아보겠습니다.

먼저 문자열 함수를 사용하기 위해서는 string.h 헤더를 추가해야 합니다.

 

더보기
문자열 길이 확인 strnlen_s

이전 강좌에서는 자료형 크기를 확인하는 sizeof함수를 사용해서 문자열 길이를 확인했습니다.

sizeof 경우 포인트를 사용한 문자열일 경우 포인트 크기만 확인하게 됩니다.

그래서 정확한 문자열을 확인할 수 없습니다.

반면 strnlen_s는 null문자열을 제외한 크기를 바이트 단위로 확인합니다.

#include <stdio.h>
#include <string.h>
int main(void)
{
	
	char strValue[] = "this is strnlen_s";

	int strSize = strnlen_s(strValue, sizeof(strValue));


	printf(" %s 문자열 크기는 = %d\n", strValue, strSize);
	printf("\n");

	return 0;
}

string.h 헤더를 추가하고 strnlen_s를 사용해서 문자열 길이를 확인했습니다.

C언어 문자열 함수

문자열 사용 시 함수 뒤에 "_s" 함수를 사용하면 보안 취약점을 개선할 수 있습니다.

문자열 크기를 정확하게 확인하기 때문에 중간 변조에 대해서 방어할 수 있습니다.

 

더보기
문자열 복사 strcpy_s

문자열을 복사하기 위해서는 strcpy_s를 사용해서 복사할 수 있습니다.

#include <stdio.h>
#include <string.h>
int main(void)
{
	
	char strCopy1[] = "this is copy";
	char strCopy2[] = "strcpy";

	strcpy_s(strCopy1, sizeof(strCopy1), strCopy2);

	printf(" 복사된 문자열은 \" %s \" 입니다.\n", strCopy1);
	printf("\n");

	return 0;
}

strCopy1 문자열에 strCopy2 문자열을 복사했습니다.

strcpy_s 함수를 사용해서 두 번째 복사하기 위한 배열 사이즈를 설정합니다.

만약 이 사이즈보다 복사 문자열이 길다면 오류를 출력합니다.

C언어 문자열 함수

출력 결과 strCopy1 문자열이 "strcpy"로 변경되었습니다.

 

 

 

 

더보기
문자열 연결 함수 strcat_s

문자열은 연결하기 위해서는 strcat_s 함수를 사용합니다.

strcat_s 함수를 사용하기 위해서는 문자열을 연결하기 위한 배열이 합산된 길이보다 커야 합니다.

#include <stdio.h>
#include <string.h>
int main(void)
{
	
	char strCat1[40] = "this is ";
	char strCat2[] = " strcat_s";

	strcat_s(strCat1, sizeof(strCat1), strCat2);

	printf(" 복사된 문자열은 \" %s \" 입니다.\n", strCat1);
	printf("\n");

	return 0;
}

strCat1 문자열을 길이를 40으로 고정했습니다.

strcat_s를 사용하면 strCat2 문자열이 strCat1 문자열에 포함됩니다.

C언어 문자열 함수

출력 결과 문자열이 연결된 것을 확인 할 수 있습니다.

strCat1 문자열 길이가 합산된 길이보다 작을 경우 오류를 출력합니다.

 

더보기
문자열 비교 함수 strcmp

문자열을 비교하기 위해서는 strcmp함수를 사용합니다.

strcmp함수는 문자열을 바이트 단위로 비교해서 결과를 리턴합니다.

문자열이 같으면 0을 리턴하고 다르면 0보다 작은 값을 리턴합니다.

#include <stdio.h>
#include <string.h>
int main(void)
{
	
	char strcmp1[] = "strcmp1";
	char strcmp2[] = "strcmp2";
	char strcmp1copy[] = "strcmp1";

	int r1 = strcmp(strcmp1, strcmp2);
	int r2 = strcmp(strcmp1, strcmp1copy);


	printf(" 첫번째 비교 결과는 = %d 입니다.\n", r1);
	printf("\n");
	printf(" 두번째 비교 결과는 = %d 입니다.\n", r2);

	return 0;
}

3개의 문자열을 사용해서 두번 비교했습니다.

C언어 문자열 함수

출력 결과 처음 strcmp1, strcmp2 문자열을 비교하면 -1을 리턴합니다.

두 번째 strcmp1, strcmp1copy 문자열일 비교하면 같은 문자열이기 때문에 0을 리턴합니다.

문자열은 다양한 함수를 사용해서 관리할 수 있기 때문에 반드시 공부해주세요.

이상으로 문자열 함수에 대해서 마치겠습니다.

감사합니다.

반응형
반응형

C언어 스트링

지난 시간에는 C 언어 프로그래밍에 사용하는 배열에 대해서 공부했습니다.

오늘은 스트링을 사용해서 배열에 저장하는 내용을 알아보겠습니다.

문자열을 출력하기 위해서는 printf() 함수를 사용하면 됩니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	printf("C언어 스트링입니다.\n");
	printf("\n");
	printf("This is C Language\n");
	printf("\n");

	return 0;
}

출력 결과입니다.

C언어 스트링

printf() 함수를 사용하면 문자열을 바로 출력할 수 있습니다.

이번에는 배열을 사용해서 문자열을 선언하겠습니다.

#include <stdio.h>

int main(void)
{
	
	char stringArray[] = "This is C Language";

	printf("%s\n", stringArray);
	printf("\n");

	return 0;
}

출력 결과입니다.

C언어 스트링

stringArray 배열에 문자열을 선언하게 되면 배열에 순차적으로 문자가 저장됩니다.

C언어 문자열

배열 내부를 확인하면 0 ~ 17 번지까지 문자가 저장됩니다.

정확하게 확인하기 위해서 문자를 한개씩 출력해보겠습니다.

 

 

 

#include <stdio.h>
int main(void)
{
	
	char stringArray[] = "This is C Language";

	int size = sizeof(stringArray);

	for (int i = 0; i < size; i++)
	{
		printf("%d 번지 문자는 = %c 입니다 \n",i, stringArray[i]);
		printf("\n");
	}
	return 0;
}

출력 결과 입니다.

C언어 스트링

sizeof() 함수를 사용해서 문자열 크기를 확인할 수 있습니다.

입력된 문자열을 한 개씩 출력하면 저장된 결과를 확인할 수 있습니다.


문자열은 다중 배열도 사용이 가능합니다.

#include <stdio.h>
int main(void)
{
	
	char stringArray[][20] = {
		"This is C Language",
		"안녕하세요",
		"C언어 문자열입니다."
	};

	int sizey = sizeof(stringArray) / sizeof(stringArray[0]);

	for (int i = 0; i < sizey; i++)
	{
		printf("%d 번지 문자열은 = %s  \n", i, stringArray[i]);
		printf("\n");
	}
	return 0;
}

다중배열은 2차 배열에 저장되는 문자열 크기만 선언합니다.

출력 결과입니다.

C언어 문자열

선언된 문자열 크기가 부합하지 않다면 컴파일 오류가 발생합니다.

문자열(String)은 다양한 방법을 사용해서 저장이 가능합니다.

문자열은 개발에 다양한 코드에 사용하기 때문에 반드시 공부해주세요.

이상 C언어 프로그래밍 문자열에 대해서 알아봤습니다.

감사합니다.

반응형
반응형

Toast는 안드로이드에서 메시지를 출력하기 위한 함수입니다.

오늘은 코틀린에서 Toast 사용법을 알아보겠습니다.

Toast를 사용하기 전에 먼저 버튼을 추가해주세요.

안드로이드에서 빈 프로젝트를 생성하고 layout에서 activity_main.xml에 아래 코드를 추가해주세요.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:padding="20dp"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_Toast"
            android:text="POP Toast"
            android:textAllCaps="false"
            android:padding="20dp"
            android:textSize="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

코드 내용은 간단하게 중앙에 버튼을 배치하기 위한 내용입니다.

출력 결과 중앙에 버튼을 확인할 수 있습니다.

이제 메시지를 출력하기 위해서 Toast를 사용해보겠습니다.

class MainActivity : AppCompatActivity() {

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

        var btnToast : Button = findViewById(R.id.btn_Toast)

        btnToast.setOnClickListener{
            Toast.makeText(this, "Toast Start", Toast.LENGTH_SHORT).show()
        }
    }
}

MainActivity.kt에서 버튼에 클릭 이벤트를 연결합니다.

Toast 출력은 Toast.LENGTH_SHORT를 사용해서 짧게 출력합니다.

"POP Toast" 버튼을 클릭하면 아래쪽에 "Toast Start" 메시지를 확인할 수 있습니다.

 var btnToast : Button = findViewById(R.id.btn_Toast)

        btnToast.setOnClickListener{
            Toast.makeText(this, "Toast Start", Toast.LENGTH_LONG).show()
        }

Toast 타입을 Toadt.LENGTH_LONG로 설정합니다.

메시지 출력이 조금 더 길게 출력됩니다.

Toast는 LENGTH_SHORT일 경우는 2~3초 출력하고, LENGTH_LONG일 경우는 5초 정도 출력합니다.

안드로이드 코딩 시 Log를 사용하는 방법도 있지만, 다양한 출력을 사용자에게 인지 시켜주기 위해서는 Toast를 많이 사용합니다.

감사합니다.

반응형

+ Recent posts