for문은 범위가 주어지고, 그 범위가 끝날 때까지 구문을 반복 후 종료.

while문은 특정 조건이 주어지고, 참인 경우에만 구문을 반복. 거짓인 경우는 종료한다.

반복문은 반드시 : 을 붙여야 작동한다!!

 

 

1. for문

리스트에서 1~4번째를 호출해야한다. 리스트 → 호출 이니까 앞에만 -1 하여 [0:4]가 된다.
그러니까 range 범위를 아무 생각 없이 (0,4,)로 넣으면 된다고 생각할 수 있으나 리스트와 호출에서 생각하는 번호와 range 함수에서 범위는 개념이 다르다.물론, [0:4]가 0+1번째 ~ 4+1번째 전. 즉, :4]의 값은 들어가지 않기 때문에 (,4,)에서 4 이상이 나오면 정지시키는 range 함수에 의해 값이 포함되지 않기 때문에 그대로 (0,4,)를 넣으면 되는게 맞다. 단, 리스트의 index와 range 범위는 전혀 다른 개념이니 아래를 참고할 것.

2020/03/25 - [개발자/Python] - range 함수 이해하기

 



for문이 리스트의 값을 삭제하며 돌아갈 경우 어떻게 되는지 아래를 참고한다.
(Q. 다음과 같은 TestList가 있다. 이 중 국가만 뽑아내려 한다.)

해당 예제의 올바른 사용법은 다음 링크를 참고한다.

2020/03/25 - [개발자/Python] - Python (파이썬) 홀수값, 짝수값

 

 

2. while문

위에서 tvList로 했던 예제를 while문으로 동일한 결과를 만들어보자.

 

 

한글 깨짐 해결하기 (.jsp 파일에 추가) jsp 한글, jsp 한글 깨짐, 자바 한글, 자바 한글 깨짐, java 한글, java 한글 깨짐

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

 

C 태그 사용하기 (.jsp 파일에 추가)

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

 

jQuery 추가하기 jquery Jqeury

<link rel="stylesheet" href="fontawesome-free-5.10.1-web/css/all.min.css" />
<script src="http://code.jquery.com/jquery-latest.min.js"></script>

 

Sqlite , JSON 설치하기 dependency (pom.xml 파일에 추가)

		<!-- SQLite -->
		<dependency>
			<groupId>org.xerial</groupId>
			<artifactId>sqlite-jdbc</artifactId>
			<version>3.27.2.1</version>
		</dependency>
		<!-- JSON -->
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.13</version>
		</dependency>

 

단축키

Option + Space (윈도우에서는 Ctrl + Space) : 자동완성

Command + Shift + 'O' (윈도우에서는 Ctrl + Shift + 'O') : 자동 임포트

Command + '/' (윈도우에서는 Ctrl + '/' ) : 주석

 Command + 'F' : 찾기

Control + 'H' : 검색

sysout + 자동완성 : System.out.println(); 이 자동으로 타이핑 된다.

cf. Preferences -> Templates 검색 -> 여기 가면 다양한 자동완성 탬플릿이 있다. 만약 필요하다면 추가하고, 안 쓰는게 자꾸 자동완성 된다면 꺼버리자.

Command + Option + 'R' : 프로젝트나 클래스 이름 변경. (우클릭 -> Refactor -> Rename 과 같다.)

Command + Option + 'V' : 자바 파일 이동. (그냥 드래그 앤 드랍으로 다른 프로젝트로 옮기면 작동 안 한다.)

 

 

 

자료형 및 기본 문법

int, long : 정수 / Integer : 정수 (int는 단순 자료형으로 객체가 아니고, Integer는 클래스로 객체다.)
float, double : 실수
String, char : 문자열, 문자 (전부 소문자로 시작하는데 문자열만 대문자로 시작한다. 문자열은 쌍따옴표, 문자는 따옴표)
boolean : 참/거짓

자료형 변수명 = 값; 형태로 쓴다. i.e. int age = 25;
자료형 배열명[] = {값1,값2,값3...}; 형태로 쓴다. i.e. int score[] = {80,70,90,100,60,80,90,70};
자료형 []배열명 = {값1,값2,값3...};
형태도 가능하다. i.e. int[] score = {80,70,90,100,60,80,90,70};

new : 초기화, 인스턴스 생성, 포맷 -> 메모리 주소를 할당한다는거다. 사용하도록 하겠다.

ABC.split("K") : ABC라는 변수가 가진 문자열을 문자열 "K" 분리해서 배열로 만든다.

ABC.replace("abc","def") : ABC라는 변수가 가진 문자열을에서 "abc" "def" 치환 한다.

ABC.split(K) : ABC라는 변수가 가진 문자열을 K라는 변수가 가진 문자열로 분리해서 배열로 만든다.

ABC.substring(3,6) : ABC라는 변수가 가진 문자열에서 인덱스 3:6을 뽑아낸다.

 

 

상속

main() 메소드가 있는 클래스 : 실행 클래스. 해당 패키지 내에서 프론트엔드에 해당하는 부분.

main() 메소드가 없는 클래스 : 함수 클래스. 해당 패키지 내에서 백엔드에 해당하는 부분.
     public 클래스명() : 클래스명을 메소드 이름으로 갖는 메소드 -> 생성자(초기값 설정).
     public void 메소드명() : return이 없는 메소드.
     public int 메소드명() : return 타입이 int인 메소드.

클래스명 extends 클래스명 : 클래스명 Super 클래스로 갖는 클래스명(Sub 클래스)
     클래스명 : Sub 클래스
     클래스명 : Super 클래스

클래스명 implements 인터페이스명 : 인터페이스명 규약을 통해 참조하는 클래스명

 

 

형변환

(int)123.456
(double)20

Integer.parseInt(ABC) : ABC를 숫자로 형변환.
Integer.toString(123) : 123을 문자로 형변환.
(Integer만 Double로 바꿔서 응용 가능하다.)

ABC.equals("DEF") : ABC의 문자열이 "DEF"와 같으면 true, 다르면 false (자세한거는 하단의 '기타'를 참고).

반올림 / 올림 / 내림 Math 이용

public class RoundTest {
	public static void main(String[] args) {
		
		double ABC = 1234.56789;
		
		// 곱하기 몇을 하면, 나누기 몇을 하면 몇의 자리니 하는 식으로 생각하지 말고 소수점을 좌우로 밀고 당겨 반올림 하고 원래대로 밀고 당겨 복원시킨다는 개념으로 이해하자.
		// 반올림
		System.out.println(Math.round(ABC));					// 결과 : 1235
		System.out.println(Math.round(ABC / 100) * 100);		// 결과 : 1200
		System.out.println(Math.round(ABC / 1000) * 1000);		// 결과 : 1000
		System.out.println(Math.round(ABC * 100) / 100.0);		// 결과 : 1234.57		(반드시 100.0으로 나눠야한다. 안 그러면 소수점 아래가 날아감.)
		System.out.println(Math.round(ABC * 1000) / 1000.0);	// 결과 : 1234.568
		
		System.out.println("");
		
		// 올림
		System.out.println(Math.ceil(ABC));						// 결과 : 1235.0
		System.out.println(Math.ceil(ABC / 100) * 100);			// 결과 : 1300.0
		System.out.println(Math.ceil(ABC / 1000) * 1000);		// 결과 : 2000.0
		System.out.println(Math.ceil(ABC * 100) / 100.0);		// 결과 : 1234.57
		System.out.println(Math.ceil(ABC * 1000) / 1000.0);		// 결과 : 1234.568
		
		System.out.println("");
		
		// 내림
		System.out.println(Math.floor(ABC));					// 결과 : 1234.0
		System.out.println(Math.floor(ABC / 100) * 100);		// 결과 : 1200.0
		System.out.println(Math.floor(ABC / 1000) * 1000);		// 결과 : 1000.0
		System.out.println(Math.floor(ABC * 100) / 100.0);		// 결과 : 1234.56
		System.out.println(Math.floor(ABC * 1000) / 1000.0);	// 결과 : 1234.567
	
	}
}

 

