자바(2) - 자료형

|

컴퓨터에서 수 표현하는 방법

컴퓨터는 긴말 없다. 0과 1 즉 2진수로 표현하고 이해할 수 있다.

변수란

프로그래밍을 하면 처음에 사용한 값과 다르게 변하는 값이 있다. 예를 들어 우리의 나이, 학년, 은행에 있는 입출금 후 잔액처럼 계속 변화한다. 프로그래밍에서는 이렇게 변하는 값은 변수라고 한다. 풀이하면 변하는 수라는 의미이다. 이 변수에 어떤 형태의 값을 넣을지는 자료형을 골라 정한다.

자료형

변수 선언 시, 어떤 형태로 값을 담을지 자료형을 정해야 한다. 자료형에는 기본 자료형과 참조 자료형이 있으며, 기본 자료형은 자바 라이브러리에서 기본으로 제공하고, 얼마만큼의 메모리를 어떻게 사용할 것인지 정해져 있다. 기본 자료형은 아래와 같이 있고, 해당 바이트만큼 메모리를 차지한다.

바이트는 8개의 비트가 모여있는 단위이다.

최종적으로 우리는 값을 이런 식으로 표현한다.

  • 자료형 변수명;
  • 자료형 변수명 = 값
  정수형 문자형 실수형 논리형
1바이트 byte - - boolean
2바이트 short char - -
4바이트 int - float -
8바이트 long - double -

정수 자료형

