My Profile Photo

DongChanS's blog


수학과 학생의 개발일지


파이썬과 자바 공부

파이썬 팁들

  1. 주피터 슬라이드

    슬라이드 가이드

  2. 식별자(identifier)를 변수로 쓰면 곤란함

    import keyword; print(keyword.kwlist) # 식별자들 출력

  3. 인코딩 선언(안해도 됨)

    # -*- codine: <encoding-name> -*-
    # 기본값은 UTF-8
    
  4. docstring : 여러 줄의 주석, 함수 설명을 위해 활용가능

    def sum(a,b):
        """
        덧셈함수임
        """
        return a+b
       
    print(sum.__doc__)
    # "덧셈함수임"
    
  5. ;의 용도 = 한 줄에 여러줄의 코드를 쓰고 싶을 때

    print('응'); print("아니야")
    

    \의 용도 = 여러 줄에 한 줄의 코드를 늘여쓰고 싶을 때

    a = 0
    if a \
    == 0:
        print(a)
       
    # 물론 리스트같은건 굳이 저렇게 안해도됨.
    lunch = ["짜장면",
            "군만두"]
    
  6. 변수는 값을 가지는게 아니라 값을 저장(메모리상에 할당)하는 것.

    -> 데이터가 메모리에 저장되있고, 우리의 변수는 그 주소를 가지고있는것이라 생각

    x = 1004
    print(x)
    print(id(x)) # reference 출력
    
  7. n진수 사용법

    binary = 0b10
    octal = 0o10
    decimal = 10
    hexadecimal = 0x10
    print(binary,octal,decimal,hexadecimal)
    # 2 8 10 16
    
  8. machine epsilon

    import sys
    print(sys.float_info.epsilon)
    import numpy as np
    print(np.finfo(자료형).eps)
    
  9. 문자열 formatting

    hi = "hi"
    print("%-10s jane"%(hi))
    #hi         jane
    

자바 공부

https://github.com/start6666/javastudy

  1. 객체지향

: sw 시스템을 객체 단위로 구성, 객체들이 서로 관계성을 가짐.

  1. 클래스 단위로 작성, main() 은 실행을 위해서 존재해야.

    virtual machine은 오로지 main()만을 실행함.

    -> public static void main(String[] args) 로 VM이 main()을 실행하게 만듬.

  2. 컴파일 과정

    ​ .java .class

    ​ java 언어로 작성된 코드 -> byte code(JVM이 인식가능) -> JVM이 읽어서 OS를 위한 번역

    ​ 컴파일러(javac : 문법 체크, 생략된 부분의 코드 삽입, 기본연산, 최적화)

  3. 주석 : // & /* */

  4. 명명 관례

    1) 클래스 : 첫글자만 소문자

    2) 메소드, 변수 : 전부 소문자

    3) constant : 모두 대문자

  5. primitive data type & reference data type

    전자는 정수, 실수와 같은 느낌이고

    후자는 배열, class같이 객체의 주소를 기억하는 변수라고 생각하셈.

  6. Type casting(Automatic & Explicit)

  7. 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이 아니군"
    
  8. 조건문

    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+" ");
    }
    
  9. 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(소스배열,시작위치,목적배열,시작위치,길이);
    // 소스배열 : 원래배열, 목적배열 : 복사한 배열, 길이 : 소스배열의 길이
    

팁 : 입력값 처리하는 방법

  1. 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를 모두 경계로 인식함.
    // 단점 : 느림
}
  1. 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()); // 정수가 되었습니다.
}

과제: 로봇 움직이기

default

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);
		}
	}
}

  1. Class design

2

   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로 바꿔줌.

이클립스에서도 문서화 가능함(그런데 왜안될까..)

  1. JVM 메모리 구조

    일반적으로 JVM은 알아서 메모리관리를 함 (GC : Garbage collection 이라는 쓰레드를 통해서 한다는데..?)

    3

    1. classLoader : 번역된 class 파일을 메모리로 읽어옴
    2. class area : 읽어온 class 파일을 저장
    3. heap : class파일의 객체를 생성하여 기억
    4. stack : 메서드 수행 시 마다 프레임이 할당 -> 임시변수를 제거함.
    5. Garbage collection : heap 영역 객체들의 메모리 관리를 담당함(사용안하는거 제거)
  2. 생성자 : 객체 초기화 작업

    1) 기본 생성자가 디폴트값으로 있음

    2) 만약 다른 생성자를 만든다면 기본 생성자는 없어짐 -> 따로 기본생성자를 만들어야함.

    -> Overloading을 이용하라.

  3. Method : 이것도 Overloading 가능하다!!

    • Variable lifecycle

      1) 멤버변수 : heap에서 생성 , 자동 초기화

      static : 클래스마다 공유 가능, class와 생사를 같이함.

      ​ 나머지(instance variables) : 각 instance와 생사를 같이함.

      2) 로컬변수 : stack에서 생성 , 자동 초기화 안됨!

  4. Access Modifier(접근제한자) : private, (default), protected, public

    protected는 패키지상에서 공유는 안되지만 상속받은 클래스간 공유 가능한 접근자

    -> Encapsulation(캡슐화) : 접근이 필요한 기능만 public으로 공개

  5. Usage Modifier(사용제한자) : static, final(변경불가), abstract(미완성)

  6. API (Application programming interface) : class단위의 library

    표준 package 예시) java.lang(기본적인 클래스), java.io(입출력관련), java.util(자료관리 클래스)

comments powered by Disqus