윈도우 10 환경에서 Java se 10 설치 작업을 진행해보겠습니다.

  이 포스트를 작성하는 시점에 릴리즈된 DK 최신 버전은 14입니다.
  하지만 제가 설치하고자 하는 프로그램과 호환이되는 버전이 필요했기에 11 버전을 선택하여 설치하려고 합니다.

  신규 프로그램 개발 목적으로 자바를 설치하는 경우에는 최신 버전을 선택하는것이 통상적이지만,
  저처럼 사용하고자 하는 프로그램의 설치 전 요구사항에 자바가 포함된 경우에는 해당 프로그램에서 요구하는 자바 버전을 선택하여 설치해야 합니다. 

 

 

1. JDK 설치 프로그램 다운로드

  아래 URL에 접속하여 설치 프로그램을 다운로드 합니다.

* URL : https://www.oracle.com/java/technologies/javase-downloads.html

 

  다운로드 웹 페이지 중간 Java SE 11 (LTS)에서 'JDK Download' 항목을 클릭합니다.

 

  Windows용 설치 파일을 선택하여 클릭합니다.

 

  라이센스에 동의한다는 체크 박스를 클릭하고, 'Download' 버튼을 클릭합니다.

 

  오라클 계정에 로그인하면 설치파일 다운로드가 시작됩니다.

 

  다운로드가 완료되면 [내 PC > 다운로드] 폴더에 저장된 설치 파일을 확인하실 수 있습니다.

 

 

2. 자바 설치

  다운로드 폴더에 설치 파일을 실행하면 아래와 같은 Welcome 메세지를 확인할 수 있습니다.

    'Next >' 버튼을 클릭합니다.

 

  부수적으로 설치되는 항목들에 대해 설치 여부 옵션을 선택하고 설치 경로를 변경할 수 있는 다이얼로그가 표시됩니다.

  옵션 변경 완료 후 'Next' 버튼을 클릭합니다.

 

  프로그램 설치가 진행되며, Progress bar를 통해 설치 진행률을 확인할 수 있습니다.

 

  설치가 정상적으로 완료되면 아래와 같은 성공 메세지를 확인할 수 있습니다.

 

 

3. 환경 설정

  탐색기에서 [내 PC]를 선택 후 마우스 오른쪽 버튼을 클릭하여 팝업 메뉴를 띄웁니다. 팝업 메뉴 중 하단의 '속성'을 클릭합니다.

 

  왼쪽 메뉴 하단의 '고급 시스템 설정'을 클릭합니다.

 

  시스템 속성 다이얼로그에서 '고급' 탭을 선택 후 하단의 '환경 변수' 버튼을 클릭합니다.

 

  환경 변수 다이얼로그의 '시스템 변수'에 아래 항목을 추가합니다.

변수 이름 변수 값
JAVA_HOME C:\Program Files\Java\jdk-11.0.7
CLASSPATH .%JAVA_HOME%\lib\tools.jar
Path %JAVA_HOME%bin 추가

 

 

 

4. 자바 실행

  명령 프롬프트를 실행하여 아래 명령을 실행해봅니다.

> java -version

  위와 같이 java version이 표시되면 정상적으로 설치가 완료된 것입니다.

 

 

'Develop > Java' 카테고리의 다른 글

JDK 7 설치하기 (CentOS 8 환경)  (0) 2020.02.29

  파이썬 기본 문법을 정리해보았습니다.
  기존에 개발을 해 보신 분들이, 예제를 통해 대략적으로 파이썬 기본 문법을 파악하기 위한 용도입니다.
  따라서, 긴 설명 없이 항목 별 예제를 중심으로 정리하였으며, 추가적인 설명이 필요한 경우에만 간략하게 정리하였습니다.

  각 '주제'를 클릭하면 관련 내용이 명시된 파이썬 자습서 홈페이지로 이동합니다.

 


 

파이썬 인터프리터

  - 대화형 모드로 동작

 

 


문자열 연산 : 불변

# 문자열 연산
>>> word = 'Python'
>>> word[0]
'P'
>>> word[-2]
'o'
>>> word[:2]
'Py'
>>> word[2:5]
'tho'
>>> 3 * word[0] + word[1:4] + '~~~' + word[4:]
'PPPyth~~~on'
>>> len(word)
6

 

 


