728x90
반응형

[Create New Project]를 선택하면 새로운 안드로이드 프로젝트를 만들기 위한 대화 상자가 순서대로 표시된다. 

Empty Activity를 선택하여 만들었다.

 

이름은 Hello로 하고 언어는 Java를 이용하여 만들었다. 

 

패키지 이름이란?

앱을 구분하는 고유의 값으로 앱이 단말에 설치되었을 때 다른 앱과 구분될 수 있는 역할을 한다. 패키지 이름은 다른 패키지 이름과 충돌하지 않게 지어주고 실무에서는 인터넷 사이트 주소처럼 짓는 경우가 많다

 

안드로이드 스튜디오 창이 열릴 때까지 시간이 걸린다. 

상태 바에 'Gradle build finished'로 시작한는 문장과 함께 화면이 모두 나타날 때까지 기다린다.

 

1. MainActivity.java

 새로운 안드로이드 프로젝트에서는 자바 언어를 사용하기 때문에 java라는 확장자를 가진 파일이 만들어지며 표준 자바의 문법으로 작성되어 있다. 

 

2. activity_main.xml

왼쪽의 하얀 화면은 실제 스마트폰 화면에 나타날 디자인 화면이고 오른쪽의 남색 화면은 화면의 구성 요소만을 보여주는 청사진 화면이다. 각각 Design과 Blueprint 항목이다. Blueprint 화면이 필요한 이유는 화면 안의 요소가 서로 겹쳐 있을 때 요소를 투명하게 보고 작업할 수 있어 유용하다.

 

3. 에뮬레이터로 Hello World 앱 실행하기

 안드로이드 기기가 없어도 컴퓨터에서 에뮬레이터와 가상 단말을 이용하면 앱을 실행할 수 있다. 에뮬레이터는 가상 단말을 실행하기 위한 프로그램인데 이 프로그램은 안드로이드 스튜디오를 설치할 때 이미 설치되어 있다. 즉, 가상 단말(Virtual Device)만 만들면 된다. 

 

 3.1 가상 단말 만들기

 안드로이드 스튜디오 오른쪽 상단에 있는 아이콘 중 [AVD Manager] 아이콘을 클릭하면 가상 단말을 만들거나 실행할 수 있는 가상 단말 관리 화면(Android Virtual Device Manager)이 나타난다.

[+Create Virtual Device] 버튼을 눌러 새로운 가상 단말을 만든다.

Select Hardware 창이 나타나면 여기에서 새로운 가상 단말의 하드웨어를 선택할 수 있다. 기본 값인 Pixel 2를 그대로 두고 [Next] 버튼을 누른다.

 

그러면 System Image 창이 나타난다.

여기서는 가상 단말을 실행할 때 필요한 이미지를 선택할 수 있다. 이미지란 단말기 하드웨어의 종류에 따라 달라지는 것으로 하드웨어를 실행하기 위한 정보를 담고 있는 하나의 파일이라고 생각하면 된다. 가장 위에 있는 R을 사용하겠다. 

 

ABI란?

 Application Binary Interface의 약자로 안드로이드 CPU 칩과 시스템 사이의 상호 작용 방법을 기술한 인터페이스를 의미한다. 안드로이드 단말의 CPU 칩은 제조사마다 다르기 때문에 제조사에 맞는 ABI를 선택해야 한다. 가장 대표적인 것은 ARM, MIPS, x86이며 나는 x86을 사용한다.

 ABI를 x86으로 지정하면 PC의 가상화 기술을 허용해야 한다. ABI 값을 x86으로 선택하여 가상 단말을 실행하면 가상화 기술(Virtualization Technology)을 사용할 수 없다는 오류 메시지가 나타나는 경우가 많다. 이 메시지는 x86으로 만들어진 가상 단말이 실행될 때 가상 단말을 실행하는 PC에서 가상화 기술을 허용하지 않아 발생한 것이다. 

 이 문제를 해결하려면 PC의 바이오스에서 Virtualization Technology라는 항목을 Enable로 바꿔주어야 한다. PC의 바이오스로 들어가는 방법은 PC가 켜질 때 F8이나 ESC키를 누르면 된다.

 

에뮬레이터 실행 과정을 거친 후 안드로이드 단말의 홈 화면이 나타난다. 이제 만든 앱을 바로 실행해보겠다.

 

3.2 에뮬레이터를 사용하여 앱 실행하기

 shift+F10을 눌러 앱을 실행하면 된다.

 

앱이 실행되면 안드로이드 스튜디오 아래에 있는 [Logcat] 탭에 로그가 출력된다.

 

4. Hello 프로젝트 하나씩 바꾸어보기

 

 앞에서 만든 앱은 Hello World! 라는 메시지를 띄우는 모양의 앱이다. 이 앱은 비록 단순하지만 실제 안드로이드 기기에서도 실행되는 진짜 앱이다. 앱을 실행하면 나타나는 Hello World는 입력한 적도 없는데 화면에 나타났다. 

 

4.1 MainActivity.java 자세히 살펴보기

package com.example.hello;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

