반응형
Untitled Document.md

프로젝트 오일러 22번 문제


여기 5천개 이상의 영문 이름들이 들어있는 46KB짜리 텍스트 파일 names.txt 이 있습니다 (우클릭해서 다운로드 받으세요). 이제 각 이름에 대해서 아래와 같은 방법으로 점수를 매기고자 합니다.

  • 먼저 모든 이름을 알파벳 순으로 정렬합니다.
  • 각 이름에 대해서, 그 이름을 이루는 알파벳에 해당하는 숫자(A=1, B=2, …, Z=26)를 모두 더합니다.
  • 여기에 이 이름의 순번을 곱합니다.

예를 들어 "COLIN"의 경우, 알파벳에 해당하는 숫자는 3, 15, 12, 9, 14이므로 합이 53, 그리고 정렬했을 때 938번째에 오므로 최종 점수는 938 × 53 = 49714가 됩니다.

names.txt에 들어있는 모든 이름의 점수를 계산해서 더하면 얼마입니까?





파이썬 코드

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
# -*- coding: utf-8 -*-
= open("E:/names.txt",'r')
= f.read()
f.close()
 
temp = s.split(',')
wordslist = [] #순수단어만 뽑아서 저장할 list
 
for words in temp: #단어 양옆에 "제거
    wordslist.append(words.strip('"'))
 
wordslist.sort() #단어를 알파벳 순으로 정렬
 
#알파벳에 해당하는 숫자(점수)
point = {'A':1'B':2'C':3'D':4'E':5'F':6'G':7'H':8'I':9'J':10'K':11'L':12'M':13'N':14'O':15'P':16'Q':17'R':18'S':19'T':20'U':21'V':22'W':23'X':24'Y':25'Z':26}
result = 0 #단어의 점수를 총합할 변수
words_point = 0 #각 단어의 점수를 저장할 변수
index = 1 #몇번째 단어인지 위치를 나타내는 변수
 
for words in wordslist:
    for alphabet in words:
        words_point += point[alphabet]
    result = result + words_point * (wordslist.index(words)+1#한 단어의 점수 합과 해당 단어의 위치를 곱한다
    words_point = 0
 
print result
cs





코드설명

파일을 읽어온다. 텍스트 파일에서 ,를 기준으로 단어를 나누어 리스트(temp)에 저장한다. 그 후, 단어양옆에 "을 제거하여 순수한 알파벳 단어만 남게하여 리스트(wordslist)에 저장한다.


리스트 내장함수 sort를 이용하여, 단어를 알파벳 순으로 정렬한다. 알파벳별 점수를 나타내는 point라는 사전을 만든다. 그 후, 리스트에서 단어를 하나씩 꺼내서 각 알파벳별 점수를 더한다. 그리고 정렬된 단어 순서를 곱하여 최종적인 점수를 구한다.


반응형
반응형
Untitled Document.md

뇌를 자극하는 C# 5.0 프로그래밍 Chapter5 연습문제


1. 다음과 같은 결과를 출력하는 프로그램을 for 문을 이용하여 작성하세요. 규칙은 첫 번째 줄에 별 하나, 두 번째 줄에 별 둘, 세 번째 줄에 별 셋… 이런 식으로 5개의 별이 찍힐 때까지 반복합니다(힌트:for문 블록 안에 for 문 블록을 넣으세요)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
namespace Csharp_practice
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++//총 다섯 개의 줄을 출력한다. 
            {
                for (int j = 0; j < i + 1; j++)
                {
                    Console.Write("*");
                }
 
                Console.WriteLine(""); //한 줄이 끝나면 개행한다(줄바꿈)
            }
 
        }
    }
}
cs

출력결과:




2. 다음과 같은 결과를 출력하는 프로그램을 for 문을 이용하여 작성하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
namespace Csharp_practice
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++//총 다섯 개의 줄을 출력한다. 
            {
                for (int j = 5; j > i; j--)
                {
                    Console.Write("*");
                }
 
                Console.WriteLine(""); //한 줄이 끝나면 개행한다(줄바꿈)
            }
 
        }
    }
}
cs

