[macOS, Big Sur] VirtualBox Kernel driver not installed (rc=-1908) 해결

macOS Big Sur 에서 Virtual Box를 이용해 Ubuntu 16.04 LTS를 설치하는 중에 다음과 같은 에러가 발생하였습니다.

Kernel driver not installed (rc=-1908)

Make sure the kernel module has been loaded successfully.

where: suplibOsInit what: 3 VERR_VM_DRIVER_NOT_INSTALLED (-1908) - The support driver is not installed. On linux, open returned ENOENT.

위 문제를 해결하기 위해서는 ‘시스템 환경 설정 > 보안 및 개인 정보 보호 > 일반 탭’ 으로 이동하여 ‘Oracle America, Inc’ 에 대한 허용을 선택하고 시스템을 재시작 해야 합니다.

다만, 허용 옵션을 활성화 하기 위해서는 Virtual Box의 재설치가 필요합니다.

https://download.virtualbox.org/virtualbox/6.1.18/VirtualBox-6.1.18-142142-OSX.dmg

Note: This option is available only for roughly 30 minutes after a fresh install of VirtualBox. If this message does not appear, uninstall VirtualBox by opening your “Applications” folder and then dragging the VirtualBox app to the Trash. Remove any leftover files, reinstall a fresh copy of VirtualBox, and immediately open the Security & Privacy menu to see this option.
Reference : How to Fix VirtualBox’s “Kernel Driver Not Installed (rc=-1908)” Error on a Mac

시스템 재시작이 완료되면 Virtual Box를 실행 후 가상 머신이 정상적으로 실행되는지 확인합니다.

카테고리: Memo | 댓글 남기기

[Android] Layout Mechanism 정리

View가 그려지는 과정

안드로이드의 View 들은 계층구조로 구성됩니다. 먼저 Activity가 포커스를 얻게되면 안드로이드 시스템은 Activity에게 루트 노드를 요청합니다.

보통 루트 노드는 MainActivity 클래스의 onCreate()메소드 내부에서 setContentView()메소드를 통해 지정되거나, XML 레이아웃의 최상위 레이아웃이 지정됩니다.

아래의 그림에서 좌측은 레이아웃 XML로 작성된 View 구조의 예시이며, 우측은 레이아웃이 구성되는 트리구조를 나타냅니다.

  • View는 포커스를 얻으면 레이아웃을 그리도록 요청하는데, 우측에 트리 구조를 기준으로 전위 순회 방식으로 그려집니다.
  • 부모 View는 자식 View가 그려지기전에 그려지고, 형제 View는 전위 순회 방식에 따라 순서대로 그려지게 됩니다.

전위 순회 순서로 레이아웃이 그려질때 다음과 같이 3가지 과정을 거치게 됩니다.

  • Measure : View의 크기를 정하는 과정
  • Layout : View의 위치를 정하는 과정
  • Draw : 최종적으로 View를 캔버스위에 실제 그리는 과정

measure(int widthMeasureSpec, int heightMeasureSpec)

부모노드에서 자식노드를 경유하며 실행되며, View의 크기를 알아내기 위해 호출됩니다.  실제 View의 크기 측정은 onMeasure(int, int)를 통해 이뤄집니다. measure(int, int)의 내부에서는 onMeasure(int, int)를 호출함으로써 View의 크기를 알아냅니다. 측정 과정에서는 부모 View와 자식 View간의 크기 정보를 전달하기 위해 다음의 2가지의 클래스를 사용합니다.

ViewGroup.LayoutParams

자식 View가 부모 View에게 자신이 어떻게 측정되고 위치를 정할지 요청하는데 사용됩니다. ViewGroup의 sub class에 따라 다른 ViewGroup.LayoutParams의 sub class가 존재할 수 있습니다. 예를 들어 ViewGroup의 sub class인 RelativeLayout 경우 자신만의 ViewGroup.LayoutParams의 sub class는 자식 View 를 수평적으로 또는 수직적으로 가운데정렬을 할 수 있습니다.

  • 정확한 수치 (ex. android:layout_width=”320dp”)
  • MATCH_PARENT (ex.android:layout_width=”match_parent”)
  • WRAP_CONTENT (ex.android:layout_width=”wrap_content”)

ViewGroup.MeasureSpec

부모 View가 자식 View에게 요구사항을 전달하는데 사용됩니다.

  • UNSPECIFIED – 부모 View는 자식 View가 원하는 치수대로 결정
  • EXACTLY – 부모 View가 자식 View에게 정확한 크기를 강요
  • AT MOST – 부모 View가 자식 View에게 최대 크기를 강요

layout(int l, int t, int r, int b)

부모노드에서 자식노드를 경유하며 실행되며, View와 자식 View 들의 크기와 위치를 할당할 때 사용됩니다. measure(int, int)에 의해 각 View에 저장된 크기를 사용하여 위치를 지정합니다. 내부적으로 onLayout() 를 호출하고 onLayout() 에서 실제 View의 위치를 할당하는 구조로 되어있습니다. View의 measure() 가 반환할 때, View의 getMeasureWidth() 와 getMeasureHeight() 값이 설정됩니다. 만약 자식 View 측정값의 합이 너무 크거나 작을 경우 다시 measure() 메서드를 호출하여 크기를 다시 측정합니다.