코드를 보면 표준 자바나 다른 언어에서 애플리케이션의 시작점 역할을 하는 main 함수가 없다. 이것으로 안드로이드에서는 'main 함수가 아닌 다른 함수가 시작점의 역할을 한다.' 고 추측할 수 있다. 

 

그러면 onCreate() 함수를 보자. onCreate() 함수 안의 첫번째 줄에서는 super라는 키워드를 사용하여 onCreate()함수를 호출한다. super 키워드는 상속을 받은 클래스에서 부모 클래스를 가리킬 때 사용한다. 즉, 이 코드는 부모 클래스에 있는 onCreate() 함수를 호출하는 것이고 부모 클래스의 onCreate() 함수는 이 클래스의 기능과 직접적인 관련은 없으므로 화면의 메시지를 보여주는 기능과는 상관없다.

 그럼 setContentView(R.layout.activity_main)을 보자. setContentView()함수는 화면에 무엇을 보여줄 것인지를 설정해주는 역할을 하고 R.layout.activity_main은 화면의 구성 요소에 대한 정보라는 것만 이해하고 넘어가자. 

 

4.2 activity_main.xml 자세히 살펴보기

 activity_main.xml은 [res]폴더 안에 있다. [res]폴더 안에 [layout]폴더 안에 있다. MainActivity.java에서 보았던 파라미터인 R.layout.activity_main이라는 이름과 비슷하다. 즉, MainActivity.java와 activity_main.xml이 연결되어 하나의 화면을 보여주는 것이다. 

 

 activity_main.xml파일을 더블클릭하여 열어보면 앱의 첫 화면 자체를 의미하는 것을 알 수 있다.

 

 activity_main.xml 화면 아래에 있는 [Text]탭과 [Design] 탭을 보면 고칠 수 있는 텍스트 화면과 화면 구성 요소를 마우스를 이용해 넣을 수 있는 디자인 화면이 나타난다.

 

5. 버튼 누르면 메시지 출력하기

 Design 탭에 들어가면 많은 것들이 있다. Text, Buttons, Widgets 등등.. 

 먼저 디자인탭 상단에 자석에 금지 표시를 한 번 클릭하여 지워주자.

 그리고 Common 탭에서 Button을 사용하여 Button을 화면 중앙에 두자(원래 있던 Text는 delete로 삭제 가능하다)

 

우리가 만든 버튼은 activity_main.xml 파일 안에 있다. 이 버튼과 자바 소스(Main-Activity.java)는 분리되어 있다. 그래서 activity_main.xml에 추가한 버튼을 MainActivity.java에 연결해야 한다. 그래야 버튼에서 발생한 클릭 이벤트를 자바 소스에서 처리할 수 있다. 이 과정은 다음과 같다.

 

1) XML 레이아웃 파일의 버튼에 onClick 속성 값 넣기 : activity_main.xml 파일에 들어 있는 버튼에 onClick 속성 값으로 클릭 이벤트를 처리할 함수 이름을 입력한다. 이때 이 함수 이름은 소스 코드(MainActivity.java)에 들어 있는 함수 이름을 그대로 사용한다. 

 

2) 소스 파일에 이벤트 처리 함수 추가하기 : MainActivity.java 파일을 열고 XML에서 지정한 함수를 추가한다. 이 함수의 이름은 위에서 넣은 onClick 속성 값과 같아야 한다. 

 

Button을 연결할려면 activity_main.xml에서 Button에 속성값을 추가하여야 된다. 

즉, 이 버튼을 누르면 자바 소스에서 onButton1Clicked 함수를 찾아 실행하게 된다. 이제 소스 코드에 onButton1Clicked함수를 추가하면 된다. 그런데 소스 코드를 수정하기 전에 먼저 해야 할 일이 있다. 자바에서는 어떤 클래스를 사용할 때 import 구문을 추가해야 하는데 이것을 일일이 입력하는 것은 귀찮아서 import 구문을 자동으로 넣을 수 있는 기능을 제공한다. 

 

 안드로이드 스튜디오 메뉴에서 [File->Settings]를 선택한다. [Settings] 대화상자가 나타나면 [Editor -> General -> Auto Import]를 선택한다. 오른쪽 설정 화면에서 Add unambiguous imports on the fly 와 Optimize on the fly 항목을 체크한 후 [OK]버튼을 클릭한다. 

 

그러면 자동으로 import된다. 이후에 MainActivity.java에 다음과 같은 코드를 입력해준다.

package com.example.hello;

import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onButton1Clicked(View v){
        Toast.makeText(this,"확인1 버튼이 눌렸어요",Toast.LENGTH_LONG).show();
    }
}

안드로이드에서 Toast(토스트)는 작고 간단한 메시지를 잠깐 보여주는 역할을 한다. 

makeText() 함수는 Toast라는 클래스에 포함되어 있다. 그래서 이 함수를 사용하려면 Toast 클래스를 import해야 한다. 만약 Toast 클래스가 import되지 않으면 안드로이드 스튜디오가 자동으로 코드를 체크하여 오류를 표시한다.

import 오류를 해결하려면 Alt+Enter를 몇 번 눌러도 된다. 

 