출력결과:




3. 1번과 2번을 for문 대신 while 문과 do 문으로 바꿔서 각각 작성하세요.

  • while문
1번
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
namespace Csharp_practice
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            int j = 0;
            while (i < 5//총 다섯 개의 줄을 출력한다.
            {
                while (j < i + 1)
                {
                    Console.Write("*");
                    j++;
                }
                Console.WriteLine(""); //한 줄이 끝나면 개행한다(줄바꿈)
                i++;
                j = 0//j를 0으로 초기화한다.
            }
 
        }
    }
}
cs


2번
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
namespace Csharp_practice
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            int j = 5;
            while (i < 5//총 다섯 개의 줄을 출력한다.
            {
                while (j > i)
                {
                    Console.Write("*");
                    j--;
                }
                Console.WriteLine(""); //한 줄이 끝나면 개행한다(줄바꿈)
                i++;
                j = 5//j를 5으로 초기화한다.
            }
 
        }
    }
}
cs


  • do while문
1번
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
using System;
namespace Csharp_practice
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            int j = 0;
 
            do
            {
                do
                {
                    Console.Write("*");
                    j++;
                }
                while (j < i+1); 
 
                Console.WriteLine(""); //한 줄이 끝나면 개행한다(줄바꿈)
                i++;
                j = 0//j를 0으로 초기화 한다.
            }
            while (i < 5); //총 다섯 개의 줄을 출력한다.
 
        }
    }
}
cs


2번
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
using System;
namespace Csharp_practice
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            int j = 5;
 
            do
            {
                do
                {
                    Console.Write("*");
                    j--;
                }
                while (j > i); 
 
                Console.WriteLine(""); //한 줄이 끝나면 개행한다(줄바꿈)
                i++;
                j = 5//j를 5로 초기화 한다.
            }
            while (i < 5); //총 다섯 개의 줄을 출력한다.
 
        }
    }
}
 
cs



4. 다음과 같이 사용자로부터 입력받은 횟수만큼 별을 반복 출력하는 프로그램을 작성하세요. 단, 입력받은 수가 0보다 작거나 같을 경우 "0보다 같거나 작은 숫자는 사용할 수 없습니다."라는 메시지를 띄우고 프로그램을 종료합니다.

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
using System;
namespace Csharp_practice
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("반복 횟수를 입력하세요 : ");
            string input = Console.ReadLine(); //숫자를ㄹ 입력 받는다.
            int number = Convert.ToInt32(input); //입력받은 문자열을 int형으로 바꿔준다.
 
            if(number <= 0//0보다 작거나 같을 경우 메시지 출력 후, 프로그램 종료
            {
                Console.WriteLine("0보다 작거나 같은 수는 입력할 수 없습니다.");
            }
            else
            {
                for(int i = 0;  i < number; i++)
                {
                    for(int j = 0; j < i+1; j++)
                    {
                        Console.Write("*");
                    }
                    Console.WriteLine();
                }
            }
 
        }
    }
}
 
cs

출력결과:
- 0보다 작거나 같은 수를 입력받은 경우




- 0보다 큰 수를 입력받은 경우





반응형
반응형
Untitled Document.md

뇌를 자극하는 C# 5.0 프로그래밍 Chapter4 연습문제


1. i++와 ++i의 차이점은 무엇인가요?

i++는 해당문장 실행이 끝나면 i++를 수행한다. ++i는 해당문장이 실행되기 전에 ++i를 수행합니다. 코드로 예시를 살펴보면 다음과 같다.


1
2
3
int a = 10;
Console.WriteLine(a++); // 이 문장이 실행한 후에 a++를 수행. 이 문장은 10을 출력. 출력 후 a = 11
Console.WriteLine(++a); // 이 문장이 실행하기 전에 ++a를 수행. a = 12가 되고, 그 후 12를 출력.
cs