measure() 와 layout() 메서드는 내부적으로 각각 onMeasure() 와 onLayout() 메서드를 호출합니다. 이것은 final로 선언된 measure() 와 layout()  대신 onMeasure()onLayout()을 재구현(override)할 것을 장려하기 위함입니다.

View LifeCycle

Constructor

모든 View는 생성자에서 출발합니다. 생성자에서 초기화를 하고, default 값을 설정합니다. View는 초기설정을 쉽게 세팅하기 위해서 AttributeSet 이라는 인터페이스를 지원합니다. 먼저 attrs.xml 파일을 만들고 이것을 부름으로써 View의 설정값을 쉽게 설정할 수 있습니다.

onAttachedToWindow

부모 View가 addView(childView) 를 호출하고 나서 자식 View는 윈도우에 붙게 됩니다(attached). 이때부터 View의 id 를 통해 접근할 수 있습니다.

onMeasure

View의 크기를 측정하는 단계입니다. 대부분의 경우 레이아웃에 맞게 특정크기를 가져야합니다.

  • View가 원하는 사이즈를 계산합니다.
  • MeasureSpec 에 따라 크기와 mode를 가져옵니다.

  • MeasureSpec 의 mode를 체크하여 View의 크기를 적용합니다.

     

onLayout

이 단계에서 View의 크기와 위치가 할당됩니다.

onDraw

View를 실제로 그리는 단계입니다. Canvas 와 Paint 객체를 사용하여 요청된 내용을 그리게 됩니다. Canvas  객체는 onDraw 메서드의 파라미터로 제공되며, Canvas 을 이용하여 View의 모양을 그립니다. 또한 Paint 객체는 View의 색을 그립니다.

draw

onDraw 메서드를 호출시 많은 시간이 소요됩니다. Scroll 또는 Swipe 등을 할 경우 View는 다시 onDraw 와 onLayout 을 다시 호출하게 됩니다. 따라서 onDraw 메서드 내에서 객체할당을 피하고 한 번 할당한 객체를 재사용할 것을 권장합니다.

다시 말해 onDraw 메서드를 override 할때는 내부에서는 draw에 동작과 관련된 부분만 처리하고, 실제 이미지를 그릴때 사용되는Canvas, Drawable, Paint, Bitmap과 같은 객체는 별도의 메서드로 구분하여 구현하는 것을 권장합니다.

View Update

View Lifecycle을 보면 View를 다시 그리도록 하는 invalidate() requestLayout() 메서드를 볼 수 있습니다. 이것은 런타임에 View를 다시 그릴 수 있게 합니다. 각각의 사용 용도는 아래와 같습니다.

invalidate()

단순히 View를 다시 그릴때 사용됩니다. 예를 들어 View의 text 또는 color가 변경되거나 , touch interactivity가 발생할 때 onDraw() 메서드를 재호출하면서 View를 업데이트합니다.

requestLayout()

measure() 과정부터 다시 View를 그립니다. View의 사이즈가 변경될 때 View의 사이즈를 다시 측정해야하기 때문에 View Lifecycle에 따라 onMeasure() 단계에서부터 View를 다시 그립니다.

Animation

View의 animation은 frame단위의 프로세스입니다. 예를 들어 View가 점점 커지는 Animation을 갖는다고 가정하면 Frame 단위로 View가 점점 커지게 됩니다. 그리고 각 단계마다 invalidate()를 호출하여 View를 그립니다.

[label type=”info”]INFO[/label] 애니메이션에 사용되는 클래스는 대표적으로 ValueAnimator 입니다.

카테고리: Android | 댓글 남기기

[Ubuntu 16.04] VIM 8.2 설치

보통은 Ubuntu 16.04 LTS 에서 apt-get을 이용해 VIM을 설치하면 7.4 버전으로 설치됩니다.
VIM에서 YCM 등의 플러그인을 사용하기 위해서는 8.1 이상이 설치되어야 합니다.

다음과 같은 커맨드를 입력하여 VIM 8.2를 설치합니다.

삭제하는 경우 아래와 같은 커맨드를 입력합니다.

 

카테고리: Linux | 댓글 남기기

[Android] TV 레이아웃 구성

Layout 구성 예제

이번 포스트에서는 Android Studio 에서 실제 TV 레이아웃을 구성하고 편집하는 방법에 대해서 설명합니다.

Leanback 라이브러리를 활용한 레이아웃 구성

자세한 내용은 안드로이드 개발자 문서의 Android TV > TV 앱 빌드 란을 확인하세요. 또한 아래 Reference 란에 첨부한 Creating Layout and Activity 유튜브 동영상을 시청하시는 것도 TV 레이아웃을 이해하시는데 큰 도움이 됩니다.

Android의 Leanback 라이브러리는 Android TV 애플리케이션 개발을 위해 설계된 라이브러리로, TV 사용자 인터페이스를 쉽고 효율적으로 구축할 수 있도록 다양한 사전 정의된 클래스와 인터페이스를 제공합니다. 이 라이브러리는 Android TV 앱 개발 시 필수적인 요소로, 리모컨 입력과 같은 TV 특유의 사용자 상호작용을 쉽게 처리할 수 있게 해줍니다.

