2017년 2월 1일 수요일

[Python]List, tuple, dictionary 다루기


[리스트]
[리스트 생성]
서로 다른 자료형을 동시에 넣을 수도 있습니다. 네이버 주식을 5,000주 가지고 있어서 이를 리스트로 표현한다면 다음과 같이 작성할 수 있습니다.
>>> mystock = ['Naver', 5000]>>> len(mystock)>>>2
파이썬의 리스트를 만들 때 항상 데이터가 있어야 하는 것은 아닙니다. 다음과 같이 리스트를 만들 때 '['와 ']' 기호 사이에 데이터를 넣지 않으면 아무것도 들어 있지 않은 빈(empty) 리스트가 만들어집니다.
>>> mystock = []
[리스트 슬라이싱]
>> kospi_top10 = ['삼성전자', 'SK하이닉스', '현대차', '한국전력', '아모레퍼시픽', '제일모직', '삼성전자우', '삼성생명', 'NAVER', '현대모비스']
앞에서 배운 파이썬 인덱싱을 사용해 코스피 기준 시가총액 5위를 출력하는 프로그램을 작성하면 다음과 같습니다. 여기서 한 가지 주의할 점은 파이썬의 인덱스는 0부터 시작하기 때문에 kospi_top10[4]가 리스트 내에서 5번째에 위치하는 데이터라는 것입니다.
>>> print("시가총액 5위: ", kospi_top10[4])
시가총액 5위:  아모레퍼시픽              
현재 kospi_top10이라는 리스트에는 10개의 종목이 있는데, 만약 코스피 상위 5종목만으로 구성된 새로운 리스트를 만들고 싶다면 어떻게 할까요? 다음과 같이 리스트의 슬라이싱을 사용하면 새로운 리스트를 손쉽게 만들 수 있습니다.
>>> kospi_top5 = kospi_top10[0:5]
>>> kospi_top5['삼성전자', 'SK하이닉스', '현대차', '한국전력', '아모레퍼시픽']              
[리스트 삽입]
>>> kospi_top10.append('SK텔레콤') //뒤에서부터 자동 삽입>>> kospi_top10.insert(3, 'SK 텔레콤') //삽일될 위치를 정해 줄 수 있다.
[리스트 삭제]
>>> kospi_top10[-1]
'현대모비스'
>>> del kospi_top10[-1]

[딕셔너리]
파이썬의 딕셔너리도 영어사전과 유사하게 키(key)와 값(value)이라는 쌍으로 데이터를 구성해서 저장함으로써 더 쉽게 저장된 값을 찾을 수 있는 구조입니다.
딕셔너리는 '{'와 '}' 기호를 사용합니다. 리스트와 튜플을 복습해보면 리스트는 '['와 ']' 기호를 사용했고, 튜플은 '('와 ')' 기호를 사용했습니다. 다음과 같이 아무것도 들어 있지 않는 빈 딕셔너리를 하나 만들어 봅시다.
>>> cur_price = {}
위 코드를 실행하면 메모리의 어딘가에 딕셔너리가 하나 만들어지고, 이를 cur_price라는 이름의 변수가 바인딩합니다. 정말로 딕셔너리가 잘 만들어졌는지 type 내장 함수를 이용해 확인해 봅시다. type 함수의 반환값을 보면 'dict'라는 문자열이 있는데, 이것은 dictionary의 줄임말입니다.
>>> type(cur_price)
<class 'dict'>