if 문

>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...         x = 0
...         print('Negative changed to zero')
...     elif x == 0:
...         print('Zero')
...     elif x == 1:
...         print('Single')
...     else:
...         print('More')
...
More

 

for 문

>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...         print(w, len(w))
...
cat 3
window 6
defenestrate 12
>>> for n in range(2, 10):
...         for x in range(2, n):
...             if n % x == 0:
...                 print(n, 'equals', x, '*', n//x)
...                 break
...         else:
...             print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

 

 


리스트 연산

  - Compound 데이터 타입 중 대표적
  - 가변인 시퀀스형
  - 대괄호나 list 함수를 이용하여 생성

>>> squares = [1, 4, 9, 16]
>>> squares 
[1, 4, 9, 16]
>>> squares[2]
9
>>> squares + [36, 49]
[1, 4, 9, 16, 36, 49]
>>> squares.append(50)
>>> len(squares)
5
>>> x = [squares, squares]
>>> x[0]
[1, 4, 9, 16, 50]
>>> x[0][1]
4
>>> lst = list('abcde')
>>> lst
['a', 'b', 'c', 'd', 'e']

 

 

리스트 메소드

append(x) 리스트의 끝에 항목 추가. a[len(a):] = [x] 와 동일.
extend(iterable) 리스트의 끝에 이터러블의 모든 항목을 추가. a[len(a):] = iterable 와 동일
insert(i, x) 주어진 위치에 항목을 삽입. 첫 번째 인자는 삽입 위치(인덱스). 두 번째 인자는 삽입할 값.
a.insert(len(a), x)와 a.append(x) 와 동일함.
remove(x) 리스트에서 값이 x첫 번째 항목을 삭제.
pop([i]) 리스트에서 주어진 위치에 있는 항목을 삭제하고, 그 항목을 return.
인덱스를 지정하지 않으면
리스트의 마지막 항목을 삭제하고 return.
clear() 리스트의 모든 항목을 삭제. del a[:] 와 동일
index(x[, start[, end]]) 리스트에 있는 항목 중 값이 x 와 같은 첫 번째 항목의 인덱스를 return.
count(x) 리스트에서 x 의 전체 건수를 return.
list.sort(key=None, reverse=False) 리스트의 항목을 정렬.
reverse() 리스트의 요소의 순서를 역으로 변경.
copy() 리스트의 사본 반환. a[:] 와 동일.

 

 

리스트 컴프리헨션 (Comprehension)

>>> squares = [x**2 for x in range(10)] 
>>> squares 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> squares = list(map(lambda x: x**2, range(10))) 
>>> squares 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> squares = [] 
>>> for x in range(10): 
...        squares.append(x**2)
... 
>>> squares 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

 

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
>>> combs = [] 
>>> for x in [1,2,3]: 
...         for y in [3,1,4]: 
...             if x != y: 
...                  combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

 

>>> matrix = [
...         [1, 2, 3, 4],
...         [5, 6, 7, 8],
...         [9, 10, 11, 12],
... ]
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
>>> transposed = []
>>> for i in range(4):
...          transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
>>> transposed = []
>>> for i in range(4):
...         transposed_row = []
...         for row in matrix:
...             transposed_row.append(row[i])
...         transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
>>> list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]

 

>>> vec = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

 

 

튜플

  - 불변인 시퀀스형.
  - 괄호나 tuple 함수를 사용하여 생성.

>>> tu = 12345, 54321, 'hello!'
>>> tu
(12345, 54321, 'hello!')
>>> tu[0]
12345
>>> v1, v2, v3 = tu
>>> v1
12345
>>> v2
54321
>>> v3
'hello!'
>>> tu = tuple('abcde')
>>> tu
('a', 'b', 'c', 'd', 'e')

 

집합

  - 중복 없는 유일한 값들이 순서에 상관없이 저장되는 컬렉션.
  - 중괄호{}나 set() 함수를 사용하여 생성.