이렇게 실행하면 확인1 버튼을 누르면 "확인1 버튼이 눌렸어요" 라는 창이 뜨게 된다.

 

6. 버튼 여러 개 추가하기

 

확인1 버튼 아래에 버튼 하나를 추가하자. 버튼 추가하는 방법은 위와 같이 Palette에서 Common 탭에서 버튼을 끌어오면 된다. 물론 자석 표시는 대각선으로 안되어있을테니 그냥 끌어오면 된다.

 

새로 만든 버튼을 보면 테두리에 왼쪽 오른쪽 동그라미에는 파란색으로 채워져 있는데 위,아래쪽 테두리에 보이는 동그라미는 비어있다.

 

 새 버튼 테두리 위쪽에 있는 빈 동그라미를 누르고 확인 1 버튼의 아래쪽 테두리에 끌어다 놓으면 연결선이 표시되며 자동으로 달라붙는다.

 

버튼을 클릭한 상태에서 오른쪽 Attributes 영역에서 텍스트 속성 값을 '네이버 접속하기' 로 onClick 속성 값은 'onButton2Clicked'를 입력하자.

 

그리고서는 MainActivity.java에 onButton2Clicked에 해당하는 코드를 입력해주면 된다.

 

(버튼3까지 말들어서 실행해 보자)

 

public void onButton2Clicked(View v){
        Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://m.naver.com"));
        startActivity(myIntent);
}

public void onButton3Clicked(View v){
    Intent myIntent = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:010-10000-1000"));
    startActivity(myIntent);
}

이렇게 만들면 버튼2를 누르면 네이버에 접속이 되고, 버튼3을 누르면 전화를 걸 수 있는 화면으로 바뀐다.

 

단 몇줄의 코드를 입력하여 여러 기능을 추가했다. 이것을 가능하게 하는 것이 바로 '인텐트(Intent)'이다. 인텐트는 내가 하고자 하는 행위를 의미한다. 쉽게 말해 인텐트를 사용하면 애플리케이션 구성 요소 간에 데이터를 전달하거나 실행하려는 기능이 무엇인지 안드로이드 플랫폼에 알려줄 수 있다.

 

웹브라우저는 안드로이드 단말에 기본으로 제공되는 앱이니까 직접 만든 앱에서 안드로이드 단말에 '웹페이지를 띄워보고 싶어요'라고 편지를 쓰면 안드로이드 단말은 그 편지를 웹브라우저에 전달한다. 그러면 웹브라우저가 그 편지를 보고 그 내용에 맞는 웹페이지를 띄우는 것이다.

 

기억해야 될 것들은 다음과 같다.

 

1. 프로젝트 만들기 : 안드로이드 스튜디오에서 안드로이드 프로젝트를 만들 수 있다.

 

2. setContentView() : 화면에 무엇을 보여줄지 결정하는 함수(메서드)이다. 

 

3. R.layout.activity_main : 화면에 보여줄 대상이 되는 XML의 위치를 지정한다.

 

4. /app/res/layout/activity_main.xml : 자바 소스에서 R.layout.activity_main이라고 입력하여 가져올 수 있는 프로젝트 안의 파일이며, 화면을 구성할 때 사용한다.

 

5. text 속성 : 화면에 보이는 글자를 변경할 때 사용하는 속성이다.

 

6. onClick 속성 : 버튼을 클릭했을 때 어떤 메서드를 실행할 것인지 간단하게 지정할 수 있는 속성이다.

 

7. Intent : 어떤 기능을 실행할 것인지 지정할 때 사용한다.

 

8. Toast : 화면에 잠깐 보였다 없어지는 메시지를 간단하게 보여주고 싶을 때 사용한다.

728x90
반응형

'App > Android' 카테고리의 다른 글

RecyclerView  (0) 2021.08.25
Fragment  (0) 2021.08.23
Intent  (0) 2021.08.23
안드로이드(Android) 개요와 설치  (0) 2021.03.03
Kotlin은 무엇일까 + Kotlin에서의 변수와 함수  (0) 2021.03.03
728x90
반응형

알고리즘은 시간과 공간에 따라 평가 된다. 공간이라고 하면 뭔가 내 방 같은 눈에 보이는 공간 느낌이라 이상할 수 있는데 공간은 컴퓨터의 메모리라고 생각하면 된다. 

 

둘 중 어느 것이 중요하냐고 물어보면 시간을 더 중요하게 여긴다. (알고리즘 문제를 풀더라도.. 보통 시간초과 문제에 머리를 싸멘다..)

메모리는 돈 주고 늘릴 수 있지만, 시간은 그렇지 않기 때문이다. 

 

 컴퓨터 사양, 프로그래밍 언어에 따라 속도에 차이가 있을 수 있으므로 단순히 프로그램이 돌아가는 시간으로 알고리즘을 평가하기는 어렵다. 그래서 시간복잡도를 이용해서 평가한다.

 

시간복잡도(Time Complexity)

시간복잡도의 사전적 정의는 어떤 알고리즘을 수행하는 데 걸리는 시간을 설명하는 계산 복잡도를 의미하며, 계산 복잡도를 표기하는 대표적인 방법이 바로 빅오다.

 