2. 다음 보기 중에서 결과가 다른 것을 찾으세요(코드가 실행하면 결과가 나옵니다. 고민을 좀 해본 후에 답을 확인해보세요).

  1. i = i + 1;
  2. i++;
  3. ++i;
  4. i += 1;

2번이 결과(출력)가 다르게 나온다. Consol.WriteLine으로 출력을 한다고 가정하자. i++;는 해당문장이 실행이 끝난 후에 수행되기 때문에 해당문장에서는 +1이 된 값이 출력되지 않는다. 반면에 1,2,4번은 해당문장이 실행되면 바로 결과 값을 출력할 수 있다.



3. 다음 코드에서 a와 b는 각각 얼마일까요?

1
2
int a = 8 >> 1;
int b = a >> 2;
cs

>>와 <<는 비트연산자이다. 8을 비트로 표현하면 1000이다. 8 >> 1는 1000을 오른쪽으로 한 비트 옮기라는 말이므로 0100이다. 그러므로 a는 4가 된다.(오른쪽으로 한 비트를 옮기면 2로 나누어진다는 것을 알 수 있다.)

a >> 2는 a를 오른쪽으로 두 비트 옮기라는 말이다. a는 4이고 비트로 표현하면 100이다. 오른쪽으로 두 비트 옮기면 001이 된다. 그러므로 b = 1이 된다.



4. 다음 코드에서 a는 얼마일까요?

1
int a = 0xF0 | 0x0F;
cs


|는 or비트 연산자이다. 0xF0은 16진수이다. 그러므로 2진수로 바꿔야 계산하기 편하다. 16진수 F0은 2진수로 바꾸면 11110000이다. 0F도 2진수로 바꾸면 1111이다. 두 개의 비트를 자리에 맞춰서 or연산을 하면, 11111111가 결과로 나온다. 따라서, 11111111을 10진수로 바꾸면 255임을 알 수 있다. 답은 255.



5. 다음 코드에서 b는 어떤 값을 가질까요?

1
2
int a = 10;
string b = a == 0 ? "가나다" : "ABC";
cs

두 번째 줄의 코드를 살펴보자. 연산자 우선순위를 생각하면, ==, ?:, = 순서로 연산을 수행한다는 것을 알 수 있다. 순서에 따라서 살펴보자.

a == 0을 보자. a는 10이다. 따라서, a == 0은 false(거짓)을 반환한다.
false ? “가나다” : "ABC"를 보자. false이르로 문자열 "ABC"가 반환된다. 마지막으로 string b = "ABC"가 남는다. 따라서 b는 "ABC"라는 문자열 값을 갖는다.

반응형
반응형
안드로이드 컴포넌트.md

안드로이드 4대 컴포넌트(component)




안드로이드 애플리케이션은 컴포넌트(component)로 구성되어있다. 안드로이드의 4대 컴포넌트는 액티비티(activity), 서비스(service), 방송수신자(broadcast receiver), 콘텐트 제공자(content provider)이다. 각 컴포넌트들은 하나의 독립된 형태로 존재하며, 정해진 역할을 수행한다. 이때, 인텐트를 통하여 다른 애플리케이션의 컴포넌트를 활성화시킬 수 있다.


1. 액티비티(activity)


액티비티(activity)는 사용자 인터페이스 화면을 가지며 특정한 작업을 담당하는 컴포넌트이다.

  • 일반적으로 UI를 갖는 하나의 스크린을 나타낸다
  • 안드로이드 애플리케이션은 반드시 하나의 activity를 가지고 있어야한다
  • 각 액티비티는 매니페스트 파일에 등록되어 있어야 한다
  • 하나 이상의 View를 가질 수 있다

2. 서비스(service)


서비스(service)는 백그라운드에서 실행되는 컴포넌트로 오랫동안 실행되는 작업이나 원격 프로세스를 위한 작업을 할 때 사용된다.

  • UI가 없다
  • 한번 시작된 Service는 애플리케이션이 종료되고 다른 애플리케이션으로 이동해도 계속 백그라운드에서 실행된다
  • 모든 서비스는 Service 클래스를 상속받아서 작성된다
  • 네트워크를 통하여 데이터를 꺼내올 수도 있다