프로젝트 생성

  • Android Studio를 실행 후 “Start a new Android Studio project”를 선택합니다.
  • Select a Project Template” 화면에서 TV 탭을 선택 후 “No Activity”를 선택합니다.

    기본값인 Android TV Activity 선택하면 샘플 TV 앱을 구동하기 위한 소스 코드와 메니페스트, 리소스(레이아웃 등)가 포함됩니다.
    이러한 세팅 값들은 TV 레이아웃을 이해하기 위한 기본 구성 이해에 방해가 되므로 No Activity 상태로 프로젝트를 생성합니다.

  • “Configure Your Project” 탭에서 “Name”을 지정합니다. 여기서는 TV-example로 하겠습니다. “Package name”과 “Save location”은 “Name”을 지정하면 자동으로 설정됩니다.
  • “Minimum SDK” 에서는 해당 앱에서 지원하는 안드로이드 SDK의 최소 버전을 선택합니다. 여기서는 API 25: Android 7.1.1 (Nougat)으로 지정하겠습니다. 설정이 완료되면 “Finish”를 클릭하여 프로젝트 생성을 완료합니다.
  • 프로젝트가 정상적으로 생성되면 아래와 같은 화면이 나타납니다.

    • 좌측에 “Project” 탭에 안드로이드 어플리케이션 개발을 위한 파일 구조가 보여집니다.
      • manifests : AndroidManifest.xml에 Activity 및 관련된 특정 속성을 선언해야 앱에서 Activity을 사용할 수 있습니다
      • java : 실제 개발자가 구현해야하는 클래스들이 위치합니다.
      • java (generated) : Gradle (빌드 자동화 툴)에 의해 생성된 자바 소스가 위치합니다.
      • res : resource의 약어로 앱에서 사용되는 문자열, 이미지 등이 위치합니다.
    • app 으로 표시되는 안드로이드 머리 우측에 X 표시가 되어 있습니다. 안드로이드 어플리케이션이 실행되기 위해서는 최소 1개 이상의 Activity가 있어야 합니다.
      현재 java/com/example/tv_example 자바 패스에 생성된 Activity가 없으므로 위와 같이 표시됩니다.

TV 어플리케이션을 위한 manifest 수정

  • TV에서 실행되도록 개발하는 애플리케이션은 manifest에서 TV 런처 Activity를 선언해야 합니다. 이 작업을 위해 CATEGORY_LEANBACK_LAUNCHER 인텐트 필터를 사용합니다.
    이 필터는 앱이 TV용으로 사용 설정되었음을 나타내며 Google Play에서 TV 앱으로 식별될 수 있도록 허용합니다. 사용자가 TV 홈 화면에서 앱을 선택하면 이 인텐트가 실행할 Activity를 식별합니다.
  • AndroidManifest.xml에  다음의 코드를 추가합니다.

    • android.software.leanback 값을 true로 세팅하여 이 어플리케이션은 오직 TV 장치에서만 실행되게 합니다.

    • android.hardware.touchscreen 값을 false로 세팅하여 터치 스크린을 사용하지 않게 합니다. (TV는 터치 스크린이 필요 없죠? ^^)

    • <application> XML 태그 내부에 <activity> 태그를 추가합니다. 앞서 설명하였듯이 안드로이드 앱은 최소 1개 이상의 Activity가 있어야 하며 보통 MainActivity로 지정합니다.

    • <activity> 태그 내부에 <intent-filter> 태그를 통해 해당 앱은 LEANBACK_LAUNCHER에 의해 분류되는 TV 앱 임을 표시합니다.

Layout 리소스 생성

  • 안드로이드 앱은 XML 레이아웃에 정의된 정보를 메모리 상에서 객체화 하는데 이를 Inflation 이라고 합니다. 최초에는 Layout 구성을 위한 XML 레이아웃 리소스 파일이 없으므로 생성합니다.
  • Project 탭 > app/res 오른쪽 버튼 클릭 > New > Android Resource File 을 클릭합니다.
    • “File name:” 은 기본적으로 activity_main으로 합니다. UI 구성에 따라 다수의 Activity를 생성할 수 있는데 기본적으로 가장 주요 레이아웃은 activity_main으로 명명합니다.
    • “Resource type:” 은 Layout을 선택합니다.
    • “Root element:” 에서는 위에서 설명한 ViewGroup의 Layout 형태를 선택할 수 있습니다. 여기서는 RelativeLayout을 선택하겠습니다.
    • 설정이 완료되면 “OK” 버튼을 클릭합니다.
  • XML 레이아웃 리소스 파일이 생성되면 아래와 같이 코드를 추가합니다.
    • tools:context=”.MainActivity” : 추후 생성될 MainActiviy.java 클래스가 해당 레이아웃 리소스와 연동된다는 것을 의미합니다.
    • xmlns:tools=”http://schemas.android.com/tools” : 위에서 tools 속성을 추가하였기 때문에 Android Studio는 해당 속성을 사용하기 위해서 해당 구문을 자동으로 추가합니다.
    • android:layout_width=”match_parent” / android:layout_height=”match_parent” : 해당 구문은 기본적으로 설정된 값입니다. width/height 값을 부모 객체(TV 레이아웃)과 일치시킨다는 뜻입니다.
    • android:orientation=”horizontal” : TV는 기본적으로 Landscape이기 때문에 horizontal로 설정합니다.

    • android:visibility=”visible” : 해당 레이아웃은 당연히 보여야 하기 때문에 visible로 설정합니다.