원소가 들어 있지 않은 딕셔너리가 잘 만들어졌으니 딕셔너리에 키-값 쌍을 하나 추가해보겠습니다.
>>> cur_price['daeshin'] = 30000
사전에 키와 값 쌍을 하나 추가했으니 해당 데이터가 잘 추가됐는지 딕셔너리를 확인해 봅시다.
>>> cur_price
{'daeshin': 30000}
>>> len(cur_price)
1
파이썬의 딕셔너리는 리스트와 튜플과 달리 인덱싱을 지원하지 않습니다. 딕셔너리는 리스트와 튜플과 달리 데이터를 순서대로 저장하는 것이 아니라 키와 값의 쌍이 서로 연결되도록만 저장하기 때문입니다. 따라서 다음과 같이 딕셔너리에 정숫값을 이용해 인덱싱하면 오류가 발생합니다.
>>> cur_price[0]
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    cur_price[0]
KeyError: 0
>>> cur_price[1]
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    cur_price[1]
KeyError: 1
딕셔너리는 리스트나 튜플과 달리 원소를 추가한 순서대로 데이터가 저장돼 있지 않기 때문에 딕셔너리에 추가한 데이터를 얻으려면 키 값을 사용해야 합니다. 
>>> cur_price['daeshin']
30000

[딕셔너리 삽입]
딕셔너리에 데이터를 삽입하는 방법을 정리해보면 딕셔너리는 리스트의 append나 insert 같은 메서드를 지원하지 않으며, 명시적으로 키-값 쌍을 넣어야 했습니다.
>>> cur_price['naver'] = 800000
>>> cur_price = {'Daum KAKAO': 80000, 'naver':800000, 'daeshin':30000}
>>> cur_price
{'naver': 800000, 'Daum KAKAO': 80000, 'daeshin': 30000}
>>>

[딕셔너리 삭제]
딕셔너리에 저장된 데이터를 삭제하려면 리스트와 마찬가지로 del을 사용하면 됩니다. 참고로 튜플은 리스트와 딕셔너리와 달리 데이터를 삭제할 수 없었습니다. 
>>> del cur_price['daeshin']
>>> cur_price
{'naver': 800000, 'Daum KAKAO': 80000}
>>> 

[key 값만, value값만 구하기]

키 값만 구하고 싶을 때 "딕셔너리이름.keys()"라고 호출하면 됩니다.
>>> cur_price = {'Daum KAKAO': 80000, 'naver':800000, 'daeshin':30000}
>>> cur_price.keys()
dict_keys(['naver', 'Daum KAKAO', 'daeshin'])
keys() 메서드의 반환값을 보면 'Daum KAKAO'와 'naver'가 파이썬의 리스트로 표현된 것 같기도 한데 그 앞에 'dict_keys'라는 것이 있습니다. 사실 keys() 메서드의 반환값은 리스트는 아니며, 리스트로 만들려면 list라는 키워드를 이용해 타입을 변환해줘야 합니다.
>>> stock_list = list(cur_price.keys())
>>> stock_list
['naver', 'Daum KAKAO', 'daeshin']
딕셔너리에서 키 목록을 구하는 것과 비슷하게 값 목록을 구하려면 values()라는 메서드를 사용하면 됩니다. cur_price 딕셔너리에서 값 목록을 리스트로 만들어 바인딩해 봅시다.
>>> price_list = list(cur_price.values())
>>> price_list
[800000, 80000, 30000]
'Samsung'이라는 종목의 현재가를 cur_price라는 딕셔너리로부터 구해야 한다고 해봅시다.
>>> 'Samsung' in cur_price.keys()
False
위 코드에 대해 한글로 해석해보면 'Samsung'이 keys() 안에 있는가? 정도가 됩니다. 그렇다면 'naver'는 어떨까요? 'naver'라는 종목명은 cur_price의 키 중 하나임을 알 수 있습니다.
>>> 'naver' in cur_price.keys()
True
'naver'는 cur_price 딕셔너리의 키 중 하나이기 때문에 키를 통해 현재가 데이터를 구할 수 있습니다. 그러나 'Samsung'은 키에 포함돼 있지 않기 때문에 'Samsung'이라는 키를 사용하면 오류가 발생합니다.
>>> cur_price['naver']
800000
>>> cur_price['Samsung']
Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    cur_price['Samsung']
KeyError: 'Samsung'
>>>
출처: https://wikidocs.net/2858

2017년 1월 31일 화요일

[English]Day7


Language Focus - useful phrasesLearn phrases you might use when people are leaving home:
  • -I'm proud of you.
  • -It's the opportunity of a lifetime.
  • -Don't do anything I wouldn't do!  : 나쁜일은 하지마라
  • -Have a good time and don't get into trouble!
  • -Make the most of it.  : 그것을 최대한 활용해라
  • -Safe journey!
  • -Have a good trip.
  • -Keep in touch!
