Listener에 등록을 하여 이벤트 처리를 하는 것.




MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.button4test;
 
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
 
public class MainActivity extends Activity {
    Button btn_naver,btn_911,btn_gallery,btn_end;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_naver=(Button)findViewById(R.id.btn_naver);
        btn_911=(Button)findViewById(R.id.btn_911);
        btn_gallery=(Button)findViewById(R.id.btn_gallery);
        btn_end=(Button)findViewById(R.id.btn_end);
        btn_naver.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent=new Intent(Intent.ACTION_VIEW, Uri.parse("http://naver.com"));
                startActivity(mIntent);
            }
        });
        btn_911.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent=new Intent(Intent.ACTION_VIEW,Uri.parse("tel:/911"));
                startActivity(mIntent);
            }
        });
        btn_gallery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent = new Intent(Intent.ACTION_VIEW,Uri.parse("content://media/internal/images/media"));
                startActivity(mIntent);
            }
        });
        btn_end.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
 
}
cs



activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
 
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn_naver"
        android:text="네이버 홈페이지 열기"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn_911"
        android:text="911 응급 전화 걸기"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn_gallery"
        android:text="갤러리 열기"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn_end"
        android:text="끝내기"/>
</LinearLayout>
cs


1.AndroidManifest.xml 클릭

2.좌측하단에 적용시킬 Activity 선택

3.Screen orientation 선택

Screen orientation의 속성

portrit 세로만 보기

landscape 가로만 보기

nosensor 화면전환 막음

sensor 화면전환 가능 (휴대폰의 화면전환 적용 X)

4.저장



또는 AndroidManifest.xml 코드에서 직접적으로
1
2
android:screenOrientation="portrait" //세로고정
android:screenOrientation="landscape" //가로고정
cs
을 추가하면 된다.


이전 포스트에 이어 파일처리를 응용한 간단한 다이어리 에플리케이션이다.


자신이 저장한 파일을 보고싶을 땐 이클립스 기준으로

오른쪽 상단에 Open perstective를 클릭 후 DDMS를 추가한다음 File Explorer를 눌러서 확인할 수 있다.

내부 메모리에 저장된 파일은 /data/data/패키지이름/file에 저장된다.



 




▲ 쓰기를 통해 문자열을 txt형태로 저장한뒤 읽기로 불러들여 TextView에 넣은 스크린샷

안드로이드에서 파일 저장 및 불러오는 프로그램이다.


FileInputStream fis = openFileInput("test.txt");

openFileInput은 저장된 파일을 불러올때 사용하며 FileInputStream타입 변수에 저장한다.

FileOutputStream fos = openFileOutput("test.txt",Context.MODE_WORLD_WRITEABLE);

openFileOutput은 읽기,쓰기 등의 관리에 사용되는데 FileOutputStream 타입 변수에 저장한다.

▲ openFileOutput의 각종 모드들이다.

MODE_WORLD_READABLE  : 읽기

MODE_WORLD_WRITEABLE : 쓰기