3. 방송수신자(broadcast receiver)


방송수신자(broadcast receiver)는 안드로이드 단말기에서 발생하는 다양한 이벤트/정보를 받고 반응하는 컴포넌트이다. 예를들면 시스템부팅, 배터리 부족, 전화/문자 수신, 네트워크 끊김을 알려주는 것이 방송이다.

  • 단말기에서 발생하는 일 중에서 어플리케이션이 알아야 하는 상황이 발생하면 방송을 해준다
  • 수신기(BroadcastReceiver)를 통해 상황을 감지하고 적절한 작업을 수행한다
  • 일반적으로 UI가 없다

4. 콘텐트 제공자(content provider)


콘텐트 제공자(content provider)는 데이터를 관리하고 다른 애플리케이션 데이터를 제공하는 컴포넌트이다.

  • 데이터는 파일 시스템이나 SQLite 데이터베이스, 웹상에 저장될 수 있다
  • 콘텐트 제공자를 통해서 다른 애플리케이션의 데이터를 쿼리하거나 변경 가능하다

5. 인텐트(intent)


인텐트는 서로 독립적으로 동작하는 4가지 컴포넌트들 간의 상호 통신을 위한 장치이다. 간단하게 말하면, 컴포넌트 간의 통신수단이다. 인텐트를 통하여 다른 애플리케이션의 컴포넌트를 활성화시킬 수 있다.



참고

  • 그림으로 쉽게 설명하는 안드로이드 프로그래밍(생능출판, 천인국 지음)


반응형
반응형
안드로이드 버전.md

안드로이드 SDK 버전




예전에 안드로이드 기본개념에 대해서 포스팅 했을 때, 안드로이드 버전에 대해서 간단하게 언급한 적이 있다. 이번에는 안드로이드 SDK 버전에 대해서 좀더 자세하게 살펴보도록 하겠다.


1. Android SDK version이란?


안드로이드 SDK는 version을 가지고 있다. 각 version에 따라서 사용자가 사용할 수 있는 API가 조금씩 다르다. version이 업그레이드 될 때마다, 필요한 기능들이나 개발자가 사용하기 편한 API를 추가나 변경하여 제공한다. version이 높아짐에 따라, 기존에 있었던 API가 삭제되거나 변경될 수 있다는 것이다. 따라서 안드로이드 SDK로 어플리케이션을 개발 할 때에, 어느 version에서 지원가능한지 매니페스트에 범위를 지정해주어야한다.


2. minSdkVersion


글자 그대로 해석을 해보면, '최소 SDK 버전’이다. 즉, 어플리케이션이 실행될 수 있는 최소한의 API Level을 뜻한다. 매니패스트에 선언한 minSdkVersion보다 낮은 안드로이드 버전에서는 이 어플리케이션을 설치, 실행 할 수 없다.


3. targetSdkVersion


어플리케이션의 타켓 API Level을 말합니다. 쉽게 말하면 이 어플리케이션이 개발할 때, 이 버전을 기준으로 개발했다는 것을 뜻합니다. 만약에 매니패스트에 선언이 되어있지 않다면, minSdkVersion과 동일한 값으로 생각합니다. 버그 수정이나, 여러가지 기능 변경으로 어플리케이션을 버전업 할 때, targetSdkVersion을 업데이트하는 것이 유지보수면에서 권장됩니다.



참고


반응형
반응형
프로세스와 스레드.md

[안드로이드]프로세스와 스레드




운영체제에서 프로세스와 스레드에 대해서는 들어봤을 것이다. 여기서는 안드로이드에서의 프로세스와 스레드를 살펴볼 것이다.