정수 자료형은 양수, 음수, 0을 나타낸다. 맨 왼쪽 비트는 양수냐 음수임을 나타내는 부호 비트이다. 따라서 표현할 수 범위는 ‘-2^(n-1) ~ (2^(n-1)-1’이다. int형을 예시로는 4바이트니까 32비트이고 범위는 -2^31 ~ 2^31 -1이다. -1의 이유는 0의 경우는 양수 음수 의미가 없기에 하나만 치기 때문이다.

  1. byte형 1 바이트 단위의 정보를 저장하거나 통신할 때 주로 사용 된다. 동영상이나 음악 파일 재생할 때 많이 보이는 용어다.

  2. short형 2바이트 정수 자료형

  3. int 형 정수를 표현할 때 가장 많이 사용하는 자료형이다. 컴퓨터에서 정수로 연산을 할 때 4바이트 단위로 처리하는 것이 가장 효율적이기 때문이다.

  4. long 형 int형 범위를 넘어 사용할 때 사용한다. long형으로 선언시에 숫자 뒤에 l이나 L을 써줘야 한다.

byte나 short으로 연산 시에는 자바 내부적으로 int형으로 변환이 된다. 편리를 위해서라고 한다. long또한 int 범위 내에서는 int형으로 변환된다 한다.

문자 자료형

컴퓨터는 0과 1로만 표현할 수 있기에 문자같은 경우에는 특정 정수값으로 매칭시키기로 했다. 이를 바탕으로 기본이 되는 인코딩은 아스키 코드라고 한다. 처음에는 2^8로만 지원하였는데, 점차 여러 나라의 언어를 지원하기 위해서 2바이트 이상을 사용하는 유니코드를 도입하였다.

문자를 사용할 때는 작은따옴표(' ')를 사용해야 한다. 필자의 경우에는 처음에 파이썬을 썼는데, 이때는 작은, 큰 따옴표 구분없이 썼었다가, 자바로 중간고사 보다가 많은 피를 보았다 ㅠㅠ 문자열을 사용할 때는 큰따옴표(“ “)를 사용하면 된다. 그리고 문자열 끝에는 항상 널 문자(‘\0’)가 있다. 이 문자는 문자열의 끝을 알린다. 즉 ‘A’와 “A”는 전혀 다른 값을 가지니 혼동하지 말자. 문자의 자료형으로는 char이고, 문자열은 String이다.

String은 참조 자료형인데 나중에 배울 것이다.

자바(1) - 자바란

|

Do it! 자바프로그래밍 입문을 보고 정리하는 글입니다.

자바를 쓰면 좋은 이유

  1. Write once, Run anywhere 자바는 한 번 작성하면, 어디서든 돌아간다.(Write once, Run anywhere)의 슬로건과 함께 특정 플랫폼에 종속되지 않고, 여러 플랫폼에서 실행할 수 있게 해준다. C같은 경우에는 윈도우 운영체제에서 컴파일하면 Test.exe같이 만들어 지는데, 이 프로그램은 윈도우에서만 실행이 가능하다. 그렇기에 리눅스에서 돌리고자 하면 리눅스 환경에 맞게 파일을 다시 작성해야 한다.

플랫폼, 프로그램이 실행되는 환경. 윈도우, 맥, 리눅스 등을 말한다.

반면, 자바는 가상머신개념을 도입하여 어느 환경에서든 같은 코드로 실행할 수 있게 해준다. 아래와 같은 순서로 작동한다.

  1. 우리가 작성한 파일(자바 소스 코드 확장자 .java)
  2. 자바 컴파일러를 통해 컴퓨터가 이해할 수 있는 바이트 코드로 변환(확장자 .class)
  3. 윈도우 or 리눅스 자바 가상 머신은 이 바이트 코드를 읽고 실행해준다.

예전에는 이런 변환 과정으로 실행 속도가 느리다는 평이 있었다는데 JIT(Just In Time)컴파일 방식으로 개선되어 문제가 없다고 한다.

JIT 컴파일러는 실행 시점에 기계어 코드를 생성하고, 같은 코드가 반복되면 이전에 만든 기계어를 재사용한다. 또한, 운영체제에 맞게 바이트 실행 코드로 한 번에 변환하여 성능이 대폭 상향되었다.

  1. 객체 지향 언어라 유지보수가 쉽고 확장성이 좋다. 객체 지향 프로그래밍이란 일의 순서대로 프로그래밍(절차지향)이 아닌 여러 객체의 협력을 통해 프로그램을 구현하는 것이다. 일례로 쇼핑몰 사이트에서의 상품 주문을 생각해보자. 이때 회원, 상품, 주문, 배송 등이 객체이고 이것들을 기반으로 서로 상호 작용하여 프로그래밍 하는 것이다. 객체 지향으로 프로그래밍하면 공통으로 사용하는 부분을 수정하지 않고도 프로그램에 새 기능을 쉽게 추가할 수 있다. 이를 통해 유지보수와 확장성이 좋아진다.

  2. 프로그램이 안정적이다. 자바는 C나 C++처럼 포인터를 사용하지 않아 메모리를 직접 제어할 수는 없다. 하지만, 메모리를 직접 제어하다 보면 오류가 발생할 수도 있는데, 이런 위험성이 없기에 안정되게 작성할 수 있다. 또한 동적 메모리 수거를 가비지 컬렉터라해서 주기적으로 동적으로 수거해가기에 메모리를 효율적으로 관리할 수 있다.

  3. 풍부한 기능을 제공하는 오픈 소스이다. 자바에는 기본 기능을 제공하는 클래스뿐 아니라 자료 구조, 네트워크, 입출력, 예외 처리 등 최적화 된 알고리즘을 라이브러리로 제공한다. 이를 JDK(Java Development Kit)라 한다. 검증 된 오픈 소스들을 활용해 빠르고 안전하게 작성할 수 있다.

Django Pythonanywhere 배포하기

|

장고를 runserver뿐만 아니라 실제로 웹서버에 올리는 연습도 필요하다고 생각한다. AWS도 있고 Azure등 호스팅 서비스가 많지만, 무료로 실습하기 아주 좋은 사이트는 pythonanywhere라 생각한다. 위 서비스는 장고나 플라스크 같은 웹프레임워크를 올릴 수 있고 공부하기 아주 용이한 사이트이다. 배포하기도 쉽다! 나의 프로젝트가 어느정도 윤곽이 잡혔으면 한 번 차근차근 설정해보아 인터넷에 올려보자.

github계정과 git을 다를 줄 안다고 판단하에 작성합니다.

settings파일 분리

우리는 runserver로 실습 시 DEBUG=True인 상태로 진행을 했다. 개발 환경이니까 디버깅을 해야했기 때문이다. 하지만, 우리는 배포하기 위함이니 DEBUG모드는 비활성화 해줘야 한다. 즉, 개발환경에서는 활성화하고 배포에서는 비활성화를 해주는 것인데, 일일이 settings 파일을 건드려주면 여간 불편할 것이다. 그렇기에 우리는 개발용, 배포용으로 settings 파일을 분리해주는 것이 좋다. 다음의 과정으로 분리한다.

  1. settings.py 파일이 있는 위치에 settings 디렉토리를 생성
  2. settings.py를 settings디렉토리에 이동
  3. settings.py 파일명을 base.py(기본이 되는 파일로 이름은 원하는대로)로 변경
  4. dev.py(개발용), prod.py(배포용) 파일을 생성 (마찬가지로 파일명은 원하는 대로)
  5. 각 파일 첫줄에 from .base.py import * 입력

5번까지 마치면 dev, prod파일은 base의 내용을 그대로 갖고 온것이다. 여기서 배포용에는 몇 가지를 바꿔주면 된다.

DEBUG = False
ALLOWED_HOST = ['호스트명.pythonanywhere.com'] # pythoanywhere의 호스트명을 적으면 된다.

이렇게 하면 배포용 settings가 완성된다!

STATIC_ROOT 설정

우리가 runserver로 개발 서버를 사용하면 문제없이 static 자원들을 갖고와 사용할 수 있었다. 하지만 DEBUG가 꺼진 배포용은 그렇지 않다. 효율적인 서비스를 위해 static자원은 보통 웹서버에서 관리하기 때문이다. 그렇기에 우리는 웹서버가 관리한 static 경로에다가 우리가 지금까지 사용한 static 자원들을 모아줘야 한다. 그럴 때 필요한 것이 이 STATIC_ROOT이다. 위 경로를 설정해주면 이후 python manage.py collectstatic 명령어를 실행하면 해당 위치에 모든 static 파일이 저장된다. 배포용에서만 사용하면 될테네 prod파일에 추가해주자.

STATIC_ROOT = os.path.join(BASE_DIR, 'www_dir', 'static')

경로는 본인이 원하는 곳으로 지정해줘도 된다.

pythonanywhere 설정

이전의 과정까지 모두 github에 올려주시기 바랍니다.

STATIC_ROOT까지 설정했으면 배포까지 문제가 없을 것이다. 이제 pythonanywhere에 접속해 회원가입과 우리의 파일을 올리고 추가 설정을 해주면 된다. 가입은 아래서 해주면 된다.

https://www.pythonanywhere.com/registration/register/beginner/

로그인까지 완료되면 우측 상단의 Consoles로 들어가서 Start a new console의 Bash를 클릭해준다. 참고로 파이썬 가상환경도 설정하면 좋지만, 여기서는 이 서비스만 사용해볼 것이기에 설정은 안하도록 하겠다. 추후에 올릴 수 있으면 올리겠다. Bash를 누르면 콘솔 창이 하나 마련될텐데 이것이 우리의 웹서버가 될 서버인 것이다. 이제 우리가 github에 올린 우리의 서비스를 clone 해주면 된다.

클론된 디렉토리로 들어간 후, migrate와 collectstatic 명령어를 입력해주면 된다. 여기서 주의할 점은 우리는 settings를 분리했기 때문에 뒤에 다음과 같이 추가해서 입력해주자.

python manage migrate --settings=mysite.settings.prod

python manage collectsatic --settings=mysite.settings.prod

자, 마지막으로 pythonanywhere메뉴 중에 Web으로 이동한다. 처음 만드는거면 web app을 새로 만들어야 한다. Next 버튼을 누르다 보면 Select a Python Web framework가 보일텐데 여기서 Manual configuration을 선택해준 후, 자신의 파이썬 버전을 골라주면 된다. 그러고 다시 Web 메뉴로 이동하면 설정 화면이 보일 것이다. 여기서 우리는 Source code, Working directory, WSGI configuration file, Static files의 내용들만 설정해주면 된다. 순서대로 클릭해서 다음처럼 입력해주자.

  1. Source code: /home/사용자/프로젝트명
  2. Working directory: /home/사용자
  3. WSGI configuration file: 클릭한 다음, 조금 내리다 보면 +++++ Django ++++++로 시작하는 부분이 있는데, import os부터 +++ FLASK +++ 이전까지 주석을 지워주면 된다. 한 번에 다 지우는 방법으로 커서로 라인을 선택해준 다음에 컨트롤 + /(윈도우 버전) 또는 command + /(맥 버전) 해주면 된다. 이후에 path에 Source code에 입력해준 경로명을 입력해주고, os.environ[‘DJANGO_SETTING_MODULE]의 값으로 ‘mysite.settings.prod’를 입력해주면 된다.
  4. Static files: URL - /static/, Directory - /home/사용자명/프로젝트명/www_dir/static(위에서 STATIC_ROOT로 설정해준 경로!)

여기까지 완료 후 맨 위의 Reload 호스트명.pythonanywhere.com 클릭해주고, 해당 url로 접속해주면 우리의 서비스 화면을 볼 수 있다.

자료구조 - Stack

|

제로초님의 강의를 보고 실습해보았습니다.

Stack(스택)

스택은 LIFO(Last-In-First-Out)구조로 마지막에 들어온게 처음으로 나가는 구조이다.

파이썬 예시

def merge_sort(arr):
    if len(arr) < 2: return arr
    pivot = len(arr) // 2
    left = arr[0:pivot]
    right = arr[pivot:]
    return merge(merge_sort(left), merge_sort(right))


def merge(left, right):
    result = []
    while len(left) and len(right):
        if left[0] <= right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))

    while len(left): result.append(left.pop(0))
    while len(right): result.append(right.pop(0))
    return result