빅오로 시간복잡도를 표현할 때는 최고차항만을 표기하며, 상수항은 무시한다.

 

데이터가 많아질수록 걸리는 시간이 얼마나 증가하는가에 따라 결정한다. 시간복잡도를 평가하기위해서는 수학적 개념이 들어간다. 거듭제곱과 로그이다.

내가 보통 Python으로 알고리즘을 풀면, 시간제한은 1초, 2초, (함정으로 0.5초도 가끔 보인다.) 이다. 해당 문제를 해결하려면 시간복잡도를 항상 따져야 한다. 
1초라면 1억번의 연산을 할 수 있다고 생각하고 문제를 풀면 된다. 예를 들어, n이 10000보다 작다면 n제곱까지 고려를 할 수 있다. 시간제한과 n의 값의 범위를 보고 어떤 알고리즘을 사용할지 결정하는데 도움이 된다.

 

점근 표기법(Big -O Notation)

 

빅오(O, big-O)란 입력값이 무한대로 향할때 함수의 상한을 설명하는 수학적 표기 방법이다.

 

 알고리즘 소요시간은 input 크기에 따라 표현할 수 있다. 점근 표기법이란 소요시간이 20n +40이면 40은 없애주고 앞에 붙은 20도 없애줘서 O(n)으로 그냥 표기하는 것이다. 또 2n^2+8n+157이면 O(n^2)이 되는것이다. 

 

 점근 표기법의 핵심은 n이 엄청 크다고 가정하는 것이다. n이 별로 크지 않으면, 안 좋은 알고리즘을 써도 상관없다. n이 엄청 큰 경우 알고리즘의 중요함을 느낀다.

 

O(1) 

 

input사이즈에 영향을 받지 않는다. input크기와 상관 없이 실행되는 코드만 O(1)이다. 최고의 알고리즘이라 할 수 있다. O(1)에 실행되는 알고리즘으로 해시 테이블의 조회 및 삽입이 이에 해당한다.

 

 

O(logn)

 

로그는 매우 큰 입력값에도 크게 영향을 받지 않는편. 대표적으로 이진 검색이 이에 해당한다.

def print_powers(n) :
	i=1
    while i<n:
    	print(i)
        i=i*2

 

O(n)

 

입력값만큼 실행 시간에 영향을 받으며, 알고리즘을 수행하는 데 걸리는 시간은 입력값에 비례한다. 이러한 알고리즘을 선형 시간(Linear-Time) 알고리즘이라고 한다. 정렬되지 않은 리스트에서 최댓값 또는 최솟값 경우가 이에 해당한다. 이 값을 찾기 위해서는 모든 입력값을 적어도 한 번 이상은 살펴봐야 한다.

 

 

O(nlogn) : O(n)과 O(logn)이 겹쳐진 것

 

병합 정렬을 비롯한 대부분의 효율 좋은 정렬 알고리즘이 이에 해당한다. 비교 기반 정렬 알고리즘은 아무리 좋은 알고리즘도 O(nlogn) 보다 빠를 수 없다. 

def print_powers_of_two_repeatedly(n):
    for i in range(n): # 반복횟수: n에 비례
        j = 1
        while j < n: # 반복횟수: lg n에 비례
            print(i, j)
            j = j * 2

 

O(n^2) 

 

버블 정렬 같은 비효율적인 정렬 알고리즘이 이에 해당한다.

 

 

O(2^n)

 

피보나치 수를 재귀로 계산하는 알고리즘이 이에 해당한다. n^2보다 2^n이 훨씬 크다.

 

 

O(n!)

 

각 도시를 방문하고 돌아오는 가장 짧은 경로를 찾는 외판원 문제(TSP)를 브루트 포스로 풀이할 때. 가장 느린 알고리즘이다.

 

 

공간 복잡도

O(1) 

def product(a, b, c):
    result = a * b * c
    return result

result가 차지하는 메모리 공간은 인풋과 무관하기 때문

 

O(n)

def get_every_other(my_list):
    every_other = my_list[::2]
    return every_other

my_list의 길이가 n이라고 하면 변수 every_other이 공간을 차지한다. every_other에는 my_list의 짝수 인덱스의 값들이 복사돼서 들어간다. 약 n/2개의 값이 들어간다. O(n)이다. 

 

 

728x90
반응형

'알고리즘 > 알고리즘 이론' 카테고리의 다른 글

정렬(Sort)  (0) 2021.04.12
재귀 함수  (0) 2021.04.02
브루트 포스 (Brute Force)  (0) 2021.03.18
다이나믹 프로그래밍  (0) 2021.03.08
[알고리즘] 그리디(Greedy)  (0) 2020.10.02
728x90
반응형

문자열 포매팅

방법 1 %기호 -> C나 Java같은 언어들에서 이 방법으로 문자열 포매팅을 한다.

name = "김태헌"
age = 24

print("제 이름은 %s이고 %d살입니다." % (name, age))

 

숫자 바로 대입

character = "I'm the %d in the world" %1

문자열 바로 대입

character = "I'm the %s in the world" % "first"