자릿수 맞춤 String.format 이용

 

 

 

배열

int ABC[] = new int[10] : 비어있는 공간 10개짜리 빈 배열을 선언하고 초기화.

int ABC[] : 배열을 선언만 하고 초기화는 하지 않음. (나중에 ABC = new int[10] 으로 공간을 만들어 초기화 할 수 있다.)

int ABC[] = DEF : int DEF[] = {......} 배열을 ABC 배열에 복사한다. 뒤에는 DEF[]로 쓰지 않는다.

ABC.length : ABC 배열의 길이를 반환.

Arrays.toString(ABC) : ABC 배열을 레퍼런스(메모리 주소값)이 아닌 파이썬 리스트 형태로 출력.

Arrays.sort(ABC) : ABC 배열을 오름차순 정렬(숫자, 영문, 한글 모두 가능)

Arrays.sort(ABC, Comparator.reverseOrder()) : ABC 배열을 내림차순 정렬 (정수는 반드시 Integer로 선언해줘야 한다. int는 오류남.)

Arrays.sort(ABC, Collections.reverseOrder()) : 위와 동일하다. 정수는 Integer 필요함.

Arrays.stream(ABC).sum() : ABC 배열의 합을 구함.

 

 

 

함수

스캐너 Scanner (입력 받기)

import java.util.Scanner;    // 임포트 스캐너 라이브러리

Scanner s = new Scanner(System.in);    // int a 처럼. 스캐너 s를 ~로 선언해라 = 새로운 스캐너 값(시스템으로 들어온)으로

int userInputNumber = s.nextInt();    // 스캐너를 이용해 . Int( )로 넘겨라

double userInputNumber = s.nextDouble();    // 스캐너를 이용해 . Double( )로 넘겨라

String userInputWord = s.next();    // 스캐너를 이용해 . 넘겨라 

String userInputSentence = s.nextLine();    // 스캐너를 이용해 . 문장으로 넘겨라

더보기
import java.util.Scanner;

public class scanner review {
	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		String line = scanner.nextLine();
		System.out.print(line);
	}
}

입력 : 학교 종이 땡땡땡
출력 : 학교		// 띄어쓰기가 나오면 종료되어 뒤에는 입력을 받지 못해서 그렇다.


import java.util.Scanner;

public class homework_revieew {
	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		String word = scanner.next();
		System.out.print(word);
	}
}

입력 : 학교 종이 땡땡땡
출력 : 학교 종이 땡땡땡

------------------------------------------------------------

랜덤 Rnadom (입력 받기)

import java.util.Random;    // 임포트 랜덤 라이브러리

Random r = new Random();    // 랜덤 r을 ~로 선언해라 = 새로운 랜덤 값으로

int lotto = r.nextInt();    // 랜덤을 이용해 . Int( )로 넘겨라

int dice = r.nextInt(6);    // 랜덤을 이용해 . Int(6 이전)으로 넘겨라

더보기
import java.util.Random;

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

		Random r = new Random();
        
        int dice = r.nextInt(6);
        System.out.println(dice + 1);

	}
}

결과 :
6 미만의 수 0, 1, 2, 3, 4, 5가 실행할 때마다 랜덤으로 나온다.
따라서 +1을 해줬으니 1~6의 수가 랜덤으로 출력된다.

------------------------------------------------------------

foreach문

for (int value:ABC) {	// ABC 배열이 int이기 때문에 int value:ABC가 된다.
	value를 변수로 사용하는 로직 구성. i.e. System.out.println(value);
}

for ( 자료형 value:ABC ) {
    value를 변수로 갖는 로직
}

형태로 쓴다. 자료형은 ABC 배열의 자료형을 말하며, value는 각각의 값을 꺼내오란 의미다. 즉, ABC 배열에 하나씩 접근해! 라는 뜻이다.

여기서 value는 ABC 배열의 각각의 값이 된다.

2020/04/05 - [개발자/Java] - Java (자바) 배열과 레퍼런스에 가서 파이썬이나 스위프트처럼 배열을 모두 출력하기 를 참고하자.

 

Java (자바) 배열

1. 배열 선언하기 & 래퍼런스 자바의 배열을 선언하는 방법은 두 가지로 나뉜다. 자료형 배열명[] = {값1,값2,값3...}; 형태로 쓴다. i.e. int score[] = {80,70,90,100,60,80,90,70}; 자료형 []배열명 = {값1,값2..

greendreamtrre.tistory.com

 

기타

문자 비교연산

자바에서는 문자를 == 로 비교연산 할 수 없다.

String ABC = "Hello"; 가 있을 경우 "Hello"가 맞는지 비교연산을 하고싶다면 다음과 같이 한다.

ABC.equals("Hello") : true
ABC.equals("Hi") : false

변수명.equals("문자열") 로 == 비교연산을 대신한다.

 

 

Spring

@RequestMapping 기본 폼

	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		
		return "home";
	}
	
	@RequestMapping(value = "/signup", method = RequestMethod.GET)
	public String signup(Locale locale, Model model) {

		return "signup";
	}
	
	@RequestMapping(value = "/signin", method = RequestMethod.GET)
	public String signin(Locale locale, Model model) {

		return "signin";
	}

 

DataReader.java 기본 폼