MODE_PRIVATE              : 단독으로 읽을때(close()메소드를 통해 끝내지않는한 다른 곳에서 파일                                  을 읽을수 없다.


데이터를 읽을 땐 read() 메소드를 사용하고, 데이터를 넣을 때는 write()메소드를 사용하는데, 데이터를 불러들이거나 저장할 때 byte타입으로 저장해야한다.


FileTest.zip


▲쓰레드 3개를 사용하여 각각 숫자 3000까지 올라가는 프로그램


작업환경 : Eclipse, Android Virtual Device

xml코드를 사용하지않고 java코드로만 만들어서 View 클래스를 상속받은 클래스에서 제작하였다.

그리고 처음부터라는 회색영역을 클릭하는 이벤트가 발생하면 각 쓰레드를 null로 처리하여 제거하고 새로 인스턴스화 하여 구현하였다.

각 클래스 짤막 설명

MainActivity : setContentView에서 xml로 짜여진 layout을 뿌려주는것이 아닌 View를 상속받은 TestView를 화면에 뿌려준것(이때 이 에플리케이션에 대한 정보를 파라미터로 넘겨줌)


TestView : View클래스를 상속받은 클래스로 UI부분과 이벤트를 담당하는 클래스


Thread1 : 랜덤으로 수를 증가하여(그 수들은 TestView안에 있는 변수에 저장한다) 3000을 넘어가면 종료되는 클래스


MultiThread.zip


프로그램을 실행하면 하나의 동작을 할수있지만 동작을 여러번 할 수 있도록 하는 것이 쓰레드이다.


자바에서는 Thread를 상속받거나 Runnable 인터페이스로 구현하는 방법도 존재한다.


public class 클래스명 extends Thread

public class 클래스명 implements Runnable


공통적으로 쓰레드를 구동하였을때 동작하는 부분은 run()메쏘드 안에 넣어서 사용한다.

그리고 쓰레드를 구동하는데는 start()메소드를 사용하고 한번 start메쏘드를 사용하면 그 쓰레드는 더이상 사용할 수 없게 된다.

(Thread를 사용했을 때는 run() 메쏘드를 오버라이딩 한것이고 Runnable 인터페이스를 사용할때는 추상클래스에서 구현한 것이다.)


객체를 생성할 때는 Thread a = new "쓰레드로 구현된 클래스의 생성자" 로 할수도 있고

"쓰레드가 구현된 클래스" a = new "쓰레드가 구현된 클래스의 생성자"로 할수도있다.(다른 메소드나 맴버변수 접근가능)

인터페이스로 구현된 쓰레드는 "Runnable로 구현된 클래스명" = new Thread(new "Runnable로 구현된 클래스 생성자") 로 하면된다.


start()메소드를 사용하여 객체인 쓰레드를 구동시키면 그 쓰레드가 끝났을때 다시 start()메소드를 써도 다시 시작되지않고 새로 객체로만들어서 써야합니다

RGB 각각의 숫자를 입력하면 그에맞는 텍스트의 색을 바꾸는 소스


기본 연산자

연산자는 값을 확인하거나 변경하거나 합치기위한 기호이다. 단순하게 말하자면 평소 수학에서 쓰는 기호들을

사용하는 것과 같다.

Swift는 c 연산자를 지원하고 몇가지 기능을 변경되었다. 예를 들자면 % 기호가 실수타입에서도 사용할 수 있고, a..<b 나 a...b라는 2가지의 범위 연산자를 제공한다.

(가이드 북에서는 a..b 라고 적혀있으나 Swift 에서 코딩해본 결과 에러가 뜨고 a..<b를 해야 인식을 한다.)

 

할당 연산자

a = b 라는 식이 있다면 b값을 a에 할당해주는 것이다.

튜블처럼 오른쪽 식에 여러 값이 들어온다면 왼쪽에 여러 상수(또는 변수)를 할당할 수 있다.(3번 게시물 참고)

 

산술 연산자, 나머지 연산자

말그대로 사칙연산이다. +,-,*,/ 이 네가지를 산술 연산자라 하고 모든 숫자타입에서 지원한다.

덧셈 연산자는 문자열 타입에서도 지원하는데

 

이렇게 두 문자를 붙이는 기능이 있다.

 

나머지 연산자는 a % b 라는 식이 있다면 b로 a를 나눈 나머지 값을 반환하는 것이다.

앞서 설명했듯이 c에서는 정수형에서만 사용할 수 있었다면 Swift 에서는 실수형도 사용가능하다.

 

 

위에 설명한 산술 연산자와 나머지 연산자는 a = a + 3을 a+=3으로 축약할 수 있다.

같은 예로 -= /= *= %= 이 가능하다.

 

증가 연산자, 감소 연산자

a에 1을 더하려면 a = a + 1을 매번 써야 하는 것은 아니다.

a++ 는 a = a +1을 축약한 것이고

마찬가지로 a-- 는 a = a - 1을 축약한 것이다.

이처럼 ++,--기호는 어떤 상수(또는 변수)에 1을 더하거나 빼는 역활을 하는데 이것을 상수(또는 변수)의 앞이나 뒤에 붙일 수 있다.

만약 앞에 쓰인다면 값을 증가(또는 감소)시키고 값을 반환한다면

       뒤에 쓰인다면 값을 반환한 다음에 증가(또는 감소)를 한다.

 

위의 설명을 유의하면서 아래 소스를 참고한다.

 

 if 문

if문은 조건을 주었을 때 참일 경우를(또는 거짓일 경우) 따져서 특정 행동을 실행하는 것이다.

if (조건식)으로 사용하며 참일 때 실행할 소스의 앞과 뒤에 '{' '}'을 적어주고, if문에 또다른 조건식을 넣고싶을 땐 else if (조건식), 거짓일 경우를 실행하고 싶을땐 else를 적어주면 된다.

 

▲배고프므로 밥을 먹으면됩니다.

 

 for-in 문

어떤 일을 반복해서 하고자 할때 사용하는 for-in문이다.

사용방법은 for (변수) in (범위)을 적은 다음 반복하고자 하는 부분의 앞과 뒤에 '{' '}' 를 적는다.

범위를 정하는 것은 상수값이나 배열, 사전으로 가능한데 상수값으로 적었을때는 ..< 과 ... 이있다. 

   
위의 예시로 설명하자면 0...5는 0~5까지 이고 0..<5는 0~4까지 반복을 하는 것이다. 상수값이 들어가는 자리에 상수나 변수를 넣어도 무방하다

for-in문은 지정하는 범위를 배열로 해도되는데 위의 예제의 경우 i는 순서대로 10,20,30,40,50이라는 값이 들어오게된다.

 

다른방법으로 for (변수와 초기값); (조건식); (증가값);이 있는데 아래의 소스를 보면 알겠지만 for-in문과 달리 실수형도 된다.

▲i가 1부터 10까지 0.5씩증가하면서 반복한다.

 

 

옵셔널

옵셔널은 그 값이 존재하냐, 존재하지 않느냐를 체크 하는 것이라고 설명하면 Bool타입과 비슷하게 보인다.

때문에 한가지 예를 들자면,

 

    

▲(왼)Int -> String 타입으로 전환해서 출력, (오) String -> Int 타입으로 전환해서 출력

 

Int->String 에서는 Int타입 상수(또는 변수) 안에 있는 숫자가 어떤 수든 간에 전부 문자열로 바꿀 수있다.

하지만 String->Int 에서는 String타입 상수(또는 변수)안에 숫자뿐만아니라 문자(A,B,C,등)도 포함되있을 수 있기 때문에 Swift에서는 Int 타입이 아니라 Int? 이라는 Optional Int 타입으로 되는 것이다.

Optional Int 타입​에서는 Int 타입처럼 사용할 수 없고 어떤 값이 존재한다 또는 존재하지 않는다 만 인식한다.

 

Optional 에서 본래 상수(또는 변수)로 사용하도록 만들기 위해서는 옵셔널 바인딩(Optional Binding)을 하면 된다.

옵셔널 바인딩은 if문이나 while문을 사용하여 옵셔널 안에 값이 있는지 확인하고 상수(또는 변수)로 추출할 수있다.

 

 

사용법은 간단하게 if 앞에 그대로 넣어주면 된다.

위에 그림과 같이 상수 b에 넣을 a.toInt 값이 Int값을 가지고 있는지 체크하고 만약 그렇다면 b에 a.toInt 값을 기억함과 동시에 b값을 출력하고, Int값이 아니라면 상수 b에는 값이 기억되지 않고 else문이 실행된다.

'프로그래밍 > Swift' 카테고리의 다른 글

타입 세이프와 타입 추정 그리고 타입 전환, 튜블  (0) 2016.07.09
(Swift) 변수와 상수, 출력  (0) 2016.07.09
프로젝트 생성  (0) 2016.07.09
Apple에서 선보인 Swift  (0) 2016.07.09

타입 세이프와 타입 추정 그리고 타입 전환

Swift는 특정 타입을 지정해주지 않아도 코드 내에서 다루는 값들의 타입이 명확하도록 만드는 타입 세이프 언어이다.

때문에 Double 타입이 들어갈 부분에 Bool 타입이나 Int 타입을 전달할 수 없다.

반대로 타입 추정을 이용하여 타입을 일일이 지정해주는 일을 줄일 수 있는 것이 장점이다.

(이전 글에서 타입을 적지 않고 초기값으로 타입 형태가 정해지는 것을 생각하면 될 것같다.)

 

Swift에 기본적인 타입 초기화 및 값 전달 방법은 서로 다른 타입일 때는 아래와 같이 새로운 상수(또는 변수)에서 바꾸고자하는 타입을 앞에 적고 상수(또는 변수)를 괄호로 묶으면 된다.

    

▲Double 타입 변수 aqq에 Int(aqq)를 하여 Int 타입으로 덧셈을 하고 b 변수에 값을 저장한 것.

   마찬가지로 Double타입으로 바꿀려면 Double(aq)를 하면된다. 

 

만약 Int(aqq)를 하지않거나 Double(aq)를 하지않고 aqq, aq만 적었다면 에러가 같은 타입이 아니기 때문에 에러가 뜰 것이다.

 

튜블(Tuples)

튜블은 여러 값들을 하나의 값으로 묶어주는 역활을 한다. 튜블안에서는 어느 타입도 가능할 뿐더러 각각의 타입이 동일할 필요가 없다.

 

사용 방법은 아래와 같이 원하는 상수(또는 변수) = (원하는 값들) 을 하면된다.

또한 저장한 값들은 아래와 같이 언제든지 빼낼 수 있다. 


▲a라는 상수에 "Apple"과 5 라는 값을 저장해놓고 str과 int 변수에 각각 값을 저장하여 출력

 

사용하고싶지 않은 값이 있다면 언더바(_)를 해주면 된다.

▲5라는 값이 저장되있는 곳에 언더바(_)를 하여 값을 안받았다.
 

 

값이 저장되는건 0번부터 저장이 된다.

 a의 0번째 방

a의 1번째 방 

 "Apple"

그러므로 다른 상수(또는 변수)로 옳기지 않고 값을 바로 쓸 수 있다.

▲a.0에는 "Apple"이 저장되있고 a.1에는 5가 저장되있기 때문에 다음과 같은 결과가 출력된다.

'프로그래밍 > Swift' 카테고리의 다른 글

기본 연산자, if 문, for-in 문, 옵셔널  (0) 2016.07.09
(Swift) 변수와 상수, 출력  (0) 2016.07.09
프로젝트 생성  (0) 2016.07.09
Apple에서 선보인 Swift  (0) 2016.07.09

변수와 상수를 사용하기전에 선언을 해야되는데 변수는 var 키워드, 상수는 let 키워드를 사용한다.


▲a라는 변수에 값 10을 넣었고, b라는 상수에 값 1을 넣었다.

 

 

변수는 여러번 값을 변환할 수있지만 상수는 한번 지정하면 값을 변환할 수가 없다.

▲상수 g에 "Hello"을 넣고 "aqzxa"값을 넣으려 했을 때 에러가 뜬다.

 

타입(Type)

 

Swift에서는 타입을 지정하지 않고 타입에 맞는 값을 넣어주면 타입이 자동적으로 바뀐다.

▲c는 Double, d는 Int, e는 Bool, f는 String 타입으로 지정된 것이다.


또한 값을 넣지 않고 어떤 형태로 값을 저장할 것인지 명확하게 타입을 지정할 수있다.

방법은 그림과 같이 var (변수): (타입) 으로 하면되고 타입을 지정해주어도 값을 넣어줄 수 있다.

주의할 점은 타입을 적을 때 앞글자를 대문자로 작성해야한다.

▲a,b,c,d,e,f에 타입을 지정해 주었다. Array이나 Dictionary은 다음에 설명할 예정이다.
 

 타입 이름

값의 종류 

Int (UInt)

정수 (​양의정수) 

Bool

불리언 값(True,False 또는 1,0) 

Double,  Float

실수

String, Character

문자열,문자(한글자) 


Int

Int의 경우 Int32와 Int64도 있지만

Int는 32비트 플랫폼의 경우 Int32와 동일한 크기를 갖고

        64비트 플랫폼의 경우 Int64와 동일한 크기를 갖습니다.

또한 UInt의 경우 부호가 없는 정수타입만 지원합니다.

( 단, 값이 큰경우가 아니라면 Int 타입을 사용해서 뒤에서 다룰 타입 세이프와 타입 추정으로 묘사되는 다른 숫자 형태로의 변환또는 정수의 타입일치가 필요한 경우를 피해 상호처리가 가능하도록 하는 것이 좋다.)

 

 

출력


처음 프로젝트를 만들 때 Println("Hello World") 을 봤을 것이다.

Swift에서는 두가지 출력 방식이 있는데

println(x) 는 x를 출력하고 줄단위로 끊어서 값을 출력해주는 전역 함수이고,

print(x) 는 x를 출력만 한다.

▲print와 println의 차이

 

또한 println, print에서 변수나 상수를 메세지에 포함할 수 있다.

사용방법은 변수나 상수이름을 괄호로 감싸고 앞에백슬레시( \ )를 넣으면 된다.

(다른 여러 기능들은 뒤에서 다룰 예정이다.)

+ Recent posts