1. 프로세스와 스레드 개념


  1. 프로세스

    • 실행 중인 프로그램과 그것의 상태를 나타내는 단위
    • 하나 이상의 스레드를 가질 수 있음
    • 자신만의 메모리 공간을 가짐
    • 각각의 프로세스의 메모리 공간은 분리되어 있음
  2. 스레드

    • 프로그램의 실행 흐름을 표현하는 개념
    • 경량 프로세스라고 불림
    • 프로그램 실행을 담당하는 작업자라고 볼 수 있음
    • 한 프로세스에 속한 다른 스레드와 프로세스의 자원을 공유

2. 안드로이드에서 프로세스와 스레드


안드로이드는 멀티 프로세스, 멀티 스레드 환경을 제공한다. 리눅스 커널을 이용하고 있기 때문에 안드로이드 앱은 리눅스 운영체제의 프로세스를 기반으로 실핸된다. 기본적으로 하나의 앱을 실행하면 하나의 프로세스로 실행된다. 또한, 자바의 멀티 스레드 기능을 그대로 지원한다.


3. 메인 스레드와 작업 스레드


메인 스레드는 어플리케이션 실행을 위해서 생성된다. 메인스레드는 주로 생명주기 함수를 처리하거나 화면에 나오는 UI를 처리한다. 메인 스레드에서 오래 걸리는 작업을 수행하면, 사용자의 UI 이벤트에 즉각적으로 반응하지 않는 문제가 발생하게 된다. 따라서 메인 스레드는 긴 시간이 걸리는 작업을 처리하면 안된다. 따라서 긴 시간이 걸리는 작업은 작업 스레드를 따로 만들어 처리하는 것이 좋다.

  • 메인 스레드

    • 어플리케이션이 실행될 때 기본으로 생성되는 스레드이다.
    • 사용자 인터페이스 위젯에서 이벤트를 전달하거나 화면을 그리는 역할
    • 각종의 생명주기 함수들을 처리
    • UI 스레드(user interface thread)라고도 불림
  • 작업 스레드

    • 메인 스레드를 블록시키지 않기 위해서, 긴 시간이 걸리는 작업을 할 필요가 있는 경우 작성되는 스레드
    • 자바의 스레드 모델을 그대로 따른다. 즉, 다중 스레딩 기능을 사용할 있다.

4. 작업 스레드 주의점


안드로이드에서 뷰의 내용을 변경하여 화면을 갱신하는 작업은 원칙적으로 메인 스레드(UI 스레드)만 가능하다. 즉, 작업 스레드로는 UI를 직접 변경하면 안된다. 이 문제를 해결하기 위해서 안드로이드는 다른 스레드에서 UI 스레드에 접근하는 방법들이 존재한다. 아래에 몇 가지 메소드들이 있다.

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)

post() 메소드는 View 클래스의 메소드로 Runnable 객체를 메시지 큐에 추가하게 된다. 따라서 Runnable 객체가 UI 스레드 위에서 실행된다.

또 다른 방법으로는 핸들러(Handler)를 사용하거나, AsyncTask 클래스를 상속받아서 사용하는 것이다.


참고


  • 그림으로 쉽게 설명하는 안드로이드 프로그래밍(생능출판, 천인국 지음)


반응형

'programming' 카테고리의 다른 글

[안드로이드]안드로이드 4대 컴포넌트  (3) 2015.11.06
[안드로이드]Android SDK version  (0) 2015.11.05
소수 구하는 알고리즘  (0) 2015.11.04
소프트웨어 공학이란?  (0) 2015.11.01
Android SDK란?  (0) 2015.10.29
반응형
소수.md

소수 알고리즘


중학교 때 소수란 것을 배웠을 것이다. 양의 약수가 1과 자기 자신 뿐인 1보다 큰 자연수로 정의된다. 예를들면 2, 3, 5, 7, 11, 13…이 소수이다. 2는 유일한 짝수 소수이다. 소수를 구하는 방법들을 하나씩 알아보자.

1. N보다 작은 수로 나누어본다.