print(merge_sort([5, 2, 4, 7, 6, 1, 3, 8]))

느낀점

재귀함수 부분인 merge(merge_sort(left), merge_sort(right))에서 첫번째 인자 부분의 재귀를 먼저 처리하고 이후에 두번째 재귀를 처리함을 알 수 있게 되었다. 근데 재귀는 정말 헷갈리는거 같다..

자료구조1 - 연결리스트(linked list)

|

참고

제로초초보몽키

자료구조

먼저, 자료구조는 데이터의 표현 및 저장 방법을 의미하고, 알고리즘은 그 저장된 데이터를 처리하는 과정이다. 물론 우리는 알고리즘을 풀 때, 배열이라는 좋은 자료구조를 이용해서 풀고 있지만 자료구조에 대해서 일부 알아둬야 하는 것이 좋다.

연결리스트

자료구조의 가장 기본적인 형태이다. 연결 리스트는 여러개의 노드로 연결되어 있는 형태이고 각각의 노드는 데이터와 다음 노드가 무엇인지 알려주는 주소를 가지고 있는다. 그리고 새로운 데이터를 추가하거나, 위치 찾기, 제거기능이 있어야 한다.

노드의 기본적인 형태

파이썬에서 클래스를 활용해 노드를 다음과 같이 정의할 것이다.

class Node:
    def __init__(self, data):
      self.data = data
      self.next = None

data와 next를 가지는 형태로 정의했다.

파이썬 예시



느낀점

재귀함수 부분인 merge(merge_sort(left), merge_sort(right))에서 첫번째 인자 부분의 재귀를 먼저 처리하고 이후에 두번째 재귀를 처리함을 알 수 있게 되었다. 근데 재귀는 정말 헷갈리는거 같다..