Here are some other phrases you could use:
  • -Look after yourself!   : 자기일은 스스로 해라
  • -Be lucky!
  • -You're going to have a great time.
Language Focus - vocabulary
Learn words and phrases for describing someone who gets emotional easily.
  • -mushy  : 지나치게 감상적인
  • -a big softy
Here is another word you could say:
  • -a (big) wuss : 쪼다
   -sensible : 합리적인

2017년 1월 29일 일요일

[Java]자주나오는 예외 클래스


- 배열의 접근에 잘못된 인덱스 값을 사용하는 예외상황
 : ArrayIndexOutOfBoundsException

- 허용할 수 없는 형변환 연산을 진행하는 예외상황
 : ClassCastException

- 배열선언 과정에서 배열의 크기를 음수로 지정하는 예외상황
 : NegativeArraySizeException

- 참조변수가 null로 초기화 된 상황에서 메소드를 호출하는 예외상황
 : NullPointerException

- 연산이 불가능한 예외상황 (0으로 나누었을 시)
 : ArithmeticException

- 파일의 소유권이 계정의 범주가 아닐때
 : PermissionError

2017년 1월 26일 목요일

[JAVA] JAR에 관하여


package, classpath, 환경변수에 대해 잘 설명한 글

http://thinkdk.tistory.com/entry/JAVA-%ED%81%B4%EB%9E%98%EC%8A%A4%ED%8C%A8%EC%8A%A4%EC%99%80-%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98-%EA%B7%B8%EA%B2%83%EC%9D%B4-%EC%95%8C%EA%B3%A0-%EC%8B%B6%EB%8B%A4




콘솔에서 자바 컴파일
>>javac -d hellow.java
    현재 디렉토리를 classpath로 정하고 컴파일 되면 패키지 디렉토리가 생성. hellow.class     파일이 해당 디렉토리에 저장된다.
>>javac -cp hadoop-core-1.2.1.jar FileWriteRead.java
    FileWriteRead자바 파일을 실행하기 위해서는 hadoop-core.jar 라이브러리를 참조해야       한다. classpath에 추가해 컴파일.




jar 파일 옵션

-tf : 목록을 출력하고 파일의 내용을 풀어놓는다.
-xf : 파일들을 추출한다.

jar {ctxu}[vfm0M] [jar-file] [manifest-file] [-C dir] files ...
옵션:
    -c  새 아카이브를 만듭니다.
    -t  아카이브에 대한 목차를 나열합니다.
    -x  아카이브에서 명명된 (또는 모든) 파일을 추출합니다.
    -u  기존의 아카이브를 업데이트합니다.
    -v  표준 출력에 대한 자세한 정보 출력을 생성합니다.
    -f  아카이브 파일 이름을 지정합니다.
    -m  지정된 증명 파일에서 증명 정보를 포함시킵니다.(매니패스트)
    -0  저장만 수행하며 ZIP 압축을 사용하지 않습니다.
    -M  입력 항목에 대한 증명 파일을 만들지 않습니다.
    -i  지정된 jar 파일에 대한 색인 정보를 생성합니다.
    -C  지정된 디렉토리로 변경하고 다음 파일을 포함시킵니다.
디렉토리인 파일이 하나라도 있으면 재귀적으로 처리됩니다.
'm' 및 'f' 플래그가 지정된 순서대로 증명 파일 이름과 아카이브 파일 이름을 지정해야 합니다.



jar파일 포함된 class 보기
>>jar -tf filename



jar 파일 만들기
>>jar -cvmf manifest.txt my.jar *.class
>>jar -cvf Myjar.jar test1.class test2.class (아카이브에 class 추가)

mainfest는 main파일이 포함된 클래스를 지칭함.
내용
-> Main-Class: Myclass
-> Main-Class: test.Myclass (패키지)
:뒤에 한칸 띄어야하고 문장끝에 enter