레이아웃(ViewGroup)에 View 추가

레이아웃은 XML 편집을 통해서 수정할 수 있지만 Design 탭에서 수정도 가능합니다. 본 예제에서는 Design 탭에서 View를 추가한 뒤에 세부적인 속성들을 XML에서 설정합니다.

  • Project 탭 > app/res/layout/activity_xml 더블 클릭 > 우측 상단에 “Design” 탭 클릭
  • Palette > Text 탭 > TextView 선택 후 레이아웃으로 Drag
  • 다음과 같이 “Component Tree”에 TextView가 추가되었으며 실제 레이아웃에도 배치된 것을 확인 할 수 있습니다.
    • 앞서 ViewGroup에서 설명드린대로 RelativeLayout 특성상 TextView가 0, 0 위치에 배치되었습니다.
    • 우측 상단의 “Code” 탭으로 이동하여 XML 속성값을 수정해 위치 및 기타 속성 값을 변경하겠습니다
  • 레이아웃 XML 수정

    • 위와 같이 레이아웃에 TextView를 추가하면 레이아웃 XML 파일에 다음과 같이 TextView에 대한 정보가 추가되어 있습니다.

    • android:textSize, android:text 속성을 다음과 변경하여 TextView에 표시되는 텍스트의 내용을 변경합니다.

MainActivity 클래스 추가 및 기본 구현

안드로이드 앱은 최소 1개의 Activity가 있어야 실행이 가능합니다. 보통 주요한 Activity 클래스명을 MainActivity로 명명합니다.

  • Project 탭 > java 오른쪽 클릭 > New > Java Class 클릭 > MainActivity 입력
  • MainActivity 클래스가 생성되면 다음과 같이 코드를 수정합니다.
    • Activity 클래스를 상속 받습니다.
    • onCreate() 메서드를 Override하여 재정의 합니다.
      • setContentView(R.layout.activity_main); : res/layout/activity_main.xml 레이아웃 리소스를 객체화하여 UI에 표시합니다.
      • TextView textView = findViewById(R.id.textView); 지정된 리소스 ID를 통해 View를 찾아 객체화합니다.
      • textView.setTextSize(50) : TextView 객체의 텍스트 크기의 50dp로 변경합니다.

에뮬레이터 실행

Android Studio 에서는 앱을 실행해 볼수 있는 에뮬레이터를 제공합니다. 에뮬레이터를 실행하기 위해서 다음의 과정을 수행합니다.

  • Tools > AVD Manager > + Create Virtual Device > TV 선택 > Android TV (1080p) 선택 후 “Next” 클릭
  • 앞서 프로젝트 생성시에 API 25: Android 7.1.1 (Nougat) 으로 API 버전을 선택했으므로 Android 7.1.1 (Android TV)을 다운로드 후 타겟으로 선택하고 “Next” 클릭
  • 다음 화면에서는 별다른 설정 없이 “Finish” 클릭
  • 상단탭에서 버튼을 클릭하면 에뮬레이터가 실행되고 결과 화면이 표시됩니다.

Reference

카테고리: Android | 댓글 남기기

[Android] View/ViewGroup 개념 정리

View/ViewGroup

안드로이드 어플리케이션 UI에서 버튼, 스위치, 이미지, 상태바 등은 기본적으로 모두 View로 구성되어 있습니다. 이러한 View 들이 위치 정보 등을 보함하여 화면에 구성되기 위해서는 View를 담기 위한 컨테이너가 필요한데 이것이 바로 ViewGroup 입니다. 개발자가 화면을 어떻게 구성하느냐에 따라 ViewGroup은 계층적으로 다수의 ViewGroup과 View를 가질 수 있습니다.

View

View란 기본적으로 화면에 보이는 것들을 말하는데 흔히 Widget(Control)이라 불리는 UI 구성 요소들이 View 입니다. View를 상속받는 직접적인 자식 클래스로는 ImageView, TextView, ProgressBar 등이 있습니다. 아래에 설명할 ViewGroup 또한 View를 상속받습니다.

SurfaceView

SurfaceView는 기존의 View 클래스를 상속받는 View 입니다. 일반 View는 onDraw 메소드를 자동으로 호출하여 화면을 그리기 때문에 시스템 상황에 따라서 화면이 다소 늦게 그려질수 있지만, SurfaceView는 스레드를 이용해 강제로 화면에 그리기 때문에 원하는 시점에 화면을 그릴 수 있습니다.  SurfaceView는 더블 버퍼링 기법을 이용하여 SurfaceHolder가 Surface에 미리 이미지를 그리고 이 Surface가 SurfaceView에 반영되는 방식입니다. 또한, SurfaceView는 자기 영역 크기 만큼의 Window를 뚫어서(punch) 자신이 보여지게끔 하고 Window와 View를 블렌딩하여 화면에 그립니다.