숫자 값을 나타내는 변수로 대입

number = 1
character = "I'm the %d in the world" %number

문자열 포맷 코드

%s 문자열
%c 문자 1개
%d 정수
%f 부동소수
%o 8진수
%x 16진수
%% % 자체

%s는 어떤 형태의 값이든 변환해 넣을 수 있다.

 

방법 2 format 메소드 ( 이 방법을 사용하자)

name = "김태헌"
age = 24

print("제 이름은 {}이고 {}살입니다.".format(name, age))

 

 

숫자 바로 대입하기

"I eat {0} apples".format(3)
#I eat 3 apples.

문자열 바로 대입하기

"I eat {0} apples".format("five")
#I eat five apples.
number = 3
"I eat {0} apples".format(number)
#I eat 3 apples

number = 5
day = "three"
"I ate {0} apples in {1} days" .format(number,day)
#I ate 5apples in 3 days

방법 3 f-string

name = "김태헌"
age = 24

print(f"제 이름은 {name}이고 {age}살입니다.")

 

728x90
반응형
728x90
반응형

1. 코멘트

코멘트는 앞에 #을 붙이고 쓰면 된다. 실제 실행할떄는 무시된다. 복잡한 코드 설명, 하다가 만 부분 표시, 다른 개발자들과 소통을 위해 쓰게 된다. 

#Goobdye world 출력해보자
print('Goodbye world!')

2. 변수

추상화 - 변수, 함수, 객체

변수(Variable)는 값을 저장하는 것. 

함수(Function)는 명령을 저장하는 것  ex) print() 함수

 

추상화의 장점은 함수가 어떤 구조인지 알지 못하더라도 사용을 할 수 있다. 

 

3. 자료형

자료형이란 프로그래밍을 할 때 쓰이는 숫자, 문자열 등 자료 형태로 사용하는 모든 것을 의미한다. 

프로그램의 기본이자 핵심 단위

 

 1) 숫자형 자료형

 정수형 : Integer이란 말 그대로 정수를 뜻하는 자료형

  a = 123

  a = -178

 실수형 Floating-point 소수점이 포함된 숫자

  a = 1.2

  a = -3.45

  a = 4.24E10 #이 방식은 "컴퓨터식 지수 표현 방식"으로 파이썬에서는 4.24e10 또는 4.24E10처럼 표현한다. 여기서 4.24E10은 4.24*10의 10제곱을 의미한다.

 8진수와 16진수

 8진수(Octal)를 만들기 위해서는 숫자가 0o 또는 0O(숫자 0 + 알파벳 소문자 o 또는 대문자 O)로 시작하면 된다.

a = 0o177

 16진수(Hexadecimal)를 만들기 위해서는 0x로 시작하면 된다.

a = 0x8ff
b = 0xABC

 

숫자형을 사용하기 위한 연산자

 사칙연산 : + - * / 을 수행할 수 있다.

 

 x의 y 제곱을 나타내는 ** 연산자

a = 3
b = 2
print(a**b) #9

 나눗셈 후 나머지를 반환하는 %연산자

a = 7
b = 3
print(a%b) #1

 

2) 문자열 자료형

 문자열(String)이란 문자, 단어 등으로 구성된 문자들의 집합을 의미. 따옴표로 둘러싸여 있으면 모두 문자열

 

문자열 안에 작은따옴표나 큰따옴표 포함시키고 싶을때

큰따옴표 안에 들어있는 작은따옴표는 문자열을 나타내기 위한 기호로 인식되지 않는다.

character = "I'm the best character in the world"

백슬래시를 사용해서 작은따옴표와 큰따옴표 문자열에 포함시키기

백슬래시를 작은따옴표나 큰따옴표 앞에 삽입하면 백슬래시 뒤의 작은따옴표나 큰따옴표는 문자열을 둘러싸는 기호의 의미가 아니라 문자 그 자체를 뜻하게 된다.

 

여러 줄인 문자열을 변수에 대입하고 싶을 때

줄을 바꾸기 위한 이스케이프 코드 사용하면 된다.

character = "I'm the best in the world\nAnd you can either"

이스케이프 코드 : 프로그래밍할 때 사용할 수 있ㄷ로고 미리 정의해 둔 문자 조합이다. 

\n 문자열 안에서 줄을 바꿀 때 사용
\t 문자열 사이에 탭 간격을 줄 때 사용
\\ 문자 \를 그대로 표현할 때 사용
\' 작은따옴표(')를 그대로 표현할 때 사용
\" 큰따옴표(")를 그대로 표현할 때 사용
\r 캐리지 리턴(줄 바꿈 문자, 현재 커서를 가장 앞으로 이동)
\f 폼 피드(줄 바꿈 문자, 현재 커서를 다음 줄로 이동)
\a 벨 소리(출력할 때 PC 스피커에서 '삑' 소리가 난다)
\b 백 스페이스
\000 널 문자

문자열 곱하기

a = "python"
print(a*2) #pythonpython

문자열 길이 구하기 

len 함수를 사용하면 구할 수 있다.

 