jar 파일 실행
>>java -jar myjar.jar
>>./bin/hadoop jar hadoop-example.jar package.test.java1 input.txt output.txt


2017년 1월 23일 월요일

[JAVA]Hexa to bin(16진수 정수 -> 2진수 정수)


16진수 문자열을 2진수 문자열로 변환하는 프로그램 
 
1] 문제
 
16진수의 문자열을 2진수의 문자열로 변환하는 프로그램을 작성한다.
ex]
16진수 문자열을 입력하시오 :
1ac
“1ac”에 대한 이진수는
0001
1010
1011
1100
 
 
 
2] 알고리즘 및 설명
 
Step 1 : String 배열 hexa16진수 ‘0’~‘f’에 해당하는 이진수 문자열 값을 정의한다.
Step 2 : String bin16진수 문자열을 입력 받는다.
Step 3 : bin문자열의 charAt(index)메소드를 통하여 ‘0’~‘f’에 해당하는 이진수 문자열 값을 Switch을 이용하여 출력한다.
 
 
 
3] 프로그램 코드
import java.util.*;

public class Hexa {
public static void main(String args[]) {
String[] hexa =
               { "0000", "0001", "0010", "0011", "0100",
                 "0101", "0110", "0111", "1000", "1001", "1010",
 "1011", "1100", "1101", "1110", "1111" };

                String bin;
System.out.println("16진수 문자열을 입력하시오 : ");
bin = new Scanner(System.in).next();
System.out.println("bin+에 대한 이진수는 ");

for (int i = 0; i < bin.length(); i++) {
switch (bin.charAt(i)) {
case '0':
System.out.println(hexa[0]);
break;
case '1':
System.out.println(hexa[1]);
break;
case '2':
System.out.println(hexa[2]);
break;
case '3':
System.out.println(hexa[3]);
break;
case '4':
System.out.println(hexa[4]);
break;
case '5':
System.out.println(hexa[5]);
break;
case '6':
System.out.println(hexa[6]);
break;
case '7':
System.out.println(hexa[7]);
break;
case '8':
System.out.println(hexa[8]);
break;
case '9':
System.out.println(hexa[9]);
break;
case 'a':
System.out.println(hexa[10]);
break;
case 'b':
System.out.println(hexa[11]);
break;
case 'c':
System.out.println(hexa[12]);
break;
case 'd':
System.out.println(hexa[13]);
break;
case 'e':
System.out.println(hexa[14]);
break;
case 'f':
System.out.println(hexa[15]);
break;
default:
System.out.println("wrong value");
}
}
}
}

 
4] 실행 결과













[JAVA]Histogram program

 

입력 값들의 히스토그램을 만드는 프로그램


1] 문제
 
입력 값들의 분포를 시각적으로 볼 수 있는 히스토그램을 만드는 프로그램을 작성하시오. 이 프로그램은 1100사이의 정수 10개를 일어야 하고 1~10, 11~20 등의 범위에 드는 값들의 횟수를 아래와 같이 출력하여야 한다.
 
ex]
1-10 : ****
11-20 :**
21-30 :**
.....
 
 
2] 알고리즘 및 설명
 
Step 1 : 배열 2(Sting[] arr, int[] num)를 선언한다.
num배열은 값은 받아 저장할 배열이고,
arr배열num의 입력 값에 따라 ‘*’를 넣어 시각적으로 출력할 배열이다.
 
Step 2 : 배열 num1-100의 정수 10개를 입력 받는다.
Step 3 : ((i*10)+1)((i+1)*10)를 통해 arr배열에 ‘*’을 채워 넣는다.
I0을 넣으면 1-11이 되고 1를 넣으면 11-20이 되는 식이다.
 
Step 4 : 반복문을 통해 arr배열을 출력하여, 입력 값들의 분포를 출력한다.
 
 
 
3] 프로그램 코드

import java.util.*;