가장 생각하기 쉬운 방법이다. 소수의 성질을 이용하여, N을 2부터 N-1까지 모두 나누어 보는 것이다. 나누어 떨어지는 수가 존재하지 않으면 N은 소수이다.


1
2
3
4
5
6
7
8
def getPrime(number): #number가 소수이면 출력하는 함수
    if number == 2#2는 소수이므로 바로 출력
        print number,
    for x in range(2,number): #2부터 number-1까지 나누어 본다
        if number % x == 0#나누어 떨어지면 소수가 아니므로 break
            break
        elif x == number - 1#number-1까지 나누어지지 않으면 소수
            print number,
cs

파이썬으로 소수를 구하는 함수를 짜보았다. 가장 이해하기 쉬운 방법이지만, N에 큰수가 들어가면 가장 오래 걸리는 알고리즘이다.


2. N을 2부터 sqrt(N)까지 나누어본다.


위에 방법보다 좀 더 효율적인 방법이다. N=a*b 형태로 나타낼 수 있다. 이 때, a와 b는 둘다 1보다 큰 정수이다. a와 b 둘 중 하나는 sqrt(N)보다 작거나 같다. 그러므로 N을 2부터 sqrt(N)까지 나눠서 나누어지지 않으면 소수이다.


1
2
3
4
5
6
7
8
9
10
11
import math 
 
def getPrime(number): #number가 소수이면 출력하는 함수
    if number == 2#2는 소수이므로 바로 출력
        print number,
    for x in range(2,number): #2부터 number-1까지 나누어 본다
        if number % x == 0#나누어 떨어지면 소수가 아니므로 break
            break
        elif (x > math.sqrt(number)): #sqrt(number)까지 나누어지지 않으면 소수
            print number,
            break
cs

for문으로 N보다 작은 수로 나눌 때, sqrt(N)까지 나눠서 소수여부를 판별하므로 N까지 나누는 첫 번째 방법보다 빠르다.


3. N을 N보다 작은 소수로만 나누어본다.


중학교 때, 소인수분해라는 것을 배웠을 것이다. 이 개념을 이용하는 것이다. 소수가 아닌 수는 N보다 작은 소수로 나누어진다.

12를 예를 들어보자. 12의 약수는 1,2,3,4,6,12이다. 약수 중 소수인 것이 소인수이다. 12의 소인수는 2,3이다. 12는 12의 소인수들의 곱으로 표현할 수 있다. 이렇게 표현하는 것이 소인수분해다. 12는 2^2*3라고 소인수분해 할 수 있다.

즉, 소수가 아닌 수는 N보다 작은 소수로 나누어진다는 것을 알 수 있다. 소인수분해에 대해서 좀 더 알고 싶은 분들은 이 블로그를 참고하면 좋을 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import math
 