문자열 인덱싱과 슬라이싱 : 인덱싱이란 무엇인가를 "가리킨다" 슬라이싱은 무엇인가를 "잘라낸다"의 의미이다.

인덱싱을 통해 문자열의 각 문자에 접근하고, 슬라이싱을 통해 문자열 안의 문자들을 잘라낼 수 있다.

  character = "I'm the best in the world\nAnd you can either"
  print(character[0]) #I
  print(character[4]) #t
  print(character[-1]) #r
character = "I'm the best in the world\nAnd you can either"
print(character[0:2]) #I'

# 0:2 의 의미는 character[0]에서 character[1]까지 출력하라는 의미이다

 

3)형변환(Type Conversion)

: 값을 한 자료형에서 다른 자료형으로 바꾸는 것이다. 예를 들어서 7을 7.0 (정수->소수), "7"을 7 (문자열->정수)로 바꿀 수 있다.

print(int(3.8)) # 3

int형은 소수부분이 없기 때문에 정수 부분만 출력된다.

print(int("2")+int("5")) #7

 

 

 

 

728x90
반응형
728x90
반응형

1. Python interpreter

 컴퓨터가 이해할 수 있는 코드는 Machine Code이다. 그래서 Python code를 python interpreter를 통해 machine code로 번역시켜주어야 한다.

 

2. PyCharm

 파이썬 코딩을 할 때 도움을 주기 위해 설치해야 되는것. 통합 개발 환경으로 IDE(Integrated Development Environment)라고 한다. 

 

두 프로그램을 사이트에 들어가서 깔아준다.

 

다운로드 후 PyCharm을 실행하면 interpreter를 설정하라고 한다. 그러면 Python interpreter를 설치해 준다. 

이때 venv라는 폴더가 생성되는데 이거 삭제하면 프로그램이 돌아가지 않는다.

728x90
반응형
728x90
반응형

안드로이드는 구글에서 만든 스마트폰용 운영체제이다. 안드로이드의 가장 큰 특징은 오픈 소스라는 것이다. 

 