TextView

TextView는 안드로이드 UI를 구성함에 있어 화면에 텍스트를 표시하는 기능을 담당하며, 안드로이드에서 제공하는 위젯 중 가장 많이 사용되는 위젯입니다. 텍스트 출력 기능을 가진 기본 위젯이므로, 텍스트와 연관된 기능을 포함하는 Button 또는 EditText의 부모 클래스이기도 합니다.

TextView가 안드로이드에서 제공하는 가장 기본이 되는 위젯인 만큼 사용 방법도 간단합니다. 기본 속성을 사용하여 단순한 문자열(Plain Text)을 출력하는 용도라면, Layout 리소스에 TextView를 정의하고 “text” 속성에 출력될 문자열을 지정하면 됩니다.
하지만 간단하다고 해서 확장성이 부족한 것은 아닙니다. TextView는 View 클래스에서 상속받은 속성과 TextView 자신의 속성을 포함하여 아주 많은 종류의 속성을 제공합니다. 이러한 속성들을 사용하여 기본적으로 단순한 TextView에 아주 많은 확장성을 부여할 수 있습니다.

ViewGroup

ViewGroup은 여러 개의 View들은 묶기 위한 요소로서 주로 View의 배치를 위해 사용됩니다. 앞서 설명했듯이 View 클래스를 상속받고 있기 때문에 View의 속성을 그대로 갖습니다. ViewGroup의 종류는 LinearLayout, RelativeLayout, FrameLayout 등이 있습니다.
그렇기 때문에 아래 그림과 같이 ViewGroup은 여러가지 Layout 형태를 갖으며 다양한 형태의 View 요소를 포함합니다.

ViewGroup에 LinearLayout, RelativeLayout, FrameLayout 가 포함되기 때문에 ViewGroup은 Layout과 용어적으로 동일하게 취급됩니다. 이는 구글 안드로이드 공식 문서 및 여타 레퍼런스 자료에서도 동일하게 취급됩니다.

LinearLayout

View가 가로 또는 세로로 순차적으로 나열되는 Layout입니다. 다음과 같이 android:orientation 옵션을 통해 가로(horizontal) 또는 세로(vertical)로 설정할 수 있습니다. (기본값 : horizontal)

RelativeLayout

위치를 지정하지 않으면 View 가 Layout의 0, 0 위치에 계속 쌓이는 레이아웃으로, 최상위 부모 레이아웃 상대위치 또는 id를 참조해 특정 뷰에 대해 상대적인 위치를 지정할 수 있습니다.
다음과 같이 위치를 지정하지 않으면 Layout의 0,0 위치에 View가 계속 쌓이는 것을 확인할 수 있습니다.

위치를 지정하면 다음과 같이 위치가 지정됩니다.

FrameLayout

같은 위치에 자식 View들을 겹치게 한 뒤에, VISIBLE/INVISIBLE/GONE 등의 옵션으로 교차하면서 보여줄 수 있습니다.

XML 레이아웃의 가장 아래쪽에 선언된 View 가 실제 Layout의 가장 위에 표시됩니다.

주로 버튼 클릭시 기존의 View를 숨기고 다른 View를 표시하는 탭기능에서 사용됩니다. 자바 코드에서는 View.setVisibility(“GONE”); 형식으로 사용한다.

  • visible : View를 Layout에 표시합니다.
  • invisible : View를 UI에 표시하지는 않지만, Layout의 크기만큼의 영역은 차지하고 있습니다.
  • gone : View를 Layout에 표시되지 않으며, View가 영역도 차지 하지 않게 합니다.

View/ViewGroup 속성

View 속성

속성
설명
padding View와 View 안에 포함된 View의 간격을 설정합니다. 즉 안쪽 여백입니다.
padding를 사용하여 상하좌우에 대해 동일한 값을 한번에 지정해 줄수 있으며 paddingTop/paddingBottom/paddingLeft/paddingRight를 사용하여 각각 개별적으로 여백 설정이 가능합니다.
min width, min height View가 가질 수 있는 최소 크기를 말합니다.
focus View가 focus를 갖도록 설정하기 위해서는 requestFocus()를 호출해 주고, focus가 있는지 확인하기 위해서는 isFocused()를 호출해 줍니다.
enable View가 경우에 따라 사용자 입력을 받을 수 없도록 하기 위해서는 enable속성을 사용합니다. setEnabled()로 View가 동작을 멈추도록 할 수 있습니다.
selected View가 선택되었는지 나타내기 위해서는 selected속성이 사용됩니다. View가 선택되었다고 설정하고 싶으면 setSelected()를 이용합니다.

View/ViewGroup 속성