def getPrime(number):
    primeList = [2#소수 리스트 생성
    num = 3 #3부터 소수인지 검사한다
    
    while (num <= number): 
        for x in primeList:
            if(num % x == 0): #소수로 나누었을 때 나누어지면 소수아님
                break
            elif(x == primeList[-1]): #소수리스트의 끝원소로도 나누어지지 않으면 소수
                primeList.append(num) #구한 소수를 소수리스트에 추가
                break
        num += 1
    
    if(number in primeList): #number가 소수리스트에 존재하면 소수인 것이므로
        print number
cs

마찬가지로 파이썬으로 구현해보았다. 첫 번째 방법보다 적은 수를 나누므로 더 빠르다.


끝으로


위에 3가지 방법을 살펴보았다. 실제로 코딩을 한 뒤, 10만 이상의 큰 수를 넣어보면 실행 차이가 많이 나는 것을 알 수 있을 것이다. 2번과 3번 방법을 혼합하여 더 빠른 알고리즘을 만드는 것도 가능하다.


사실 가장 효율적인 소수 찾는 알고리즘은 에라토스테네스의 체(Sieve of Eratosthenes)방법이 있다. 이 방법에 대해서는 추후에 포스팅할 예정이다.


참고



반응형

'programming' 카테고리의 다른 글

[안드로이드]Android SDK version  (0) 2015.11.05
[안드로이드]프로세스와 스레드  (0) 2015.11.04
소프트웨어 공학이란?  (0) 2015.11.01
Android SDK란?  (0) 2015.10.29
Platform과 Framework의 차이는?  (2) 2015.10.29
반응형
소프트웨어공학.md

소프트웨어 공학이란?




소프트웨어 공학이라는 말을 들어본 적이 있는가? 필자는 컴퓨터공학을 전공하고 있다. 그러나 '소프트웨어공학’이라는 과목이 있다는 것을 보고, 소트웨어 공학이라는 것을 처음 알게되었다. 현재 소프트웨어 공학을 공부하면서 드는 생각은 개발과 관련된 일을 하려면 필수적으로 알아야하는 부분이라는 것이다.


1. 정의


소트프웨어 공학은 간단히 말하자면, 소프트웨어에 공학을 적용하는 것이다. 그러면 소트프웨어는 무엇이며, 공학은 무엇인가?

  • 소프트웨어 : 프로그램, 프로그램의 개발, 운용, 보수에 필요한 정보 일체(소프트웨어 생산 결과물 일체)
  • 공학: 과학적 지식을 인간의 생활을 향상시키기 위해 창의적으고 실질적으로 사용하는 것

대충 소프트웨어 공학에 대한 감이 오는가? 나도 위에 정의만 봤을 때, 정확하게 잘 이해되지 않았다. 아래에는 여러사람들이 소프트웨어 공학에 대해서 나름 정의한 내용이다. 이해하는데 도움이 될 것이다.

질 좋은 소프트웨어를 경제적으로 생산하기 위하여, 공학, 과학 및 수학적 원리와 방법을 적용하는 것 - Watts Humphrey,SEI

소프트웨어의 개발, 운용, 유지보수 및 소멸에 대한 체계적인 접근 방법 - IEEE Computer Society

품질, 효율, 비용, 인정에 관한 공학적인 접근 원리 - F.Brooks


2. 왜 필요한 것인가?


소프트웨어 공학이 어떤 것이라는 것을 어느정도 알게되었다. 그러면 궁금해진다. 도대체 소프트웨어 공학이 왜 필요한 것일까? 그리고 어디에 써먹는 것일까?

결론만을 살펴보면, 좋은 소프트웨어를 잘 개발하고, 잘 관리하기 위해서이다. 굉장히 추상적이다. 그러면 좋은 소프트웨어는 무엇이고, 잘 개발한 다는 것이 무엇인지, 잘 관리한다는 것이 어떻게 관리하는 것인지 자연스럽게 궁금증을 가지게 된다.

깊게 들어가면 많은 내용들이 있지만 간단하게만 살펴보면,

  • 좋은 소프트웨어란 사용자의 요구를 잘 구현한 신뢰성있는 소프트웨어이다.
  • 잘 개발 한다는 것은 적절한 개발 프로세스을 적용하는 것이다.
  • 잘 관리한다는 것은 소프트웨어가 잘 죽지않으며, 유지보수와 재사용이 쉬운 것이다.


3. 소프트웨어의 특징


소프트웨어 공학은 다른 공학과는 다른 특징들을 가지고 있다.

  • 장수(Longevity) : 소프트웨어는 오래된다고 해서 자체적으로 성능이 떨어지거나, 부식되지 않는다.
  • 복제 가능(Duplicability): 생산품을 공장에서 계속 생산해야하는 다른 공학과는 달리 소프트웨어는 한번 만들어지면 계속 복제할 수 있다.
  • 응용에 의존(Application dependability) : 아예 새로운 기능을 가진 소프트웨어를 만드는 것보다는 기존의 있는 소프트웨어를 응용하는 부분이 많다.


4. 마무리하며


필자도 소프트웨어 공학에 대해서 이제 막 배우기 시작했다. 점점 배우면서 느끼는 것은 소프트웨어 관련직을 하려면 필수적으로 알아야하는 부분이라는 것과 발전가능성이 많은 분야라는 것이다. 앞으로도 소프트웨어 공학에 대해서 좋은 내용이 있으면 지속적으로 블로그에 포스팅할 예정이다.


참고


반응형

'programming' 카테고리의 다른 글

[안드로이드]프로세스와 스레드  (0) 2015.11.04
소수 구하는 알고리즘  (0) 2015.11.04
Android SDK란?  (0) 2015.10.29
Platform과 Framework의 차이는?  (2) 2015.10.29
안드로이드란?  (1) 2015.10.28
반응형
Untitled Document.md

Android SDK


안드로이드에선 안드로이드 개발툴을 제공하고 있다. 이 개발툴을 'Android SDK’라고 부른다.

1. Android SDK 정의


Android SDK는 'Android Software Development Kit’의 약자이다. 말그대로 해석해보면 ‘안드로이드 소프트웨어 개발 도구’이다.

안드로이드는 이미 어떤 것인지 포스팅을 했다. SDK는 소프트웨어 개발 도구인데 구체적으로 어떤의미일까?

  • SDK : 개발자가 응용 프로그램을 만들수 있게 하는 개발 도구의 집합 위키백과

2. 특징


구체적으로 안드로이드 SDK에는 어떤 것들이 있을까요?

  1. 안드로이드 API
  2. 안드로이드 응용 프로그램 개발에 필요한 각종도구들
  3. 샘플 코드들
  4. 관련 문서들

참고 : 수타무의 Digital Contents

반응형

'programming' 카테고리의 다른 글

소수 구하는 알고리즘  (0) 2015.11.04
소프트웨어 공학이란?  (0) 2015.11.01
Platform과 Framework의 차이는?  (2) 2015.10.29
안드로이드란?  (1) 2015.10.28
퀵 정렬(quick sort)  (0) 2013.12.05
반응형
Untitled Document.md

Platform과 Framework의 차이는?


Platform(플랫폼)과 Framework(프레임워크)의 차이가 무엇인가? 공부를하다보니 이 부분이 궁금해졌다. 미흡한 부분이 있을지도 모르지만, 이해한대로 정리해보았다.

정의


  • Platform : 소프트웨어를을 실행시킬 때의 기반이 되는 환경과 설정 Computing Platform - Wikipedia

  • Framework : 컴퓨터 프로그래밍에서 구조적으로 고정된 부분을 재사용할 수 있도록 하고, 응용별 특정 기능을 추가적인 사용자 작성 코드에 의해 선택적으로 구현 가능하도록 하는 포괄적인 추상 구조, 그리고 이를 지원하는 소프트웨어 플랫폼을 말한다. 프레임워크 - 두산백과

차이


위에 정의를 봤을 때는 쉽게 와닿지 않는다. 그러나 간단하게 정리해보면 이렇게 정의할 수 있다. 플랫폼은 소프트웨어가 실행되는 환경과 설정이고, 프레임워크는 소프트웨어가 개발될 수 있는 뼈대이다. 위에 프레임워크의 정의를 보면, 플랫폼도 프레임워크의 일종으로 볼 수 있다.

결론


인터넷을 여러 곳에서 찾아봤지만, 어느 곳에서도 명쾌한 차이점과 정의를 나타내는 곳이 없었다. 플랫폼과 프레임워크가 각각 다르지만, 추상적인 개념이므로 명확하게 차이를 이해하는 것이 어렵다. 아래에 링크는 플랫폼과 프레임워크의 차이에 대해 공부하면서 참고한 블로그이다.

반응형

'programming' 카테고리의 다른 글

소프트웨어 공학이란?  (0) 2015.11.01
Android SDK란?  (0) 2015.10.29
안드로이드란?  (1) 2015.10.28
퀵 정렬(quick sort)  (0) 2013.12.05
다익스트라(Dijkstra's) 알고리즘  (0) 2013.12.04

+ Recent posts