import java.sql.Connection;
import java.sql.DriverManager;
import org.sqlite.SQLiteConfig;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DataReader {
	private Connection connection;
	private String dbfileName;
	private String dbTableName;
	static {
		try {
			Class.forName("org.sqlite.JDBC");
			
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	public DataReader(String databaseFileName, String dbTableName) {
		this.dbfileName = databaseFileName;
		this.dbTableName = dbTableName;
	}
	public boolean open() {
		try {
			SQLiteConfig config = new SQLiteConfig();
			this.connection = DriverManager.getConnection("jdbc:sqlite:/" + 
			this.dbfileName, config.toProperties());
		}catch(SQLException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	public boolean close() {
		if(this.connection == null) {
			return true;
		}
		try { 
			this.connection.close();
			
		}catch(SQLException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

}

 

SHA-256 암호화

        dataReader.open();		// DataReader를 연다.
		try {
			MessageDigest digest = MessageDigest.getInstance("SHA-256");	// SHA 알고리즘 클래스 호출.
			byte[] hash = digest.digest(password.getBytes("UTF-8"));	// 암호화 할 데이터를 "UTF-8"로 읽어 위에서 만든 알고리즘을 이용해 해쉬를 한다.
			StringBuffer hexString = new StringBuffer();				// 문자열을 잠시 담기 위한 버퍼 호출.
			
			// 해쉬한 문자열을 16진수(hex)로 바꿔주는 로직.
			for (int i = 0; i < hash.length; i++) {
				String hex = Integer.toHexString(0xff & hash[i]);
				if (hex.length() == 1) {
					hexString.append('0');
				}
				hexString.append(hex);
			}
			
			// 이 위에는 password 변수가 담은 값을 SHA-256을 하는 과정이고, 실제 DB에 Insert 쿼리를 보내는건 아래 한 줄이다.
			dataReader.insertData(name, id, hexString.toString());		// password 변수 대신 hexString.toString()을 넣어야 SHA-256 암호화 한 데이터를 보낸다.
			
		} catch (Exception ex) {
			throw new RuntimeException(ex);		// RuntimeException을 추가한다.
		}
		dataReader.close();		// DataReader를 닫는다.

 

CSS (.jsp 파일 head에 추가) (CSS 파일 위치 : 프로젝트 > src > main > sebapp > resources)

<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/파일이름.css">

 

쿼리 보내기

String query =
PreparedStatement preparedStatement = this.connection.prepareStatement(query);
int result = preparedStatement.executeUpdate();   또는   ResultSet resultSet = preparedStatement.executeQuery();

String query =
Statement statement = this.connection.createStatement();
int result = statement.executeUpdate(query);   또는   ResultSet resultSet = statement.executeQuery(query);

1) PreparedStatement Statementquery를 쓰는 위치가 다르다.
2) int result 쿼리의 실행 결과 return값이 없어도 되지만, ResultSet resultSet 쿼리의 실행 결과 return값이 반드시 필요하다. ResultSet은 쿼리의 실행 결과를 ResultSet이라는 객체로 받는다. 따라서, INSERT, UPDATE와 같은 return값이 없는 쿼리의 경우는 int result 를 써야하고, SELECT와 같이 return값이 있는 쿼리의 경우는 ResultSet resultSet 를 써서 return값을 객체로 받아야 다시 HomeController에 return을 할 수 있다.

 

DataReader 메소드의 return 형태에 따른 차이

	public int 메소드(인풋 파라미터) throws SQLException {
		String query = 
		PreparedStatement preparedStatement = this.connection.prepareStatement(query);	// PreparedStatement를 이용해 접속 엔진을 연다.
		preparedStatement.setString(1, 값);
		preparedStatement.setString(2, 값);
		int result = preparedStatement.executeUpdate();	// .executeQuery()의 return값은 boolean이라 int result에 담을 수 없다. 최종 return값인 result가 int형태기 때문에 .executeUpdate()로 쿼리를 보내야한다. 
		preparedStatement.close();

		return result;		// return값은 int 형태여야한다. (하지만 위 HomeController는 이 메소드를 호출한 다음 return값은 받지 않는다. 메소드는 return을 보내지만 HomeController에서 return값을 받지 않음.)
	}
    
    

	public boolean 메소드(인풋 파라미터) throws SQLException {
		boolean result = false;
		String query = 
		PreparedStatement preparedStatement = this.connection.prepareStatement(query);
		preparedStatement.setString(1, 값);	// 1번째 물음표
		preparedStatement.setString(2, 값);	// 2번째 물음표
		ResultSet resultSet = preparedStatement.executeQuery(); // ResultSet은 쿼리 결과를 그대로 받아온다.
		if (resultSet.next()) {
			result = true;	// ResultSet을 이용해 일치하면 return값인 result에 boolean 형태의 값을 넣너준다.
		}
		resultSet.close();
		preparedStatement.close();
		
		return result;		// return값은 boolean 형태여야한다. (위 HomeController에서 return값을 받아 사용한다.)
	}

파라미터에 String이 아닌 Int값을 넣고 싶다면 preparedStatement.setInt(1, );을 사용한다.

여러개를 조회할 때는 while로 조회하고, 하나만 선택할 때는 if로 조회한다.

setString 일 때는 if (resultSet.next())로 조회했지만, setInt 일 때는 while(resultSet.next())로 조회한다.(?? 확인 필요)

 

세션 처리

@RequestMapping의 메소드가 인풋 파라미터로 HttpServletRequest request를 미리 인스턴스화 해놔야한다.

// 세션에 저장하기
HttpSession session = request.getSession();
session.setAttribute(String "변수명", Object 값);

// 세션 불러오기
HttpSession session = request.getSession();
String 변수명 = (String)session.getAttribute("변수명");

// 세션 종료
HttpSession session = request.getSession();
session.invalidate();

 

HTML 테이블 형태로 데이터를 내보내기 (DataReader -> HomeController -> VIew)

	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
    	DataReader dataReader = new DataReader(dbUrl, "tableName");
		dataReader.open();
		try {
			String result = dataReader.selectData();
			model.addAttribute("userInfo", result);
		} catch (Exception e) {
			e.printStackTrace();
		}
		dataReader.close();
        
	return "home";

 

$(".class태그")

$("#id 태그")

$("[name=name태그]")

 

String query = "INSERT INTO " + this.dbTableName + " (name, id, pw, nclass, address, phone, created) values(?,?,?,?,?,?,?);";

String query = "SELECT * FROM " + this.dbTableName + " WHERE id=? AND pw=?;" ;

String query = "UPDATE " + this.dbTableName + " SET name=?, nclass=?, address=?, phone=?, modified=? WHERE id=?;";

String query = "DELETE FROM " + this.dbTableName +  " WHERE " + " id=?; " ;


SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = dateFormat.format(System.currentTimeMillis());

 

<!-- form 태그는 type="submit" 버튼을 누르면 action을 실행한다. name은 각각 파라미터 이름이 되고, 입력된 값은 각 파라미터의 값이 된다. HomeController에서 HttpServletRequest가 .getParameter를 통해 파라미터와 값에 접근한다. -->
<form action="/Users/signup_action" method = "post">
  이름 <input type="text" name="name" placeholder="이름을 입력해주세요" />
  <br />
  ID <input type="text" name="id" placeholder="아이디를 입력해주세요" />
  <br />
  PW <input type="password" name="password" placeholder="패스워드를 입력해주세요" />
  <br /><br />
  <input type="submit" name="" value="회원가입" />
</form>

 

 

jsp 파일과 html 파일 사용의 차이

  jsp 파일을 만들 경우, 컨트롤러(서버)에 각 페이지의 jsp파일을 html 파일로 컴파일해서 보내주는 라우터를 만들어야한다.
따라서, home.jsp가 있다면 home.jsp를 html로 컴파일해서 보내주는 라우터가 하나 필요하다.
하지만 처음부터 html파일로 만들 경우 서버는 요청이 들어오면 자동으로 html파일을 보내주기 때문에 라우터가 필요 없다.
  이후는 jsp, html 모두 동일하게 해당 페이지에서 요청하는 CRUD 기능 개수만큼 라우터를 만들어주면 된다.
예를 들어 home이라는 페이지가 있고, 그 페이지에서 CRUD 액션이 하나씩 있다면 필요한 라우터는 아래 표와 같다.

  jsp html
   home.html
   페이지 요청에
   응답하는 라우터
@GetMapping("/home")
public String home(Model model) {
  return "home";
}
라우터 필요 없음
C @PostMapping("/home_action")
public String homeInsert(Model model) {
  return response;
}
@PostMapping("/home_action")
public String homeInsert(Model model) {
  return response;
}
R @GetMapping("/home_action")
public String homeSelect(Model model) {
  return response;
}
@GetMapping("/home_action")
public String homeSelect(Model model) {
  return response;
}
U @PutMapping("/home_action")
public String homeUpdate(Model model) {
  return response;
}
@PutMapping("/home_action")
public String homeUpdate(Model model) {
  return response;
}
D @DeleteMapping("/home_action")
public String homeDelete(Model model) {
  return response;
}
@DeleteMapping("/home_action")
public String homeDelete(Model model) {
  return response;
}

CRUD의 return type은 response로 보낼 데이터에 따라 String, int, MashMap, ArrayList 등으로 적당히 바꿔 사용하면 된다.
   i.e. public HashMap<String, Object> homeSelect(Model model)

 

문자열이 정수(숫자)로 형변환 가능한지 확인하는 메소드

	// String이 숫자로 형변환이 가능한지 아닌지를 검사하는 메소드
	private boolean isIntegerString(String numericString) {
		try {
			int result = Integer.parseInt(numericString);
			return true;
		} catch (Exception e) {
			
		}
		return false;
	}

 

문자열이 실수(숫자)로 형변환 가능한지 확인하는 메소드

	// String이 실수로 형변환이 가능한지 아닌지를 검사하는 메소드
	public static boolean isFloatString(String numericString) {
		try {
			double result = Double.parseDouble(numericString);
			return true;
		} catch (Exception e) {
			
		}
		return false;
	}

 

for each

자바

for (type var: iterate) {

}

for(String number: numbers) {

}

for (People each : objects) {

}

iterate는 반복될 데이터, type에는 var의 자료형, var에는 for each 내부에서 사용할 변수명이다. iterate에는 ArrayList 등이 들어간다.

즉, 타입의 numbers라는 그룹에서 String 타입의 데이터를 number라는 변수로 for each를 돌린다.

objects 라는 그룹에서 People 타입의 데이터를 each라는 변수로 for each를 돌린다.
이 때 넘겨받은 objects는 ArrayList<People> objects 다.

 

jsp(c 태그 이용)

<c:forEach var="each" items="${list }">

</c:forEach>

${list } 이 부분에서 ${ } 이거는 스프링에서 홈컨트롤러로부터 addAttribute로 넘겨 받은 변수라 이렇게 적었다.

 

 

 

Playground에서 정지 버튼을 누르고 좌측 숫자 옆에 재생 버튼을 누르면 그 행까지만 실행한다. (Shfit + return과 동일) Shift + return을 반복해서 한줄씩 내려가며 디버깅하기 좋음.

 

자료형

Int정수 (기본적으로 Int만 써도 Int64로 설정된다. 그보다 작은 단위를 쓰려면 Int8, Int16, Int32 등으로 사용.)

UInt : 0 ~ 양의 정수. Int의 64비트 표현 범위가 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 인데 이걸 음수의 표현 범위를 전부 양수로 돌린다. 따라서 0부터 (9,223,372,036,854,775,807 + 9,223,372,036,854,775,808)까지 표현이 가능하다. 즉, 최대로 표현할 수 있는 양의 정수 크기는 Int일 때의 9,223,372,036,854,775,807 x 2 + 1 이다.

Float, Double실수 (Float은 32비트, Double은 64비트다. 단, Float도 Int 의 9,223,372,036,854,775,807 보다는 큰 수를 표현할 수 있다.)

Sring, Character문자

Bool : /거짓

 

var : 변수

let상수

\(변수 또는 계산식) : 문자열 내에 이런 형태가 있을 경우 문자가 아니라 변수나 계산식을 의미한다.

var helloString:String = "Score"        // 문자열이 들어갈 수 있다.
var helloCharacter:Character = "A"      // 단일 문자만 들어갈 수 있다.
print("\(helloString) \(helloCharacter)")   // "Score + 공백 1칸 + A"

var helloString1 = "Good"                        // 생략하면 스위프트가 알아서 판단함.
var helloString2 = helloString1 + " morning"     // 문자열끼리 더할 수 있다.
print(helloString2)
print("\(helloString2) friends!")		// \( )는 문자 안의 변수나 계산식이다.

결과 :

Score A
Good morning
Good morning friends!

 

 

 

문법

< 변수 >

var height:Int = 170    / Int는 생략하고 var height = 170으로 입력하면 스위프트가 알아서 판단한다.

var weight:Double = 62.5    / Double은 생략하고 var weight = 62.5로 입력하면 스위프트가 알아서 판단한다.

var itemCount1:Int = 10     // 정수로 선언.
print(itemCount1)

var itemCount2 = 10         // 생략하면 스위프트가 알아서 판단함. 위와 같다.
print(itemCount2)

var itemCount3:Double = 10  // 실수로 선언.
print(itemCount3)

var itemCount4 = 10.0       // 생략하면 스위프트가 알아서 판단함. 위와 같다.
print(itemCount4)

결과 : 

10
10
10.0
10.0

 

< 상수 >

let pi:Double =3.14    / 변하면 안 되는 상수(constant)를 선언할 때 사용한다. 아래 코드블럭 예를 참고.

var i = 2	// i = 2로 선언
print(i)	
i = i + 2	// i에 2가 더해져 4가 됨.
print(i)

let j = 2
print(j)
 j = j + 3	// 상수에 값을 더하라 해서 에러 발생!!

 

< 문자와 print()문, 기본 개행 >

파이썬의 print(" {} {} ".format(변수1,변수2)) 와 비슷하다. 문자열 내에 이 녀석이 있으면 문자가 아니라 변수나 계산식이다.

var helloString:String = "Score"        // 문자열이 들어갈 수 있다.
var helloCharacter:Character = "A"      // 단일 문자만 들어갈 수 있다.
print("\(helloString) \(helloCharacter)")   // "Score + 공백 1칸 + A"

var helloString1 = "Good"                        // 생략하면 스위프트가 알아서 판단함.
var helloString2 = helloString1 + " morning"     // 문자열끼리 더할 수 있다.
print(helloString2)
print("\(helloString2) friends!")		// \( )는 문자 안의 변수나 계산식이다.

결과 :

Score A
Good morning
Good morning friends!

스위프트는 print()를 하면 라인 하나에 하나씩 출력되는 파이썬과 같다. 따라서 다음 프린트문 넘어가기 전에 \n을 하면 개행을 2번 한 것과 같은 결과가 나온다.

print("Hello world\n")  // Hellow world를 찍어라. (기본적으로 파이썬처럼 한 줄에 하나의 명령이 들어가서 자동 개행된다.) (자바는 개행을 수동으로 해줘야 함.)
print("Hello world\n")  // Hellow world를 찍고 개행을 해라. (기본 개행에 \n개행을 한 번 더 해서 2번 개행된다.)
print("\nHello world")  // 개행을 하고 Hellow world를 찍어라.
print("\tHello world")  // 탭을 하고 Hellow world를 찍어라.
print("\n\tHello world")    // 개행을 한 다음 탭을 하고 Hello world를 찍어라.

print("\(3+2)") // \( )에 의해 변수 또는 계산식이 된다.
print("3+2")    // "3+2"라는 문자로 인식.

결과 :

Hello world

Hello world


Hello world
	Hello world

	Hello world
5
3+2
2
4
2

 

< True or False >

Bool 참/거짓

var diet:Bool = false	// diet의 자료형은 Bool이고, 값은 false다.
print(!diet)		// (!=not)(diet=false) -> not false -> true

if(diet == false) {	// (diet = false)니까 true! if문 실행!

}
if(!diet) {		// (!diet)는 true니까 if문 실행.

}

 

< 형변환 >

1. Int ⟷ Double 형변환 : Int와 Double은 같이 연산이 불가능하다.

var intValue:Int = Int(123.75) // 형변환 없이 Int로 선언한 변수에 123.75를 입력하면 오류 발생.
print(intValue)

var price:Int = 100
var totalPrice = Double(price) * 1.1  // 그냥 더하면 에러남. Double로 형변환 해야 계산됨.
print(Int(totalPrice))

결과 : 

123
110

 

2. 숫자 → 문자의 형변환 : 문자 변수 내에 숫자 변수를 넣기 위해선 형변환이 필요하다.

(주의! 문자열 내에 \(변수 또는 계산식)을 삽입하는 것과 혼동하지 말자. 문자 + 문자에 문자가 아닌 다른 자료형이 들어가면 에러가 발생하기 때문에 형변환이 필요하다. 아래 코드블럭을 참고하자.)

var maskCount:Int = 100
var message:String = "mask " + String(maskCount) + " remains"	// 형변환 하지 않으면 에러 발생.
print(message)

print("maks " + String(maskCount) +  " remains")	// 형변환 하지 않으면 에러 발생.
print("maks \(maskCount)" + " remains")
print("maks \(maskCount) remains")

결과 :

mask 100 remains
maks 100 remains
maks 100 remains
maks 100 remains

 

 

 

단축키

명령모드(Command) 단축키

: above (위에 셀 추가하기) 

: bottom (아래 셀 추가하기) 

d+d : delete + delete (셀 삭제하기) 

shift + 'l' : line (셀 줄번호 표시하기) 

shift + 'm' : merger (셀 병합)

 

편집모드(Edit) 단축키

control + Return : 셀 실행

shift + Return : 셀 실행 후 아래 셀로 이동

option + Return : 셀 실행 후 아래 셀 삽입하며 이동

shift + Tab : 도움말

Tab : 자동 완성

control + '/' : 코드 주석 처리(해당 코드라인 가장 앞에 #을 넣는 기능)

control + shift + '-' : 셀 나누기 / shift + m 병합하기와 반대 기능

 

 

자료형 및 기본 문법

( ) : 함수, 쿼리

[ ] : 호출, 리스트

{ : } : 딕셔너리

ESC키를 누르면 명령(Command)모드로 전환
Return키를 누르면 편집(Edit)모드로 전환

ESC키를 눌러 명령모드로 전환된 상태에서 'M'키를 누르면 Markdown 상태가 되어 제목이나 메모를 기록할 수 있다. (M : Markdown, Y : Code)

 


문자열, 리스트

sum(ABC) : ABC 리스트의 합을 반환.

min(ABC) : ABC 리스트에서 최솟값 반환.

max(ABC) : ABC 리스트에서 최댓값을 반환

int(ABC) : ABC의 자료형을 숫자(정수)로 형변환. 소숫점 이하는 내림.

float(ABC) : ABC의 자료형을 숫자(실수)로 형변환.

str(123) : 123의 자료형을 문자로 형변환.

type(ABC) : ABC의 자료형을 반환한다.

ABC = 123 : 123은 숫자(정수)

ABC = "123" : 123은 문자

print(secinfo[3][0]) : secinfo 리스트의 3번 인덱스 값의 0번 인덱스 값

print(secinfo[0][2]) : secinfo 리스트의 0번 인덱스 값의 2번 인덱스 값

print(secinfo[1][1]) : secinfo 리스트의 1번 인덱스 값의 1번 인덱스 값

ABC[2] = 120 : ABC 리스트의 2번 인덱스 값을 120으로 업데이트한다. insert와 비교

ABC[2:4] = [120,250] : ABC 리스트의 2번 인덱스 ~ 4번 인덱스 전까지 값을 120,250으로 업데이트한다.

ABC.remove(120) : ABC 리스트에서 가장 앞에서 발견된 120을 삭제한다.

del ABC[3] : ABC 리스트에서 3 인덱스 값을 삭제한다.

ABC.pop() : ABC 리스트에서 마지막 값을 반환 후 리스트에서 삭제한다.

ABC.pop(3) : ABC 리스트에서 3번 인덱스 값을 반환 후 리스트에서 삭제한다.

ABC[2:5] = [ ] : ABC 리스트의 2번 인덱스 ~ 5번 인덱스 전까지 값을 삭제한다.

ABC.append(300) : ABC 리스트의 마지막에 값 300을 덧붙인다.

ABC.insert(3,200) : ABC 리스트의 3번 인덱스에  값 200을 삽입한다. update와 비교

ABC.extend([135,270]) : ABC 리스트의 마지막에 [135,270] 리스트를 연장한다.

(리스트 + 리스트 포맷은 리스트 연산으로도 가능하다. ABC = ABC + [135,270])

ABC.sort() : ABC 리스트의 값을 오름차순 오름차순 정렬한다. 1,2,3,4. ( 저장 X / 저장하려면 ABC = ABC.sort() )

ABC.sort(reverse = False) : ABC 리스트의 값을 오름차순 정렬한다. 1,2,3,4. 반드시 대문자로 쓴다. false로 입력하면 에러!!

ABC.sort(reverse = True) : ABC 리스트의 값을 내림차순 정렬한다. 4,3,2,1. 반드시 대문자로 쓴다. true로 입력하면 에러!!

len(ABC) : ABC 리스트의 길이를 반환.

ABC.index(120) : ABC 리스트에서 값 120의 인덱스를 반환.

ABC.count(120) : ABC 리스트에서 값 120의 개수 세기.

ABC.index("G") : ABC에서 대문자 "G"의 인덱스를 반환.

ABC.count("G") : ABC에서 대문자 "G"의 개수 세기.

ABC.upper() : ABC의 모든 문자를 대문자로 바꾼다.

ABC.lower() : ABC의 모든 문자를 소문자로 바꾼다.

ABC.replace("G","K") : ABC에서 대문자 "G"를 대문자 'K"로 바꾼다.

DEF = ABC.split("G") : ABC를 대문자 "G"를 기준으로 n개로 분리한 값들을 DEF 리스트로 만든다.

print("원숭이 엉덩이는 {} 빨가면 {} 사과는 {}".format(변수1, 변수2, 변수3)) : 변수와 문자열 여러개가 섞인 경우 출력 방법.

ABC.strip() : ABC 문자열 앞뒤의 공백(/n, /t 포함)을 제거한다. (문자열 중간의 공백은 유지)
 

딕셔너리

ABC["Key1"] : ABC 딕셔너리의 "Key1"에 대응하는 "Value1"을 반환한다.

ABC["Key1"] = "Value1_1" : ABC 딕셔너리에 "Key1"이 있으면 Value값을 "Value1_1"로 업데이트한다.

ABC["KeyA"] = "ValueA" : ABC 딕셔너리에 "KeyA"가 없으면 {"KeyA ": "ValueA"}를 딕셔너리에 추가한다.

del ABC["Key2"] : ABC 딕셔너리의 "Key2"와 그에 대응하는 "Value2"를 삭제한다.

dic.pop("Key2") : ABC 딕셔너리에의 "Key2"에 대응하는 "Value2"를 반환 후 딕셔너리에서 삭제한다.

 

홀수값 뽑아내기

ABC[0::2] : 리스트 0번에서 시작. 등차는 2.

 

짝수값 뽑아내기

ABC[1::2] : 리스트 1번에서 시작. 등차는 2.

반복문으로 표현하는 방법은 다음 글 하단을 참조한다.

 


 함수

import datetime as dt        (as dt는 빼도 되지만 이름을 선언하는게 코딩 하기 더 좋다.)

datetime.datetime.now()는 통째로 외우자!

datetime 모듈 이름을 dt라 정했다면, dt.datetime.now()로 쓸 수 있다.

 

ABC.hour : (ABC가 시간값일 때) 시(hour)를 정수로 출력.

ABC.minute : (ABC가 시간값일 때) 분(minute)을 정수로 출력.

 

import pandas as pd
import d6stack : 판다스 성능 향상.

pd.DataFrame(ABC, columns=[' ']) : ABC 리스트를 데이터프레임으로 만들기.

pd.DataFrame(zip(ABC,DEF), columns=[' ',' ']) ABC, DEF 리스트를 데이터프레임으로 만들기.
(2개 이상의 리스트를 데이터프레임으로 만들려면 한 번에 zip()으로 묶어서 만들거나
각각 데이터프레임으로 만든 다음 pd.concat으로 합친다.)

ABC.columns = ['aaa','bbb','ccc'] : ABC 데이터프레임에 aaa, bbb, ccc를 각 컬럼헤더로 넣기. (컬럼헤더를 못 넣고 데이터프레임을 만들었을 경우.)

ABC.rename(columns = {'aa':'A','bb':'B'}):ABC 데이터프레임의 컬럼헤더를 aa, bb에서 A, B로 변경하기.
파이썬에는 inplace라는 옵션을 가지는 함수가 있다. inplace=False : 저장 안 함.   inplace=True 저장함.
rename 함수의 inplace 기본값은 False로 저장하려면 다시 변수에 넣어주거나 .rename({ },inplace=True) 옵션을 준다.

ABC.index = ['aaa','bbb','ccc'] : ABC 데이터프레임에 aaa, bbb, ccc를 각 인덱스로 넣기. (로우헤더.)

pd.concat([ABC,DEF,GHI], axis = 1) : ABC,DEF,GHI 데이터프레임을 하나로 합치기. (axis = 0 : 위아래로, axis = 1 : 좌우로)

ABC.head(2) : ABC 데이터프레임에서 첫 2줄만 보기.

ABC.tail(2) : ABC 데이터프레임에서 끝 2줄만 보기.

ABC.columns :  ABC 데이터프레임의 컬럼헤더 보기.

ABC['컬럼헤더'] : ABC 데이터프레임에서 컬럼헤더가 '컬럼헤더'인 것만 보기.

ABC.loc[ABC.컬럼명 == ] : ABC 데이터프레임을 제한한다. ABC 데이터프레임의 컬렴명 만 뽑는다.

 

 

pd.read_csv("../../../ABC.csv") : ABC.csv를 판다스로 불러오기. (한글 포함 파일 에러 발생시, encoding='ms949' 또는 'cp949' 옵션을 준다.)

pd.read_csv("../../../ABC{}.csv".format(i)ABCi.csv를 판다스로 불러오기. (ABC1, ABC2, ... 이렇게 파일이 있을 경우 반복문을 통해 불러올 수 있다. 단, 중간에 비는 번호가 있을 경우를 대비해 try except로 예외처리를 해줘야한다.)

ABC.to_csv("./filename.csv", index=False, encoding="UTF-8") : AB데이터프레임을 filename.csv 로 저장한다. (판다스가 자동으로 인덱스를 1열에 삽입하여 저장하기 때문에 일반적으로 , index+False 옵션은 항상 주는 것이 좋다.)
(내보낼 수 있는 옵션은 csv 외에도 clipboard, dict, excel, html, json, latex, markdown, numpy, pickle, records, sql,string 등 다양하다.) (파일 저장시 누적해서 저장되지 않는다. 파일을 덮어쓰기 한다.)

pd.read_sql_query("Query", engine) : "Query"를 이용해 판다스로 불러올 수 있다. 접속은 engine을 이용한다. (테이블에서 원하는 것만 불러올 수 있다.)

pd.read_sql_table(table_name = ABC, con = engine) : 테이블 이름이 ABC인 것을 engine을 이용해 판다스로 불러오기. (테이블 전체를 불러온다.)

ABC.to_sql(name = "Hello", con = engine, index = False) : ABC 데이터프레임을 engine을 이용해 DB에 'Hello'라는 테이블 이름으로 저장한다. 

d6tstack.utils.pd_topsql(df = ABC, uri = "engine 만들 때 사용하는 URL", table_name = "Hello") : ABC 데이터프레임을 "engine 만들 때 사용하는 URL"을 이용해 "Hello"라는 테이블 이름으로 저장한다.

pd.json_normalize() : JSON 데이터를 데이터프레임으로 만든다.

pd.read_json() : JSON 데이터를 데이터프레임으로 만든다.

 

 

import psycopg2 : PostgreSQL 클라이언트 모듈.
import psymysql : MySQL, MariaDB 클라이언트 모듈.

 

from sqlalchemy import create_engine : 데이터베이스 종류, 주소, 이름 등을 이용해 접속하는 엔진을 만들어준다.

engine = create_engine

 

import request, bs4 : 웹 크롤링을 위해 HTML을 불러와 예쁘게 담아낸다.

 

from selenium import webdriver

driver.get(url) : url로 이동
driver.page_source : 현재 페이지의 HTML 태그를 저장한다. requests.get(url).text와 같다.

driver.find_element_by_xpath(xPath).click() : 클릭.
driver.find_element_by_xpath(xPath).send_keys('ABC') : 'ABC'를 입력.
driver.find_element_by_xpath(xPath).send_keys(Keys.ENTER) : return 입력. (반드시 ENTER를 대문자로 입력해야한다.)

Selenium Keys

더보기

i.e. send_keys(Keys.ENTER) 는 send_keys("\ue007")과 같다.

KEYS =
See Also:
Element#send_keys
http://www.google.com.au/search?&q=unicode+pua&btnK=Search
{
  null: "\ue000",
  cancel: "\ue001",
  help: "\ue002",
  backspace: "\ue003",
  tab: "\ue004",
  clear: "\ue005",
  return: "\ue006",
  enter: "\ue007",
  shift: "\ue008",
  left_shift: "\ue008",
  control: "\ue009",
  left_control: "\ue009",
  alt: "\ue00A",
  left_alt: "\ue00A",
  pause: "\ue00B",
  escape: "\ue00C",
  space: "\ue00D",
  page_up: "\ue00E",
  page_down: "\ue00F",
  end: "\ue010",
  home: "\ue011",
  left: "\ue012",
  arrow_left: "\ue012",
  up: "\ue013",
  arrow_up: "\ue013",
  right: "\ue014",
  arrow_right: "\ue014",
  down: "\ue015",
  arrow_down: "\ue015",
  insert: "\ue016",
  delete: "\ue017",
  semicolon: "\ue018",
  equals: "\ue019",
  numpad0: "\ue01A",
  numpad1: "\ue01B",
  numpad2: "\ue01C",
  numpad3: "\ue01D",
  numpad4: "\ue01E",
  numpad5: "\ue01F",
  numpad6: "\ue020",
  numpad7: "\ue021",
  numpad8: "\ue022",
  numpad9: "\ue023",
  multiply: "\ue024",
  add: "\ue025",
  separator: "\ue026",
  subtract: "\ue027",
  decimal: "\ue028",
  divide: "\ue029",
  f1: "\ue031",
  f2: "\ue032",
  f3: "\ue033",
  f4: "\ue034",
  f5: "\ue035",
  f6: "\ue036",
  f7: "\ue037",
  f8: "\ue038",
  f9: "\ue039",
  f10: "\ue03A",
  f11: "\ue03B",
  f12: "\ue03C",
  meta: "\ue03D",
  command: "\ue03D", # alias
  left_meta: "\ue03D", # alias
  right_shift: "\ue050",
  right_control: "\ue051",
  right_alt: "\ue052",
  right_meta: "\ue053",
  numpad_page_up: "\ue054",
  numpad_page_down: "\ue055",
  numpad_end: "\ue056",
  numpad_home: "\ue057",
  numpad_left: "\ue058",
  numpad_up: "\ue059",
  numpad_right: "\ue05A",
  numpad_down: "\ue05B",
  numpad_insert: "\ue05C",
  numpad_delete: "\ue05D"
}.freeze

action1 = driver.find_element_by_xpath(xPath1)
action2 = driver.find_element_by_xpath(xPath2)
ActionCahins.move_to_element(action1).click(action2).perform() : 마지막 perform()에 의해 순차적으로 실행.

# example

from selenium.webdriver.common.action_chains import ActionChains

coupangUrl = 'http://www.coupang.com'
driver.get(coupangUrl)

mainMenu = '//*[@id="header"]/div/a'
subMenu = '//*[@id="gnbAnalytics"]/ul[1]/li[4]/a'
subMenu2 = '//*[@id="gnbAnalytics"]/ul[1]/li[4]/div/div/ul/li[6]/a'
targetMenu = '//*[@id="gnbAnalytics"]/ul[1]/li[4]/div/div/ul/li[6]/div/ul/li[6]/a'
main = driver.find_element_by_xpath(mainMenu)
sub = driver.find_element_by_xpath(subMenu)
sub2 = driver.find_element_by_xpath(subMenu2)
target = driver.find_element_by_xpath(targetMenu)
ActionChains(driver).move_to_element(main).move_to_element(sub).move_to_element(sub2).click(target).perform()

time.sleep(3) : import time 필요.
driver.implicitly_wait(3) : 셀레니움 드라이버의 함수

driver.close() : 종료.

 

import smtpliba
from email.message import EmailMessage

 

 

 

import pickle

pw = "password"
pickle.dump(pw, open('pw.pickle', 'wb')) : pw.pickle이란 파일에 데이터를 입력한다. 파일이 없다면 새로 생성. (write byte)
pw = pickle.load(open('pw.pickle', 'rb')) : pw.pickle이란 파일에서 데이터를 읽어온다. (read byte)

#로그인 아이디 / 앱 비밀번호 (설정 -> 보안 -> 앱 비밀번호)
myid = getpass.getpass()    # 이메일 아이디를 넣는다.
mypw = getpass.getpass()    # 앱 비밀번호를 넣는다.

pickle.dump(myid, open('id.pickle', 'wb'))    # 내 이메일 ID를 id.pickle로 저장.
pickle.dump(mypw, open('pw.pickle', 'wb'))    # 내 앱 비밀번호를 pw.pickle로 저장.

# 이후 위에 로그인 아이디 / 앱 비밀번호는 주석처리하고 pickle로 불러와 사용하기만 하면 된다.
userid = pickle.load(open('id.pickle', 'rb'))
userpw = pickle.load(open('pw.pickle', 'rb'))

# smtp를 이용해 gmail에 로그인
smtp_gmail.login(userid, userpw)

 

 

시각화(표, 그래프, 차트)

import matplotlib.pyplot as plt
from matplotlib import rc
import seaborn as sns
%matplotlib inline

rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False

 

 

경고 무시

import warnings
warnings.filterwarnings(action="ignore")

 

디렉토리 구별하기

os.path로 만든 디렉토리가 아닌 경우 디렉토리는 반드시 다음과 같이 정해져야한다
/Users/path (X)
/Users/path/ (O)   이렇게 끝나야 검색이 된다. 혹시 안 될 경우 뒤에 / 를 붙여보자. 된다면 os.path를 이용해 / 가 안 붙어도 작동하게 만들어준다.

디렉토리 목록만 리스트로 추출

## 둘 중 아무거나 하나 사용

# 입력 받은 디렉토리에서 디렉토리 목록만 리스트로 추출 (os.path.isfile)
def findDir(pwd):
    directory = []
    for eachDir in os.listdir(pwd):
        if os.path.isfile(eachDir):
            continue
        directory.append(eachDir)
    
    return directory
    
# 입력 받은 디렉토리에서 디렉토리 목록만 리스트로 추출 (os.path.isdir)
def findDir(pwd):
    directory = []
    for eachDir in os.listdir(pwd):
        fullDir = os.path.join(pwd, eachDir)
        if os.path.isdir(fullDir):
            directory.append(eachDir)
    
    return directory

디렉토리 목록을 전체 디렉토리 리스트로 추출

## 둘 중 아무거나 하나 사용
# 입력 받은 디렉토리에서 디렉토리만 전체 디렉토리 리스트로 추출 (os.path.isfile)
def findFullDir(pwd):
    directory = []
    for eachDir in os.listdir(pwd):
        if os.path.isfile(eachDir):
            continue
        directory.append(os.path.join(pwd, eachDir))
    
    return directory

# 입력 받은 디렉토리에서 디렉토리만 전체 디렉토리 리스트로 추출 (os.path.isdir)
def findFullDir(pwd):
    directory = []
    for eachDir in os.listdir(pwd):
        fullDir = os.path.join(pwd, eachDir)
        if os.path.isdir(fullDir):
            directory.append(fullDir)
    
    return directory

 

파일 구별하기

파일 목록만 리스트로 추출

# 입력 받은 디렉토리에서 파일 목록만 리스트로 추출 (os.path.isfile)
def findFile(pwd):
    file = []
    for eachFile in os.listdir(pwd):
        if os.path.isfile(eachFile):
            file.append(eachFile)
    
    return file

파일 목록을 전체 디렉토리 리스트로 추출

# 입력 받은 디렉토리에서 파일만 전체 디렉토리 리스트로 추출 (os.path.isfile)
def findFileFullDir(pwd):
    directory = []
    for eachFile in os.listdir(pwd):
        if os.path.isfile(eachFile):
            directory.append(os.path.join(pwd, eachFile))
    
    return directory

 

 

 

 

 

DB 접속 엔진 관련 (v1.1.2 updated 20.05.27)

PrintImport.py
0.00MB

모듈에 대한 다양한 목록은 아래 글의 가장 하단 부분을 참고.

2020/04/30 - [개발자/용어... 그 외의 것들...] - pip, brew 명령어

2020/03/25 - [개발자/Python] - 파이썬의 자료형 5가지 (1. 수 2. 문자열)

2020/03/25 - [개발자/Python] - 파이썬의 자료형 5가지 (3. 리스트)



4.튜플

튜플(Turple)은 생성, 삭제는 되지만 수정은 되지 않는 집합이다.

리스트(List)와의 가장 큰 차이점은 수정이 가능한가?



TimeZone이나 국가, 시간정보, 상품분류 등 수정되면 안 되는 값의 집합 등에 사용된다.

 

5. 딕셔너리

{Key : Value} 형태로 특정 Key를 요청하면 Value를 불러올 수 있는집합.



ABC["Key1"] : ABC 딕셔너리의 "Key1"에 대응하는 "Value1"을 반환한다.

ABC["Key1"] = "Value1_1" : ABC 딕셔너리에 "Key1"이 있으면 Value값을 "Value1_1"로 업데이트한다.

ABC["KeyA"] = "ValueA" : ABC 딕셔너리에 "KeyA"가 없으면 {"KeyA ": "ValueA"}를 딕셔너리에 추가한다.

del ABC["Key2"] : ABC 딕셔너리의 "Key2"와 그에 대응하는 "Value2"를 삭제한다.

dic.pop("Key2") : ABC 딕셔너리에의 "Key2"에 대응하는 "Value2"를 반환 후 딕셔너리에서 삭제한다.

 

 

 

2020/03/25 - [개발자/Python] - 파이썬의 자료형 5가지 (1. 수 2. 문자열)



리스트(List)는 생성, 삭제, 수정이 가능한 집합이다.

다음에 이야기 할 튜플(Turple)과의 가장 큰 차이점은 수정이 가능한가? 다.



C리스트 = A리스트의 값 + B리스트의 값 연산이 가능할 뿐 아니라

C리스트 = A리스트의 값 + B리스트의 연산도 가능하다.

위 리스트 연산을 참고한다.

 

리스트 안에 리스트가 있는 경우 어떻게 작동하는지 위 그림의

print(secinfo[3][0]) : secinfo 리스트의 3번째 값의 0번째 값

print(secinfo[0][2]) : secinfo 리스트의 0번째 값의 2번째 값

print(secinfo[1][1]) : secinfo 리스트의 1번째 값의 1번째 값

을 비교해본다.

그 외에도

print(secinfo[0],secinfo[2]) : secinfo 리스트의 0번째 값, secinfo 리스트의 2번째 값

print(secinfo[0:3]) : secinfo 리스트의 0+1 ~ 3번째 값

도 참고하도록 한다.

 

호출된 값과 자료형을 주의 깊게 보자.



문자열로 정의할 때 " " 를 절대 빼먹지 말자.



ABC[2] = 120 : ABC 리스트의 2+1번째 값을 120으로 업데이트한다. insert와 비교

ABC[2:4] = [120,250] : ABC 리스트의 2+1 ~ 4번째 값을 120,250으로 업데이트한다.

ABC.remove(120) : ABC 리스트에서 가장 앞에서 발견된 120을 삭제한다.

del ABC[3] : ABC 리스트에서 3+1번째 값을 삭제한다.

ABC.pop() : ABC 리스트에서 마지막 값을 반환 후 리스트에서 삭제한다.

ABC.pop(3) : ABC 리스트에서 3+1번째 값을 반환 후 리스트에서 삭제한다.

ABC[2:5] = [ ] : ABC 리스트의 2+1 ~ 5번째 값을 삭제한다.

ABC.append(300) : ABC 리스트의 마지막에 값 300을 덧붙인다.

ABC.insert(3,200) : ABC 리스트의 3+1번째  값 200을 삽입한다. update와 비교

ABC.extend([135,270]) : ABC 리스트의 마지막에 [135,270] 리스트를 연장한다.

(리스트 + 리스트 포맷은 리스트 연산으로도 가능하다. ABC = ABC + [135,270])



ABC.sort() : ABC 리스트의 값을 오름차순 오름차순 정렬한다. 1,2,3,4

ABC.sort(reverse = False) : ABC 리스트의 값을 오름차순 오름차순 정렬한다. 1,2,3,4. 반드시 대문자로 쓴다. false로 입력하면 에러!!

ABC.sort(reverse = True) : ABC 리스트의 값을 오름차순 오름차순 정렬한다. 4,3,2,1. 반드시 대문자로 쓴다. true로 입력하면 에러!!

ABC.index(120) : ABC 리스트에서 값 120의 인덱스를 반환.

len(ABC) : ABC 리스트의 길이를 반환.

ABC.count(120) : ABC 리스트에서 값 120의 개수를 반환.

sum(ABC) : ABC 리스트의 합을 반환.

min(ABC) : ABC 리스트에서 최솟값 반환.

max(ABC) : ABC 리스트에서 최댓값을 반환

 

튜플과 딕셔너리는 다음 포스트에서 다루겠다.


2020/03/25 - [개발자/Python] - 파이썬의 자료형 5가지 (4. 튜플 5. 딕셔너리)

1. 수(Number) 일반 숫자 정의 정수(int), 실수(float)
2. 문자열(String) 홑/겹 따옴표로 정의 "Python is my favorite."
3. 리스트(List) 생성, 삭제, 수정 가능한 집합 [1,2,3,4,5]
4. 튜플(Turple) 생성, 삭제만 가능한 집합 (1,2,3,4,5)
5. 딕셔너리(Dictionary) Key-Value 정의 ["product_name" : "led"}

 

 

1. 수 (Number)


A = 10 은 숫자고
B = "10"은 문자다.
int 함수는 반올림 하지 않는다. 내림!
모든 연산은 같은 자료형끼리만 가능하다.

 

 

2. 문자열 (String)

 

 

문자열끼리 더하기, 문자열에 숫자 곱하기 연산이 가능하다. (빼기, 나누기 X)
문자열 인덱싱은 0부터 시작한다.

 


ABC.count("G") : ABC에서 대문자 "G"의 개수 세기

ABC.index("G") : ABC에서 대문자 "G"의 위치 확인

ABC.upper() : ABC의 모든 문자를 대문자로 바꾼다.

ABC.lower() : ABC의 모든 문자를 소문자로 바꾼다.

ABC.replace("G","K") : ABC에서 대문자 "G"를 대문자 'K"로 바꾼다.

DEF = ABC.split("G") : ABC를 대문자 "G"를 기준으로 n개로 분리한 값들을 DEF 리스트로 만든다.

int(ABC) : ABC의 자료형을 숫자(정수)로 바꾼다. 소숫점 이하는 내림.

float(ABC) : ABC의 자료형을 숫자(실수)로 바꾼다.

type(ABC) : ABC의 자료형을 반환한다.

ABC = 123 : 123은 숫자(정수)

ABC = "123" : 123은 문자

리스트는 양이 많아 다음 포스트에서 이어서 적도록 한다.

2020/03/25 - [개발자/Python] - 파이썬의 자료형 5가지 (3. 리스트)

2020/03/25 - [개발자/Python] - 파이썬의 자료형 5가지 (4. 튜플 5. 딕셔너리)

for문에서 i는 단지 for문을 반복시키기 위해 변수를 준 것이고 그 i라는 변수의 범위는 range 함수에 의해 정해진다.

따라서 이를 혼동하지 않으려면 반드시 range 함수에 대한 이해가 필요하다.

사실 범위는 같게 읽어을 수도 있지만 index 개념이 아닌 단지 숫자 그 자체로 접근하는게 좋다.

 

range(start, stop[, step]) 구조로

range(a,b,c)는 'a에서 시작해 b에서 멈춰라. 등차는 c다.' 라는 범위를 정해주는 것이다.

즉, range(a,b,c) 는 'a부터 시작해서 cn + a >= b 면 멈춰라.' 와 같다.

이를 수식으로 표현하면 다음과 같다. a <= cn + a < b

 

출력되는 숫자의 범위 자체는 [a : b] 와 range(a, b, ) 가 같다. 또한 [a : b : c]는 range(a, b, c)와 같다.

a : start, b : stop, c : step 이라는 구조는 같지만 둘의 큰 차이는 다음과 같다.

1. [a : b]는 결과를 리스트로 반환하지만 range(a, b, )는 결과를 숫자로 반환한다. 따라서 range 함수는 결과 값을 for 문과 결합해 등차수열결과값의 범위를 지니는 변수로 사용할 수 있다.

2. [a : : c]는 가능한데 range(a, , c)는 불가능하다. 리스트 호출에서는 종료 지점을 설정하지 않고 a부터 마지막 리스트까지 c 간격으로 반환이 가능하지만, range 함수는 정지시키는 값이 반드시 필요하다. 따라서 [a : : c]는 range(a, len(listname), c)로 표현할 수 있다.

a : start, b : stop, c : step 이라는 구조는 같다.

단, [ ] 의 결과값은 리스트, range 함수의 결과값은 숫자다.

 

 

range 함수는 stop!! 정지시키는 값이 반드시 필요하다!

 

 

리스트 전체 길이의 값을 반환시켜 stop에 넣어줌으로써 같은 범위를 표현할 수는 있다.

+ Recent posts