파이썬 팁들
-
주피터 슬라이드
-
식별자(identifier)를 변수로 쓰면 곤란함
import keyword; print(keyword.kwlist) # 식별자들 출력
-
인코딩 선언(안해도 됨)
# -*- codine: <encoding-name> -*- # 기본값은 UTF-8
-
docstring : 여러 줄의 주석, 함수 설명을 위해 활용가능
def sum(a,b): """ 덧셈함수임 """ return a+b print(sum.__doc__) # "덧셈함수임"
-
;의 용도 = 한 줄에 여러줄의 코드를 쓰고 싶을 때
print('응'); print("아니야")
\의 용도 = 여러 줄에 한 줄의 코드를 늘여쓰고 싶을 때
a = 0 if a \ == 0: print(a) # 물론 리스트같은건 굳이 저렇게 안해도됨. lunch = ["짜장면", "군만두"]
-
변수는 값을 가지는게 아니라 값을 저장(메모리상에 할당)하는 것.
-> 데이터가 메모리에 저장되있고, 우리의 변수는 그 주소를 가지고있는것이라 생각
x = 1004 print(x) print(id(x)) # reference 출력
-
n진수 사용법
binary = 0b10 octal = 0o10 decimal = 10 hexadecimal = 0x10 print(binary,octal,decimal,hexadecimal) # 2 8 10 16
-
machine epsilon
import sys print(sys.float_info.epsilon) import numpy as np print(np.finfo(자료형).eps)
-
문자열 formatting
hi = "hi" print("%-10s jane"%(hi)) #hi jane
자바 공부
https://github.com/start6666/javastudy
- 객체지향
: sw 시스템을 객체 단위로 구성, 객체들이 서로 관계성을 가짐.
-
클래스 단위로 작성, main() 은 실행을 위해서 존재해야.
virtual machine은 오로지 main()만을 실행함.
-> public static void main(String[] args) 로 VM이 main()을 실행하게 만듬.
-
컴파일 과정
.java .class
java 언어로 작성된 코드 -> byte code(JVM이 인식가능) -> JVM이 읽어서 OS를 위한 번역
컴파일러(javac : 문법 체크, 생략된 부분의 코드 삽입, 기본연산, 최적화)
-
주석 : // & /* */
-
명명 관례
1) 클래스 : 첫글자만 소문자
2) 메소드, 변수 : 전부 소문자
3) constant : 모두 대문자
-
primitive data type & reference data type
전자는 정수, 실수와 같은 느낌이고
후자는 배열, class같이 객체의 주소를 기억하는 변수라고 생각하셈.
-
Type casting(Automatic & Explicit)
-
Operators
1) new : 객체를 생성할 때
2) String 객체도 + 가능함.
3) 비트연산도 가능 : » « & 4) instanceof 연산 : 객체의 타입을 비교
if (a instanceof String) // 역시 클래스의 객체인지도 확인가능함(상속한 조상에 대해서도 true임) if (f instanceof SomeClass)
5) 3항연산자
int a = 10; (a == 10) ? "a는 10이군" : "a는 10이 아니군"
-
조건문
1) 파이썬과 달리 else if으로 사용해야함
2) switch 문법
switch(variable){ case 1: break; case 2: break; case 3: break; default: break; }
3) do-while
do{ //반복 처리 문장 }while(조건문); // 먼저 반복문을 시행한다 -> 조건문이 참이다 -> 계속 반복한다.
4) for문을 이용한 유용한 반복문
for (int s : su){ System.out.print(s+" "); }
-
Array
1) 배열은 반드시 new를 이용하여 instance를 생성하자.
int[] su = new int[5]; int len = su.length // int[] 클래스의 멤버변수같은 느낌인가? Member[] SSAFY = new Member[10]; // 이런식으로 어떤 클래스의 배열도 선언가능
new : 클래스 타입의 instance를 생성해주는 역할
new 연산 -> 메모리(Heap영역)에 데이터 저장할 공간 할당받음 -> 할당받은 reference를 객체에 반환 -> constructor 호출
2) 할당
// 이미 할당했으면 하나씩 지정해줘야함. su[0] = 1; su[1] = 2; SSAFY[0] = new Member(); SSAFY[1] = new Member(); // 선언과 생성, 할당을 동시에 가능 int[] su = new int[]{10,20,30,40,50};
과제 : 이번 주 행운의 숫자 Lotto번호 생성하는 프로그램
1) MyLotto 클래스
2) 메서드1: selectLotto()
로또번호를 지정함
3) 메서드2: uniqueNumber()
중복되지 않는 값을 찾아서 반환함.
java.util.Random 라이브러리 이용
Random() : 랜덤 발생기 생성
int nextInt(int num) : 0부터 num-1 범위의 난수를 반환.
4) 메서드3: print()
로또배열을 프린트함
5) 메서드4: main()
인스턴스를 만들고 메서드를 실행함.
//MyLotto.java package tutorial; import java.util.Random; import java.util.Arrays; public class MyLotto { int[] lo = new int[6]; public MyLotto(int[] lo) { this.lo = lo; } public void selectLotto() { for (int i=0; i<6; i++) { this.lo[i] = uniqueNumber(i); } } private int uniqueNumber(int index) { /* * 1. 랜덤하게 숫자 생성 * 2. 랜덤하게 생성한 숫자와 this.lo의 원소들을 비교 * 3. 같은 원소가 존재하면 안되므로 다시 뽑기 * 4. 모두 봤는데 다르면 다시 뽑지 않아도 됨. */ Random generator = new Random(); int next = 0; boolean bool = true; while(bool){ bool = false; next = generator.nextInt(46) + 1; for (int s : this.lo) { if ( s == next ) { bool = true; System.out.println("다시뽑기"); break; } } break; } return next;} void print() { System.out.println("로또 당첨 번호는 "+Arrays.toString(this.lo)); } }
// Main.java package tutorial; import tutorial.MyLotto; public class Main { public static void main(String[] args) { for (int i=0;i<20;i++) { int[] lo = new int[6]; MyLotto lotto = new MyLotto(lo); lotto.selectLotto(); lotto.print(); } } }
3) copy
배열의 크기 변경을 원할 때 더 큰 크기의 배열을 만들어 복사해야함.
system.arraycopy(소스배열,시작위치,목적배열,시작위치,길이); // 소스배열 : 원래배열, 목적배열 : 복사한 배열, 길이 : 소스배열의 길이
팁 : 입력값 처리하는 방법
- Scanner
import java.util.Scanner;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
// Sc.nextInt(), Sc.next(), Sc.nextLine()
// 장점 : Space, Enter를 모두 경계로 인식함.
// 단점 : 느림
}
- BufferedReader
import java.io.BufferedReader;
// 장점 : 빠름
// 단점 : Enter만 경계로 인식, 타입이 String으로 고정
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public static void main(String[] args) throws IOException{
// IOException : readLine을 할 때마다 try&catch로 예외처리하는 대신 이걸로함(??)
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine(); // 한 줄을 전부 읽어서 문자열로
int i = Integer.parseInt(bf.readLine()); // 한 줄을 전부 읽어서 정수로
// 한 줄이 아니라 토큰마다 가져오고싶을때는(기본값 space)
StringTokenizer st = new StringTokenizer(bf.readLine())
int i = Integer.parseInt(st.nextToken()); // 정수가 되었습니다.
}
과제: 로봇 움직이기
package tutorial;
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Robot {
/*
* 1. BLOCK를 전부 받아서 이중배열에 저장한다.
* 2. BLOCK의 원소를 전부 읽으면서 A,B,C에 따라 행동을 달리한다.
* 3. 읽기 편하게 하기 위해서 BLOCK의 S인것과 아닌것만 구분해보자.
*/
static int N;
static int[][] is_S;
static char[][] block;
static int[][] is_S(){
int len = block[0].length;
int[][] spaces = new int[len][len];
for (int i=0;i<len;i++) {
for (int j=0;j<len;j++) {
if (block[i][j] == 'S') {
spaces[i][j] = 1;
}
}
}
return spaces;
}
static int Count_A(int j, int k) {
int count = 0;
for (int x=k+1;x<N;x++) {
if (is_S[j][x] == 0) break;
count ++;
}
return count;
}
static int Count_B(int j, int k) {
int count = Count_A(j,k);
for (int x=k-1;x>=0;x--) {
if (is_S[j][x] == 0) break;
count ++;
}
return count;
}
static int Count_C(int j, int k) {
int count = Count_B(j,k);
for (int x=j-1;x>=0;x--) {
if (is_S[x][k] == 0) break;
count ++;
}
for (int x=j+1;x<N;x++) {
if (is_S[x][k] == 0) break;
count ++;
}
return count;
}
public static void main(String[] args) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(bf.readLine());
for (int i=0;i<T;i++) {
N = Integer.parseInt(bf.readLine());
block = new char[N][N];
int count = 0;
for (int j=0;j<N;j++) {
StringTokenizer st = new StringTokenizer(bf.readLine());
for (int k=0;k<N;k++) {
block[j][k] = st.nextToken().charAt(0);
}
}
is_S = is_S();
for (int j=0;j<N;j++) {
for(int k=0;k<N;k++) {
switch(block[j][k]) {
case 'A':
count += Count_A(j,k);
break;
case 'B':
count += Count_B(j,k);
break;
case 'C':
count += Count_C(j,k);
break;
}
}
}
System.out.println("#"+(i+1)+" "+count);
}
}
}
- Class design
public class Movie {
/* <pre>
* 회원 정보(Data)와 기능을 구현한 클래스
* </pre>
*
* @author 홍길동
* @version
* @see
*/
String title,director,genre,summary;
int grade;
Movie(String title,String director,String genre,String summary,int grade){
this.title = title;
this.director = director;
this.genre = genre;
this.summary = summary;
this.grade = grade;
}
private void movieInfo() {
System.out.println(this.title);
// ....
}
}
javadoc -d doc -private *.java : 위에서 작성한 주석을 html로 바꿔줌.
이클립스에서도 문서화 가능함(그런데 왜안될까..)
-
JVM 메모리 구조
일반적으로 JVM은 알아서 메모리관리를 함 (GC : Garbage collection 이라는 쓰레드를 통해서 한다는데..?)
- classLoader : 번역된 class 파일을 메모리로 읽어옴
- class area : 읽어온 class 파일을 저장
- heap : class파일의 객체를 생성하여 기억
- stack : 메서드 수행 시 마다 프레임이 할당 -> 임시변수를 제거함.
- Garbage collection : heap 영역 객체들의 메모리 관리를 담당함(사용안하는거 제거)
-
생성자 : 객체 초기화 작업
1) 기본 생성자가 디폴트값으로 있음
2) 만약 다른 생성자를 만든다면 기본 생성자는 없어짐 -> 따로 기본생성자를 만들어야함.
-> Overloading을 이용하라.
-
Method : 이것도 Overloading 가능하다!!
-
Variable lifecycle
1) 멤버변수 : heap에서 생성 , 자동 초기화
static : 클래스마다 공유 가능, class와 생사를 같이함.
나머지(instance variables) : 각 instance와 생사를 같이함.
2) 로컬변수 : stack에서 생성 , 자동 초기화 안됨!
-
-
Access Modifier(접근제한자) : private, (default), protected, public
protected는 패키지상에서 공유는 안되지만 상속받은 클래스간 공유 가능한 접근자
-> Encapsulation(캡슐화) : 접근이 필요한 기능만 public으로 공개
-
Usage Modifier(사용제한자) : static, final(변경불가), abstract(미완성)
-
API (Application programming interface) : class단위의 library
표준 package 예시) java.lang(기본적인 클래스), java.io(입출력관련), java.util(자료관리 클래스)