속성
설명
android:background View의 배경을 설정합니다.
android:visibility View를 화면에 보여줄지 말지 선택하게 됩니다 옵션으로는 VISIBLE/INVISIBLE/GONE 이 있습니다.
– visible : View를 Layout에 표시합니다.
– invisible : View를 Layout에 표시하지는 않지만, View의 크기만큼의 영역은 차지하고 있습니다.
– gone : View를 Layout에 표시되지 않으며, View가 영역도 차지 하지 않게 합니다.
android:clickable View가 touch를 받을 수 있도록 할지 여부를 설정하게 됩니다. android:clickable=”true” 또는 android:clickable=”false” 로 사용되어 집니다.
android:focusable View가 focus를 가질 수 있는지 여부를 의미합니다. focus를 가진 다는 뜻은 키 이벤트가 발생했을 때 그 값을 받을 수 있는 상태가 되도록 만든다는 의미입니다.

View/ViewGroup ID 속성

  • 고유 식별자 (android:id)
    해당 View를 식별하기 위한 유일한 값입니다. XML안에 해당 id값을 문자열로 설정하게 되면 어플리케이션이 컴파일 될때 정수로써 레퍼런스 됩니다.

    • Inflation
      XML 레이아웃에 정의된 정보를 메모리 상에서 객체로 만드는 객체화 과정을 말합니다.
      어플리 케이션이 시작될 때 이 과정을 거쳐 메모리 상에 만들어진 객체들을 참조하기 위해 ID를 지정합니다.
    • ID속성은 자바 코드 상에서 R.id.[ID]와 같은 형태로 참조합니다.

      버튼의 ID를 추가합니다.

      버튼의 ID를 참조합니다.

View/ViewGroup 색상 지정

  • XML레이아웃에서 색상을 지정할 때는 ‘#’기호를 앞에 붙인 후, ARGB(A : Alpha, R : RED, G : Green, B : Blue)의 순서대로 색상의 값을 기록합니다.
  • 16진수 값을 지정할 때는 여러 가지 포맷을 사용할 수 있습니다.
    • #ff0000으로 지정하면 빨간 색이며, #00ff00으로 지정하면 녹색이 됩니다.
  • 알파 값은 투명도를 조절할 수 있습니다.

View/ViewGroup LayoutParams 속성

속성
설명
LayoutParams LayoutParams는 View의 자체의 속성이 아니라 View가 배치되는 Layout에 따라 달라지는 속성입니다.
LayoutParams로 설정된 속성은 View가 아니라 View가 배치된 Layout에서 사용합니다.
layout_width,
layout_height
View의 폭과 높이를 설정합니다. 미리 정의된 값을 넣을수도 있으며 사용자가 직접 크기를 입력할 수도 있습니다.
또한, match_parent/wrap_content과 같이 미리 지정된 속성값도 존재합니다.
– match_parent : 부모 View 의 크기만큼 width/height를 채웁니다.
– wrap_content : 내부에 있는 View 의 크기 만큼만 크기를 조정합니다.
layout_margin 부모 View 와 자신과의 간격을 설정합니다. 즉, 바깥쪽 여백 입니다.
layout_margin를 사용하여 상하좌우에 대해 동일한 값을 한번에 지정해 줄수 있으며 layout_marginTop/layout_marginBottom/layout_marginLeft/layout_marginRight를 사용하여 각각 개별적으로 여백 설정이 가능합니다.
layout_gravity View의 정렬 값을 나타냅니다.

View/ViewGroup 크기 표현 단위

단위
크기
설명
px 픽셀 화면 픽셀
in 인치 1인치 크기의 물리적 길이
mm 밀리미터 1밀리미터 크기의 물리적 길이 
em 텍스트 크기 글꼴과 상관 없이 동일한 텍스트 크기 표시
dp 밀도에 따른 크기(밀도 독립적 픽셀) 160dpi 화면을 기준으로 한 픽셀
sp 폰트의 가변적 크기(축척 독립적 픽셀) 가변 글꼴을 기준으로 한 픽셀로 dp와 유사하나 글꼴의 설정에 따라 달라진다.
카테고리: Android | 댓글 남기기

[Kotlin] IntelliJ IDEA 설치(with 학생 인증)

이번 글에서는 IntelliJ IDEA의 설치 및 라이센스 인증 방법에 대해서 설명합니다.

IntelliJ IDEA 란?

IntelliJ IDEA는 JetBrains사에서 제작한 상용 자바 통합 개발 환경입니다. 줄여서 IntelliJ 혹은 IDEA로도 부릅니다.

2001년 첫 출시 때부터 편리한 코드 컴플리션 및 리팩토링 기능으로 수많은 Java 개발자들이 IDEA로 유입되었으며, 2009년에 무료 커뮤니티 에디션이 나온 이후에는 본격적으로 Java 개발을 위해 많이 사용되기 시작합니다.  IntelliJ는 Java와 Swing을 이용해서 구현되었으며, 플러그인 개발에 사용되는 언어 역시 Java 입니다.  2019년 DeveloperWeek에서 ‘가장 혁신적인 코딩 툴’로 선정한 바 있으며, 윈도우/macOS/리눅스를 모두 지원합니다.