public class arrHistogram {
public static void main(String args[]) {

String[] arr = new String[10];

int[] num = new int[10];
Scanner scan = new Scanner(System.in);

for (int i = 0; i < 10; i++) {
     System.out.println((i + 1)+"번째 값을 입력하세요.");
     num[i] = scan.nextInt();
} // 배열 num에 1-100개 정수 10개를 입력받는다.

for (int i = 0; i < 10; i++) {
arr[i] = ((i * 10) + 1) + "-" + ((i + 1) * 10) + ":";

    // arr의 0번째 인덱스에 값의 범위를 표시하는 String을 넣는다.

for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
if ((i * 10)+1<=num[j] && num[j]<=(i+1)*10)
arr[i] += "*";
   // 배열 num의 인덱스의 값에 따라 배열arr에 ‘*’를 넣는다.

for (int i = 0; i < 10; i++) {

System.out.println(arr[i]);
} // 배열 arr을 출력한다.
}

}

 
 
4] 실행 결과























2017년 1월 19일 목요일

[JAVA]비행기 class 설계


비행기를 나타내는 Class 설계

1] 문제
 
비행기를 나타내는 Plane라는 이름의 클래스를 설계하라.
1)필드를 정의하라. 모든 필드는 전용 멤버로 하라.
2)모든 필드에 대한 접근자와 설정자메소드를 작성한다.
3)Plane클래스의 생성자를 몇 개를 중복 정의하라.
4)PlaneTest라를 이름의 클래스를 만들고,
main()에서 객체 여러 개를 생성하고 접근자와 설정자를 호출하여 보라.
5)생성된 비행기의 개수를 나타내는 정적 변수인 planes를 추가하고,
생성자에서 증가시켜 보자.
6)Plane클래스에 정적 변수 planes의 값을 반환하는 정적 메소드 getPlanes()
추가하고 main()에서 호출하여 보라.
 
 
 
2] 알고리즘 및 설명
Step 1 : 객체를 생성하고 예제에 맞는 필드를 선언한다.
 
Step 2 : 생성자를 받는 값의 개수에 따라 오버로딩하고, 인자 값을 받지 않는 필드는 NULL로 초기화 한다. 또한 모든 필드에 대하여 접근자설정자를 작성한다.
 
Step 3 : 필드에 정적 변수 count를 선언하고, 이를 반환하는 정적 메소드
getPlanes()도 추가한다.
 
Step 4 : main()에서 객체가 잘 생성되었는지
1)접근자와 설정자 호출,
2)객체 생성시 값의 개수에 따른 생성자 정의,
3)정적 변수와 정적 메소드
잘 동작하는지 확인한다.
 
 
  
3] 프로그램 코드

class Plane {
private String company;
private String model;
private int psg;
public static int count = 0;

public Plane(String company, String model, int psg) {
this.company = company;
this.model = model;
this.psg = psg; // 필드를 정의.
count++; // 정적 변수 정의.
}

public Plane(String company, String model) {
this(company, model, 0);
}

public Plane(String company) {
this(company, "\0", 0);
}

public Plane() {
this("\0", "\0", 0);
} // 여기까지 생성자 중복 정의.

public String Getcom() {
return company;
}

public String Getmo() {
return model;
}

public int Getpsg() {
return psg;
}
// 각 필드의 접근자 메소드 정의.

public void Setcom(String scom) {
company = scom;
}

public void Setmo(String smo) {
model = smo;
}

public void Setpsg(int spsg) {
psg = spsg;
}
// 각 필드의 설정자 메소드 정의.

public static int getPlanes() {
return count;
}// 정적 변수를 반환하는 정적 메소드 정의.
}

public class PlanTest {
public static void main(String args[]) {
Plane p1 = new Plane("Asisna", "co-22", 500);
Plane p2 = new Plane("Jeju", "S1027");
Plane p3 = new Plane("k-12");
Plane p4 = new Plane(); // 여러 객체 생성.
p1.Setpsg(400); // 설정자 호출.
System.out.println(p1.Getpsg()); // 접근자 호출.
System.out.println(p3.Getmo()); // 인자를 받지 않는 생성자는 NULL.
System.out.println(Plane.count); // 정적 메소드 ‘count’ 호출.
}
}


 

4] 실행 결과