설치를 위해서는 안드로이드 개발자 사이트(https://developer.android.com/studio)에 접속해서 화면 아래쪽에

[DOWNLOAD ANDROID STUDIO]버튼을 눌러 안드로이드 스튜디오 설치 프로그램을 다운로드 한다.

설치가 완료되면 Welcome to Android Studio 화면이 보인다. 실습을 위해서는 개발 도구를 설치해야 한다.

Ctrl+Shift+A 를 눌러서 Configure 항목을 눌러보면 여러 가지 메뉴가 나타나는데 그중에 [SDK Manager]를 선택한다.

 

안드로이드 스튜디오의 설정 화면이 나타난다. 

여기서는 사용가능한 버전의 플랫폼 정보와 이미 설치되어 있는 플랫폼들을 확인할 수 있다.

 

안드로이드 플랫폼이란 버전별로 만들어진 실행 환경을 말한다. PC에서는 에뮬레이터이고 실제 단말에서는 단말의 OS라고 생각하면 된다. 안드로이드에서는 가상의 플랫폼이라는 의미로 AVD(Android Virtual Device ; 안드로이드 가상 단말)이라는 용어를 사용하고 있는데, 이 플랫폼은 버전별로 만들어져 있고 OS 버전이 업그레이드될 때마다 새로운 버전을 다운로드할 수 있어 원하는 OS 버전에 맞춰 개발할 수 있다.

 

두번째 탭인 SDK Tools를 누르면 설치된 라이브러리나 도구들을 볼 수 있다. 추가로 설치하려는 항목을 체크한 후 [Apply] 버튼을 누르면 설치할 수 있다. 

Google Play services를 설치해 주었다.

728x90
반응형

'App > Android' 카테고리의 다른 글

RecyclerView  (0) 2021.08.25
Fragment  (0) 2021.08.23
Intent  (0) 2021.08.23
첫 프로젝트 만들기  (0) 2021.03.07
Kotlin은 무엇일까 + Kotlin에서의 변수와 함수  (0) 2021.03.03
728x90
반응형

코틀린 이란?

- Jetbrains 사에서 개발 하였다 (Android Studio를 다운받을때 사용한 곳)

- 2017년에 안드로이드 공식지원언어로 채택되었다 (원래 Java밖에 없었는데 Kotlin이 추가됨)

 

코틀린이 좋은 이유

- 문법이 간결하며, 표현력이 좋다

- Null safe 언어이다

- 기존 라이브러리와 상호운용성이 좋다 (자바와 100% 호환이 된다)

 

코틀린에서 변수 선언하는 방법

 

1. var/val 변수명 = 값

 

var은 variable의 축약어, val은 valuable의 축약어

둘 중에 아무거나 고르는 것이 아니라 서로 차이가 있다.

var은 마음대로 원하는 것을 넣을 수 있다.

val은 한 번 넣으면 바꿀 수 없는 변수 선언명.

 

var num = 10
val hello = "안녕하세요"

 

2. var/val 변수 : 자료형 = 값

var number1 : Int = 20
var hello1 : String = "Hello"
var point1 : Double = 3.4

 

2가지 변수 선언법에서 알 수 있는것은 코틀린은 2번과 같이 자료형을 적어주지 않을경우 알아서 자료형을 정한다.

 

코틀린에서 프로그램이 작동하는 곳

: 실행되는 부분의 코드는 다음과 같다.

fun main(args:Array<String>){

    
}

여기 안에 코드를 입력하면 된다.

 

Run을 실행하고 싶은데 안보이는 경우가 있을 수 있다. 이럴때는 [File]->[Settings]에서 Deployment를 검색해서 둘 다 체크해주면 된다. 

 

변수 활용 

var a = 1+2+3+4+5
var b = "1"
var c = b.toInt()//b를 int로 바꾼값이 저장됨
var d = b.toFloat()//d에는 1.0이 있음

var e = "John"
var i = "My name is $e Nice to meet you"

fun main(array:Array<String>){
    println(a)
    println(b)
    println(c)
    println(d)
    println(e)
    println(i)
}

3번째 줄에서 toInt()와 4번째 줄의 toFloat()는 각각 int와 float로 바꾸어주는 것이다. 

 

그리고 변수 e는 John으로 들어가있고 i 문자열에서 $e를 써서 대입할 수 있다.

 

//var abc : Int = null
var abc1 : Int? = null

자료형 뒤에 ?를 붙이면 null을 가질 수 있는 자료형이 된다.

 

함수

함수
 -어떤 input을 넣어주면 어떤 output 나오는 것

함수를 선언하는 방법
fun 함수명 (변수명: 타입, 변수명: 타입....) : 반환형{
  함수내용
  return 반환값
}

fun plus(first:Int,second:Int):Int{
    val result : Int = first+second
    return result
}
fun main(array:Array<String>){
    val result = plus(5,10)
    println(result)

    val result2 = plus(first=20,second=30)
    println(result2)
}

 

디폴트 값을 갖는 함수 만들기

fun plusFive(first:Int,second:Int=5):Int{
    val result:Int = first+second
    return result
}

main에서 plusFive함수를 실행하면 된다. second인수를 주지않으면 자동으로 디폴트 값인 5가 들어가서 계산된다.

 

반환값이 없는 함수 만들기

fun printPlus(first:Int,second:Int):Unit{
    val result:Int =first+second
    println(result)
}

반환값 입력받는 공간에 Unit으로 두면 반환값 없이도 함수를 만들 수 있다. Unit은 생략이 가능하다.

 

위와 같은 사실에서 우리는 main함수에 대해서 유추해 볼 수 있다. 

fun main(array:Array<String>){

여기서 array변수는 Array<String> 타입의 변수라는 것을 알 수 있다. 그리고 이 함수에는 반환값이 없다는 것도 알 수 있다.

 

간단하게 함수를 선언하는 방법

fun plusShort(first:Int, second:Int) = first+second

 

가변인자를 갖는 함수 선언하는 방법

fun plusMany(vararg numbers: Int) {
    for (number in numbers){
        println(number)
    }
}
fun main(array: Array<String>) {
    plusMany(1,2,3)
}

 

내부 함수 : 함수 안에 함수가 있다.

fun showMyPlus(first:Int,second:Int):Int{
    fun plus(first:Int,second:Int):Int{
        return first+second
    }
    return plus(first,second)
}

 

728x90
반응형

'App > Android' 카테고리의 다른 글

RecyclerView  (0) 2021.08.25
Fragment  (0) 2021.08.23
Intent  (0) 2021.08.23
첫 프로젝트 만들기  (0) 2021.03.07
안드로이드(Android) 개요와 설치  (0) 2021.03.03
728x90
반응형

우리가 알고있던 프로그램이 실행되면 CPU에서 프로세스라는 것으로 실행된다는 것을 알았다. 그렇다면 프로세스는 어떻게 생성되고 복사되는지 알아보자.

 

1. 프로세스의 구조

 : 프로세스는 코드영역, 데이터 영역, 스택영역으로 구성된다. 예를 들어 워드프로세서 프로그램을 실행하면 이 프로그램은 코드 영역에 탑재되고, 워드프로세서로 편집중인 문서는 데이터 영역에 탑재된다. 또한 운영체제가 워드프로세서를 작동하기 위해 사용하는 각종 부가 데이터는 스택 영역에서 관리한다. 이렇듯 프로그램이 프로세스가 될려면 3가지 영역이 유기적으로 작동한다.

  • 코드 영역 code area : 프로그램의 본문이 기술된 곳으로 텍스트 영역text area 라고도 한다. 프로그래머가 작성한 프로그램은 코드영역에 탑재되며 탑재된 코드는 읽기 전용으로 처리된다. 자기 자신을 수정하는 프로그램은 존재하지 않기 때문이다.
  • 데이터 영역 data area : 코드가 실행되면서 사용하는 변수variable나 파일 등의 각종 데이터를 모아놓은 곳이다. 데이터는 변하는 값이기 때문에 이곳의 내용은 기본적으로 읽기와 쓰기가 가능하다. 
  • 스택 영역 stack area : 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳이다. 예를 들어 프로세스 내에서 함수를 호출하면(function call)함수를 수행하고 원래 프로그램으로 되돌아 올 위치를 이 영역에 저장한다. 스택 영역은 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게는 보이지 않는다.

 

2. 프로세스의 생성과 복사

 : 프로세스는 프로그램을 실행할 때 새로 생성된다. 사용자가 프로그램을 실행하면 운영체제는 프로그램을 메모리로 가져와 코드 영역에 넣고 프로세스 제어 블록을 생성한다. 그리고 메모리에 데이터 영역과 스택 영역을 확보한 후 프로세스를 실행한다. 

 그런데 프로세스를 새로 생성하는 방법뿐만 아니라 실행중인 프로세스로부터 새로운 프로세스를 복사하는 방법도 있다.

 

2.1 fork()시스템 호출의 개념

 fork() 시스템 호출은 실행중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다. 커널에서 제공하는 이 함수는 프로세스를 복사하는 일종의 시스템 호출이다. fork() 시스템 호출을 사용하면 실행중인 프로세스와 똑같은 프로세스가 하나 더 만들어진다. 이렇게 복사해서 실행하면 처음 실행하는 속도보다 훨씬 빠르다. 

 또 다른 예로 구글의 웹브라우저인 크롬에서 어떤 웹사이트를 보다가 ctrl+N을 누르면 크롬 웹페이지가 하나 더 실행된다.

 

**fork() 시스템 호출**

 : fork() 시스템 호출은 실행 중인 프로세스를 복사하는 함수이다. 이때 실행하던 프로세스는 부모 프로세스, 새로 생긴 프로세스는 자식 프로세스로서 부모-자식 관계가 된다.

 

2.2 fork() 시스템 호출의 동작 과정

 fork() 시스템 호출을 하면 시스템 내부에서는 어떤 일이 일어날까?

 fork() 시스템 호출을 하면 프로세스 제어 블록을 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어진다. 단, 프로세스 제어 블록의 내용 중 일부가 변경되는데 변경되는 부분은 다음과 같다.

  • 프로세스 구분자(PID)가 바뀐다. 이는 부모와 자식의 주민등록번호가 다른 것과 마찬가지이다.
  • 부모 프로세스와 자식 프로세스가 차지하고 있는 메모리의 위치가 다르므로, 메모리 관련 정보가 바뀌게 된다. 
  • 부모 프로세스 구분자PPID와 자식 프로세스 구분자CPID가 바뀐다(둘은 부모-자식 관계이기 때문)

2.3 fork() 시스템 호출의 장점

  • 프로세스의 생성 속도가 빠르다
  • 추가 작업 없이 자원을 상속할 수 있다
  • 시스템 관리를 효율적으로 할 수 있다

2.4 fork() 시스템 호출의 사용

: fork() 함수는 unistd.h 헤더를 포함한 후 사용가능하다. fork() 문은 부모프로세스에 0보다 큰 값, 자식 프로세스에 0을 반환한다. fork()문 이전에 파일을 열거나 변수를 선언하면 이것이 모두 자식 프로세스에 상속된다.

 

3. 프로세스의 전환

3.1 exec() 시스템 호출의 개념

 : exec() 시스템 호출은 기존의 프로세스를 새로운 프로세스로 전환하는 함수이다. 

  • fork() : 새로운 프로세스를 복사하는 시스템 호출이다.
  • exec() : 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출이다. exec() 시스템 호출을 하면 현재의 프로세스가 완전히 다른 프로세스로 전환된다.

 exec() 시스템 호출을 사용하는 목적은 프로세스의 구조체를 재활용하기 위함이다. 새로운 프로세스를 만들려면 프로세스 제어 블록을 만들고 메모리의 자리를 확보하는 과정이 필요하다. 또한 프로세스를 종료한 후 사용한 메모리를 청소(garbage collection)하기 위해 상위 프로세스와 부모-자식 관계를 만들어야 한다. 이때 exec() 시스템 호출을 사용하면 이미 만들어진 프로세스 제어 블록, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리하다. 새로운 코드 영역만 가져오면 되기 때문에 운영체제의 작업이 수월하다.

 

3.2 exec() 시스템 호출의 동작 과정

 exec() 시스템 호출 동작 과정은 간단하다. exec() 시스템 호출을 하면 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버린다. 또한, 데이터 영역이 새로운 변수로 채워지고 스택 영역이 리셋된다. 프로세스 제어 블록의 내용 중 프로세스 구분자, 부모 프로세스 구분자, 자식 프로세스 구분자, 메모리 관련 사항 등은 변하지 않지만 프로그램 카운터, 레지스터 값을 비롯 각종 레지스터와 사용한 파일 정보가 모두 리셋된다. 마치 프로세스를 처음 시작하는 것처럼 내용이 정리된다.

728x90
반응형

'CS > 운영체제' 카테고리의 다른 글

[2] 시분할 시스템, 실시간 시스템  (0) 2022.03.09
[1] 운영체제의 발전  (0) 2022.03.07
프로세스 제어블록(Process Control Block)  (0) 2020.10.29
프로세스의 개요  (0) 2020.10.29
병렬처리  (0) 2020.10.26

+ Recent posts