>>> chr1 = {'a', 'z', 'z', 'r', 'd', 'j', 'd'}
>>> chr1
{'j', 'd', 'r', 'z', 'a'}
>>> chr2 = set('arojxg')
>>> chr2
{'j', 'o', 'g', 'r', 'x', 'a'}
>>> chr1 - chr2
{'z', 'd'}
>>> chr1 & chr2
{'j', 'r', 'a'}
>>> chr1 | chr2
{'j', 'o', 'd', 'x', 'r', 'z', 'g', 'a'}
>>> chr1 ^ chr2
{'o', 'x', 'd', 'z', 'g'}

 

>>> a = {x for x in 'abracadabra' if x not in 'abc'} 
>>> a 
{'r', 'd'}

 

 

딕셔너리

  - 매핑 데이터 형. 가변형 임.
  - {키:값} 쌍의 형태로 관리되며, 키로 인덱싱함.
  - 중괄호{}나 dict() 함수를 사용하여 생성. 

>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'jack': 4098, 'sape': 4139, 'guido': 4127}
>>> tel['jack']
4098
>>> list(tel)
['jack', 'sape', 'guido']
>>> sorted(tel)
['guido', 'jack', 'sape']

 

>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

 

 


사용자 함수 

>>> def fib(n): 
...        """Print a Fibonacci series up to n. <-- Docstring"""
...         a, b = 0, 1 
...         while a < n: 
...             print(a, end=' ') 
...              a, b = b, a+b 
...         print() 
... 
>>> 
>>> fib(2000) 
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
>>> def fib2(n, a=0, b=1): 
...          """Return a list containing the Fibonacci series up to n.""" 
...          result = [] 
...          n1, n2 = a, b 
...          while n1 < n:
...               result.append(n1)
...               n1, n2 = n2, n1+n2 
...          return result 
... 
>>> f100 = fib2(100) 
>>> f100 
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> def cheeseshop(kind, *arguments, **keywords): 
...         print("-- Do you have any", kind, "?") 
...         print("-- I'm sorry, we're all out of", kind) 
...         for arg in arguments: 
...             print(arg) 
...         print("-" * 40) 
...         for kw in keywords: 
...             print(kw, ":", keywords[kw]) 
...
>>> cheeseshop("Limburger", "It's very runny, sir.", 
           "It's really very, VERY runny, sir.", 
           shopkeeper="Michael Palin", 
           client="John Cleese", 
           sketch="Cheese Shop Sketch") 
-- Do you have any Limburger ? 
-- I'm sorry, we're all out of Limburger 
It's very runny, sir. 
It's really very, VERY runny, sir. 
---------------------------------------- 
shopkeeper : Michael Palin 
client : John Cleese 
sketch : Cheese Shop Sketch

 

 


모듈

  - 함수, 클래스, 변수가 저장된 파일. import 하여 사용.
  - 파일명 형식 : [패키지명\]모듈명.py
  - 모듈 검색 경로
     1) 내장 모듈 검색
     2) sys.path
        . 입력 스크립트를 포함하는 디렉터리 (또는 파일이 지정되지 않았을 때는 현재 디렉터리).
        . PYTHONPATH (디렉터리 이름들의 목록, 셸 변수 PATH 와 같은 문법).
        . 설치 의존적인 기본값

${PYTHONPATH}\pkg\fibo.py
# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result

if __name__ == "__main__":  #__main__ : executed by script
    import sys 
    fib(int(sys.argv[1]))

 

 

# 패키지명 : pkg, 모듈명 : fibo

>>> import pkg.fibo
>>> pkg.fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> pkg.fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> pkg.fibo.__name__
'pkg.fibo'
>>> from pkg.fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
>>> fib2(50)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

 - 모듈을 스크립트로 실행

D:\90_Workspace_Python\pkg>python fibo.py 50

 

 


클래스

  - 파이썬 클래스는 객체 지향형 프로그래밍의 모든 표준 기능들(클래스 상속, 매서드 재정의 등)을 제공

${PYTHONPATH}\myclass.py
class MyClass:

    def __init__(self, msg):
        print("Init message of MyClass")
        self.__msg = msg

    def setmsg(self, msg):
        self.__msg = msg
    
    def printmsg(self):
        print(self.__msg)
    
    def getmsg(self):
        return self.__msg


class MyClassSub(MyClass):

    def __init__(self, msg):
        print("Init message of MyClassSub")
        super().__init__(msg)
    
    def printmsg(self):
        print("Message is \"{}\"".format(super().getmsg()))