IntelliJ는 이클립스와 다르게 워크스페이스 개념이 없고, 프로젝트 생성 시 기존에 생성된 빈 디렉토리에 프로젝트를 디렉토리화 시키는 방식입니다. 프로젝트 안에 서브 프로젝트를 생성하는 것도 가능한데, 이러한 서브 프로젝트는 ‘모듈’이라고 칭합니다. 또한 이클립스의 Project-Specific JRE는 IntelliJ IDEA의 Project SDK와 대응됩니다.

또한 자체 GUI GIT이 내장되어 있어, 별도의 GIT 클라이언트를 설치하지 않고도 간편한 버전 관리가 가능하다.

라이센스에 관하여

IntelliJ IDEA는 상업용인 Ultimate 버전과 무료 버전인 Community 버전으로 구분됩니다. 두 버전의 차이는 아래와 같습니다.
Ultimate 버전을 사용하기 위해서는 연간 구독을 신청해야 하기 때문에 비용이 지불됩니다.
다만, ac.kr 형태의 학교 이메일이 있거나 GitHub 학생 인증(Student Pack)이 되어 있다면 JetBrains 계정과 연동하여 Ultimate 버전을 무료로 이용할 수 있습니다.

 

학생 인증 및 설치 방법(ac.kr 학교 이메일이 있는 경우)

  • 젯브레인스(JetBrains) 사이트에 접속하여 학생 인증을 위한 페이지로 접속합니다. → https://www.jetbrains.com/
  • Support > FREE LICENSE PROGRAMS > “Academic Licensing” 클릭

  • 상단탭에서 “For students and teachers” 클릭 후 웹 페이지 아래 방향으로 이동하여 “Apply Now” 클릭

  • “Apply with:” 탭에서 “UNIVERSITY EMAIL ADDRESS” 탭을 선택한 뒤에 인증을 위한 정보를 입력합니다.

  • 다음과 같은 화면과 함께 학교 이메일주소로 인증 메일을 받아 볼 수 있습니다.

  • 입력한 학교 이메일 주소로 로그인하여 인증메일을 확인 후 “Confirm Request”를 클릭합니다.

  • “JetBrains Account” 사이트 창이 열리고, 맨 아래로 스크롤 후 활성화된 “I Accept”를 클릭합니다.

  • JetBrains 회원 가입이 되어있지 않은 경우 우측 하단에 이메일을 입력 후 “Sign Up”을 클릭하여 회원 가입을 진행 합니다.

  • 회원 가입 완료 문구를 확인 후 가입한 이메일에 로그인하여 확인합니다. 이메일 내용중 “Confirm your account” 클릭합니다.

  • 추가 정보를 입력하여 회원 가입을 마무리 합니다.

  • 이후 로그인 하여 확인 해 보면 학생 인증이 완료되어 라이센스가 발급 된 것을 확인할 수 있습니다.

  • Ultimate 버전을 다운로드 하여 설치 합니다. → https://www.jetbrains.com/idea/download/#section=windows
    (자신의 OS 맞게 다운로드하시기 바랍니다. 본 문서에서는 Windows르 기본으로 합니다. 자세한 설치 내용은 생략합니다.)

  • IntelliJ IDEA를 설치 후 최초 실행을 하면 아래와 같은 라이센스 인증 창이 실행됩니다. “Get license from:” 에서 “JB Account”를 클릭하고 이전 과정에서 생성한 계정 정보를 입력하여 인증을 완료합니다.

유용한 단축키

IntelliJ IDEA의 단축키 정보는 IntelliJ IDEA keyboard shortcuts 에 자세히 정리되어 있습니다. 그 중에서 자주 사용되는 단축키 몇개를 다음과 같이 정리하였습니다.

단축키
설명
사용 예
F2 에러 순서대로 찾기 Java 클래스를 Kotlin 클래스로 자동 변환 후 컴파일을 수행하면 무수한 에러가 발생합니다.
이때 에러가 발생한 Kotlin 클래스 파일을 클릭 후 F2를 입력하면 에러를 순서대로 찾아가며 에러를 수정할 수 있습니다.
Shift + Shift (double shift) Search Everywhere 프로젝트에 등록된 모듈(클래스)을 검색합니다. 클래스, 메소드, 프로퍼티, 심볼 등을 검색 할 수 있습니다.
Ctrl + B Go to declaration 커서가 위치한 심볼의 선언부로 이동합니다.
Ctrl + Alt + Left/Right 이전/이후 포커싱 이동 현재를 기준으로 이전/이후에 탐색했던 코드 위치로 이동합니다.
Ctrl + G 라인 찾아가기

Kotlin 컴파일러에서는 에러 발생시 아래와 같이 에러가 발생한 클래스의 행/열 번호를 모두 출력합니다.

HScreenConfiguration.kt:28:5: error: property must be initialized or be abstract

이런 경우 “Ctrl + G” 입력 후 “28:5″를 입력하여 에러가 발생한 클래스의 정확한 코드 위치로 이동하여 확인 할 수 있습니다.