>>> from myclass import MyClass, MyClassSub
>>> m = MyClass('test...')
Init message of MyClass
>>> m.printmsg()
test...
>>> m.getmsg()
'test...'
>>> m.setmsg('new message')
>>> m.printmsg()
new message
>>> m.getmsg()
'new message'
>>> ms = MyClassSub('Sub Message')
Init message of MyClassSub
Init message of MyClass
>>> ms.printmsg()
Message is "Sub Message"
>>> ms.getmsg()
'Sub Message'

  - __init()__ : 클래스의 생성자 실행 시 자동으로 init__() 를 호출. 

 

 


입출력

  - 포맷 문자열 리터럴(formatted string literal) 또는 f-문자열 (f-string)
     . 'f' 나 'F' 를 앞에 붙인 문자열 리터럴
     . 치환 필드 포함 가능
     . 중괄호 {} 로 구분되는 표현식
     . 실행시간에 계산되는 표현식

>>> year = 2020
>>> event = 'Referendum'
>>> f'Results of the {year} {event}'
'Results of the 2020 Referendum'
>>> yes_votes = 42_572_654
>>> no_votes = 43_132_495
>>> percentage = yes_votes / (yes_votes + no_votes)
>>> '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage)
' 42572654 YES votes 49.67%'
>>> import math
>>> print(f'The value of pi is approximately {math.pi:.3f}.')
The value of pi is approximately 3.142.
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
...         print(f'{name:10} ==> {phone:10d}')
...
Sjoerd     ==>       4127
Jack        ==>       4098
Dcab       ==>       7678
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"
>>> print('{0} and {1}'.format('spam', 'eggs'))
spam and eggs
>>> print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam
>>> print('This {food} is {adjective}.'.format(
...     food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.
>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg'))
The story of Bill, Manfred, and Georg.
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
...            'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
>>> for x in range(1, 6):
...         print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
...         print(repr(x*x*x).rjust(4))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125

 

 

파일 입출력

  - open(filename, mode)
    . mode : r (readonly, 기본 값), w (writeonly), a (append), r+ (read and write), b (binary mode)

>>> f = open('d:\\testfile', 'r+')
>>> read_data = f.read()
>>> read_data
'This is the first line of the file.\nSecond line of the file\n'
>>> f.readline()
''
>>> f.seek(0)
0
>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''
>>> f.write('This is a test\n')
15
>>> f.seek(0)
0
>>> f.read()
'This is the first line of the file.\nSecond line of the file\nThis is a test\n'
>>> f.closed
False

 

 


예외 처리

>>> import sys
>>>
>>> try:
...         f = open('myfile.txt')
...         s = f.readline()
...         i = int(s.strip())
... except OSError as err:
...         print("OS error: {0}".format(err))
... except ValueError:
...         print("Could not convert data to an integer.")
... except:
...         print("Unexpected error:", sys.exc_info()[0])
...         raise
...
OS error: [Errno 2] No such file or directory: 'myfile.txt'

 

 

 


파이썬 스타일 가이드

 

PEP 8 -- Style Guide for Python Code

The official home of the Python Programming Language

www.python.org

 

  • 들여쓰기 단위 : 공백 4칸. 탭 사용 불가.

  • 한 줄 길이 : 최대 79자.

  • 함수, 클래스, 함수 내의 큰 코드 블록 사이는 빈 줄을 넣어 구분.

  • 가능하다면, 주석은 별도의 줄로 입력.

  • DocString 사용을 권장.

  • 연산자들 앞/뒤와 콤마 뒤에는 공백 입력.
    괄호 바로 안쪽에는 공백 불가.
    예) a = f(1, 2) + g(3, 4)

  • 명명 규칙
    . 상수 : UPPER_CASE_WITH_UNDERSCORES.
    . 패키지 : 짧은 소문자 이름 권고. 밑줄은 사용 불가.
    . 모듈 : 짧은 소문자 이름 권고. 밑줄은 사용가능하지만 지양할 것.
    . 클래스 : UpperCamelCase.
    . 함수와 메소드 : lowercase_with_underscores.
    . 메소드의 첫 번째 인수는 항상 self를 사용.
    . 클래스 메소드의 첫 번째 인수에는 항상 cls를 사용.

  • 파이썬의 배포판 코드는 항상 UTF-8이나 파이썬2의 ASCII를 사용할 것.

 

[Ref.] https://docs.python.org/ko/3/tutorial/index.html
        https://docs.python.org/3/tutorial/index.html

 

Hadoop 2 버전을 설치하기 위해서는 JDK 7 설치가 선행되어야 합니다.
하지만, CentOS 8 환경에서 yum을 이용한 JDK 7 설치는 지원되지 않고 있습니다.

설치 파일을 직접 다운로드 해서 설치하는 수 밖에 없습니다.

 

1. 설치파일 다운로드

▶URL : https://jdk.java.net/java-se-ri/7

자바 다운로드 사이트에서 설치파일 URL을 복사한 후, wget 명령어를 이용하여 로컬에 다운로드 받습니다.

> sudo wget https://download.java.net/openjdk/jdk7u75/ri/jdk_ri-7u75-b13-linux-x64-18_dec_2014.tar.gz

 

2. 설치파일 압축해제

다운로드 받은 압축 파일을 tar 명령어로 압축 해제합니다.

> sudo tar zxvf ./jdk_ri-7u75-b13-linux-x64-18_dec_2014.tar.gz

JDK 7는 별도의 설치 작업없이 위와 같은 압축해제만으로 설치가 완료된 것이며, 압축해제 이후에 추가적인 설정 작업이 필요합니다.

 

3. Java symbolic link 설정 (alternatives 명령어 사용)

여러 버전의 자바가 설치되어 있다면 버전관리가 필요합니다. 관리하는 방법 중에 하나가 symbolic link 설정인데 CentOS에서는 alternatives 명령어를 사용하여 symbolic link 설정 및 관리가 가능합니다.

alternatives 명령어 사용방법은 아래와 같습니다.

 

--install 옵션으로 link를 추가하도록 하겠습니자. 인자값은 아래와 같이 설정합니다.

- link : 링크 대상 파일.
- name : 링크이름.
- path : 링크 원본 파일. 자바 실행 파일 경로.
- priority : 우선순위.
> sudo alternatives --install /usr/bin/java java /usr/local/java/java-se-7u75-ri/bin/java 1

 

링크 설정 상태는 --display 옵션을 사용하여 확인할 수 있습니다.

> sudo alternatives --display java

 

실제 생성된 링크를 확인해보겠습니다. 생성한 링크(/usr/bin/java)는 링크의 원본파일이 아닌 /etc/alternatives/java를 가리키고 있습니다.

위 링크가 가리키고 있는 대상(/etc/alternatives/java)을 확인해보면, 또 하나의 링크 파일임을 확인할 수 있으며 해당 링크파일이 우리가 지정했던 원본파일(/usr/local/java/java-se-7u75-ri/bin/java)을 가리키고 있음을 확인할 수 있습니다.

중간에 또 다른 링크파일을 이용하여 우리가 직접적으로 사용 할 링크는 유지한채 설정에 따라 링크가 가리키는 대상을 변경 할 수 있는 것입니다. 만약, 링크의 대상을 변경하기 위해서는 --config 옵션을 사용하면 됩니다. (--install 옵션을 사용하여 변경 할 대상파일을 미리 입력해줘야 합니다.)

> sudo alternatives --config java

 

4. 자바 환경변수 설정

profile을 열어 환경설정에 필요한 내용을 입력합니다.

> sudo vi /etc/profile

profile 파일 하단에 아래 내용을 추가합니다.

export JAVA_HOME=/usr/local/java/java-se-7u75-ri 
export PATH=$PATH:$JAVA_HOME/bin 
export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar

profile을 변경하였으면 변경 내용을 적용되도록 아래 명령어를 실행합니다.

> sudo source /etc/profile

 

5. 자바 실행

이제 자바 설치와 환경 설정이 완료되었습니다.

아래 명령을 사용하여 자바가 제대로 실행되는지 확인해보겠습니다.

> java -version

 

위와 같이 설치된 자바 버전을 확인할 수 있다면 자바가 정상적으로 설치된 것입니다

 

'Develop > Java' 카테고리의 다른 글

Java SE 11 설치 on Windows 10  (1) 2020.06.27

+ Recent posts