Ctrl + R 문자 치환(Replacement) 설명 그대로 문자열을 치환할때 사용합니다.
보통 Java Getter/Setter가 Kotlin 프로퍼티로 정상적으로 변환되지 않은 경우 자주 사용됩니다.
프로젝트 설정시에 연관 클래스를 모듈로 등록해 두면 Java to Kotlin 변환기에서 클래스 간이 연관성을 참조 후,
Java Getter/Setter를 인식하여 Kotlin 프로퍼티로 정상적으로 변환시키지만 그렇지 않은 경우 문자 치환 등을 이용하여 수동으로 변환해야 합니다.
카테고리: Kotlin, Programming | 댓글 남기기

[Android] 외부저장소에 파일 Read/Write 시에 발생하는 Permission denied 해결 방법

안드로이드 어플리케이션 개발 중, external 저장 공간에 파일을 read 혹은 write 하려고 할때 다음과 같이 Permission denied 에러가 발생하는 경우가 있습니다.

Permission denied 에러가 발생하는 이유는 external 저장 공간의 파일에 접근하기 위해서는 별도의 read/write 권한이 필요하기 때문입니다.

AndroidManifest.xml 파일에 다음과 같이 external 저장 공간에 대한 read/write 권한을 선언하면 됩니다. 선언 위치는 <manifest> 안에 그리고 <application> 밖에 선언하면 됩니다.

Stop ‘app’ (Ctrl + F2) / Start ‘app’(Shift + F10) 을 수행한 뒤에 Settings > Device, Apps > (앱 선택) > Permissions, Storage 메뉴로 이동하여 권한을 활성화 합니다.

 

 

카테고리: Android | 댓글 남기기

[Android] 안드로이드 스튜디오 waiting for target device to come online 무한 로딩 해결 방법

안드로이드 스튜디오에서 개발 도중에 에뮬레이터를 실행하면 waiting for target device to come online 이라는 메시지가 출력되면서 무한 로딩에 빠지는 현상이 발생하였습니다. 이런 경우 아래와 같은 방법으로 해결 하였습니다.

  • Tool > AVD Manager > Android Virtual Device Manager 창 실행 > Device 우클릭 후 Wipe Data 클릭
카테고리: Android | 댓글 남기기

[Ubuntu 16.04] 고정 IP 설정

아래와 같이 <code>/etc/network/interface</code> 파일을 수정합니다.

 

다음의 명령어를 수행하여 networking.service를 재시작한다.

$ sudo systemctl restart networking.service

에러가 발생한다면 /etc/network/interfaces 의 내용이 잘못된 것으므로 확인한다.

다음 명령어를 수행하여 networking.service 의 상태를 확인 후 문제가 없다면 enable 하여 시스템을 재시작 하더라도 동일한 설정이 반영되도록 한다.

$ **sudo systemctl status networking.service**
● networking.service - Raise network interfaces
Loaded: loaded (/lib/systemd/system/networking.service; enabled; vendor preset: enabled)
Drop-In: /run/systemd/generator/networking.service.d
└─50-insserv.conf-$network.conf
Active: active (exited) since 수 2020-08-05 16:02:56 KST; 21min ago
Docs: man:interfaces(5)
Main PID: 28235 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/networking.service

8월 05 16:02:52 JCHOI systemd[1]: Starting Raise network interfaces...
8월 05 16:02:56 JCHOI systemd[1]: Started Raise network interfaces.

$ sudo systemctl enable networking.service
Synchronizing state of networking.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable networking
카테고리: Linux | 댓글 남기기

[C] 구조체 정렬(메모리 패딩)

개요

C언어에서 구조체가 메모리에 적재되었을때 구조체의 멤버 변수들은 선언된 순서대로 인접한 주소 번지에 위치하게 됩니다. 첫번째로 선언된 멤버가 오프셋 0으로 지정되며 그 이후에 구조체 멤버 변수의 데이터 타입에 따라 오프셋이 지정됩니다.

다음의 코드를 보고 결과를 예상해 봅시다.

선언된 구조체 s 는 멤버 변수로 1바이트 크기의 문자형 타입 c, 4바이트 크기의 정수형 i 를 갖습니다.
(C언어 변수 타입에 대한 표준 정의는 ISO/IEC 9899:TC3, Programming languages — C 문서의 p21에 기술되어 있습니다.)
이를 토대로 유추되는 sizeof(st) 의 결과 값은 5입니다. 정말 그럴까요?

프로그램을 실행해 보면 실제로 출력되는 값은 sizeof(st) 의 결과 값은 8 입니다. 왜 이런 결과값이 출력되는 걸까요?

컴퓨터는 32비트/64비트 CPU 아키텍쳐에 따라 4바이트 혹은 8바이트 단위로 메모리에 접근합니다. 만약 32비트 컴퓨터에서 1바이트 크기의 데이터에 접근하려고 하면 추가적인 시프트 연산을 해야 하기 때문에 효율이 떨어집니다. 그래서 C언어 컴파일러는 데이터 접근의 효율성을 위해서 구조체를 일정한 크기로 정렬을 하게 됩니다. 이를 구조체 정렬(Data structure alignment)이라고 하며 이를 위해 남는 공간의 메모리를 채우는 것을 메모리 패딩이라고 합니다.

 

카테고리: C, Programming | 댓글 남기기