@컴퓨터 구조
컴퓨터는 입출력의 개념에서 시스템이라고 불린다.
시스템은 입력 값과 출력 값이 있어야 한다.
프로그래밍 입장에서는 함수도 입력 값과 출력 값이 있기 때문에 하나의 시스템과 같다.
하드웨어는 CPU, 메모리, 입출력장치 등으로 구성되어있다.
CPU(중앙처리장치)는 메모리에 있는 입력 값을 읽어서 처리하고, 출력하여 메모리에 저장한다.
메모리는 명령과 데이터를 저장한다. 개발자의 주 관심대상이다. 명령, 데이터를 각각 저장하는 두 개의 부분이 있다.
나머지 장치들은 입출력장치IO이다.
메모리가 아닌 곳으로 입출력 처리를 할 때엔 라이브러리가 필요하다.
기본 라이브러리는 표준 라이브러리와 같은 말이다.
식별자, 식별값은 여러 개의 데이터를 구분하기 위한 표현법으로 주로 코드, 번호로 표헌한다.
메모리 내의 데이터들은 위치의 개념으로 파악한다. “위치”에 있는 “데이터”를 가져온다고 표현한다. 그 표현되는 언어는 0과 1이다. 컴퓨터는 “위치”에서부터 “크기(byte)”만큼 가져온다고 생각한다.
자바에서는 자료형을 통해 “무슨 자료형”인 데이터를 가져오라는 것으로 치환해서 보여준다. 동작 방식은 앞과 같지만 표현하기는 더 쉽다.
byte는 컴퓨터의 기본 단위이다.
1byte는 8bit이다.
아스키는 1바이트로 문자 하나 표현하고, 유니코드는 2바이트 이상으로 문자 하나 표현한다.
utf8도 유니코드 계열이다.
자바는 기본적으로 유니코드를 사용한다. C는 아스키 씀.
아스키와 유니코드를 호환하려면 encode와 decode과정이 필요하다
인코드 디코드 할 때에는 라이브러리를 이용한다.
메모리의 식별값인 주소(위치)를 표현할 때는 메모리 주소 1바이트를 순서대로 붙여서 표현한다. (메모리 주소를 표현하는 방법은 언어마다 다르다)
@개념잡기
바로 코딩을 하는 것보다 그림을 기초로 하려는 작업을 생각하자.
여러 코딩 툴을 접해부는 것이 좋다.
참조(reference)는 데이터가 어디에 있는지 연결하고 있는 걸 말한다. 참조가 여러 개인지, 데이터가 여러 개인지 구분해야 한다.
참조명은 인스턴스명 또는 객체명과 같다.
뒤에 .을 붙이면 그 안에 많은 멤버들이 있다.
멤버 안에는 data.명령도 있는데 명령을 메서드라고 부른다.
기본형은 값 자체의 의미를 보여주고, 참조형은 여러 가지가 저장되어 있다.
언어를 배울 때엔 연산자, 변수, 함수 개념을 잡아야 한다.
※연산자
연산자는 항에 따라 단항, 다항으로 구분된다.
2항의 경우 Left value에 변수를, Right value에 식을 적는다.
대입연산자는 변수에게 식을 넣으라는 식으로 사용된다.
식은 왼쪽에서 오른쪽으로 진행되며 소괄호를 이용해 조절할 수 있다.
단항이 다항보다 먼저 실행된다.
연산자가 여러 개 사용된다면 식이며 ;을 이용해 구분해야한다.
식 중에 조건식은 결과가 논리 값인 경우를 말한다.
조건식은 제어문에서 사용되며 상황을 판단해서 동작하도록 제어한다.
논리(boolean)은 true와 false만을 값으로 갖는다.
조건식이 여러 개인 경우에는 모든 조건식의 경우를 고려해야 한다.
※변수
변수는 값을 담는 그릇이라고 생각하면 된다.
해당 변수가 어떤 값을 가질 것인지는 어떤 코드를 구상하는지에 따라 다르기 때문에 변수 앞에 자료형을 붙인다.
코드를 입력할 때 변수의 의미를 생각해야 한다. 이 변수가 어떻게 처리 될 것인지, 무슨 종류인지를 생각해야 수정이나 오류에 유연히 대처할 수 있다.
※함수
함수는 실행의 단위로 프로그램 전체는 여러개의 함수 조합으로 이루어진다.
자바에서는 함수라고 표현하지 않고 메서드라고 표현한다.
함수는 객체의 안과 밖을 구분한다. 함수는 마치 시스템과 같다. 입력 값과 출력 값이 있기 때문이다.
클래스는 연관성이 있는 함수들과 데이터들을 말한다.
자바 최근 버전에선 함수를 바깥으로 전달하는 람다가 등장했다.
함수에게 입력되는 걸 인자라고 하고 전달인자, pass라고도 함.
절차지향에선 함수를 바탕으로 코딩을 하며 함수로 이어진다.
객체지향에선 어디에 혹은 누구에게 있는 함수 라고 말함. 함수를 가지고 있는 “누구”가 객체임.
객체와 객체간의 상호작용은 요청을 보낸다고 표현함.
하나의 객체에서 다른 객체가 가지고 있는 함수를 실행시키는 것
함수 구분 방법으로 가장 쉬운 건 이름이다. 메서드명으로 구분한다.
다른 방법으로는 입력(전달인자)의 개수로 구분한다.
IP나 Path의 차이를 둔다면 같은 이름의 함수를 여러 개 만들 수 있다.
주로 해쉬코드가 같은 이름이나 같은 값의 파일을 구분하는 식별값으로 제시된다.
라이브러리는 API(Application Programing Interface)와 같은 뜻이다.
보통 개발자 사이트의 도큐먼트를 참고하며, 공식적인 reference 문서를 통해 설명을 찾아보는 것이 좋다. 인터넷 검색을 통해 이것 저것 가져오면 버전 문제, import 문제 등이 발생할 수 있다. 빌드 라고도 한다.
자바 프로그래밍하기 위해 구성해야 하는 개발환경은 주로 다음과 같다.
JVM: 실제로 운영체제로 넘겨서 실행하는.Java Virtual Machine
JRE: 실행을 시키려면 추가적인 라이브러리나 필요한 자원을 결합시켜주는 개념(실행가능한상태) Java Runtime Environment
JDK: 소스를 우리가 작성하는 코드를 번역하는, 검사하는 도구들의 개념 Java Development kit
JDK나 JRE는 OS의 영향을 거의 안받음. JVM은 운영체제에 따라 개별적으로 설치해야함. 자바는 보통 플랫폼 독립적이라고 하지만 그건 위쪽 JDK JRE 얘기고 JVM 실행단계에서는 의존적이다.
기본적으로 JDK를 다운받아서 설치하면 포괄적으로 설치됨.
개발환경과 다르게 실행환경도 있다.
실행환경은 우리가 만든 프로그램이 실제로 실행되는 환경이다.
Native네이티브라고 해서 OS에서 실행하는 환경, 브라우저에서 실행되는 Web, 임베디드(모바일) 환경에서 실행될 때 차이가 있다. 웹기반 개발은 브라우저만 있으면 어떤 디바이스에서도 실행된다. 요즘엔 웹앱이라고 말한다. 웹 베이스 브라우저로 거의 바뀌고 네이티브는 거의 사라지고 있다.
개발에선 GUI, CUI를 나눈다. 둘 다 PC에서 실행되는 건데 구분한다. GUI는 그래픽 유저 인터페이스=창이 뜬다는 표현과 같다. 멀티미디어, 예쁘게 이미지가 보여지는 환경을 GUI라고 한다. CUI는 character user interface. 오로지 글자만 입력하고 보여지는 환경이다. CLI, command line interface라고도 한다. 윈도우에서는 CMD라는 명령어로 실행되는 걸 말하고 리눅스에선 쉘이라고 한다. Mac 베이스는 기저가 리눅스라 리눅스 사용법을 그대로 쓸 수 있음.
콘솔과도 같은 말이다. 콘솔은 관리자가 접속하는 환경이다. 키보드입력과 모니터 출력이 기본적인 상황에서 텍스트 베이스로 프로그램 만든다.
결과를 보여주는 모습에 따라 실행 환경을 달리 한다. 처음 프로그래밍 연습은 콘솔로 하고 그 후에 모니터에 예쁘게 보여주고 싶으면 스윙과 같은 GUI 라이브러리를 가져다 쓰면 된다.
우리가 앞으로 사용할 데이터들은 문자이다. 환경 자체가 CUI 베이스이기 때문에 문자를 정수로, 정수를 문자로 변환한다는 개념이 있어야 한다. 키보드에서 입력되는 123은 숫자(문자) "123"이고 정수123이 아님. 어떤 데이터가 들어오고 나가는지 파악하는 것이 중요하다. 모니터에 보여주는 숫자는 정수가 아니라 문자이다.
-.jar 확장자명은 자바 아카이브로, 클래스 파일을 맞물리게 만드는 걸 말한다.
.java 파일이 변환되어 실행 가능한 상태를 자바 코드 혹은 Byte Code바이트 코드라고 한다. .class 파일과 같다.
JDK에서 javac(자바컴파일러)는 사람이 쓴 자바 언어를 컴퓨터가 알 수 있는 언어로 바꾼다. 컴파일러=미리 작성된 걸 기계어로 바꿔준다. 파일을 통째로 번역하여 주고받는 방식.
JRE에서 java는 interpret실행시키는 개념이다. 쓰여 있는 것을 하나씩 읽어들이면서 실행시키는 작업이다.(디버깅이 어렵다는 단점이 있다) 자바스크립트나 파이썬은 이 방식을 활용한다. 자바는 java와 javac가 애매하게 섞여있다.
종합하면, 컴파일된 걸 바이트코드라고 하고 바이트코드를 interpret방식으로 실행시킨다.
IDE는 통합개발환경 integrate development environment으로, 이클립스나 인텔리제이, 넷빈스가 가장 대중적이다.
프로그래밍을 하기 위해서는 컴퓨터 원리와 구조에 대해 잘 알아야 한다.
메모리는 선형 구조 안에 한 칸씩 나열되어 있고 한 칸의 크기는 1바이트 이다. 각 1바이트씩을 구별해야 하니까 번호를 부여했는데 이를 물리주소, 실제주소라고 한다. 실제주소와 상반되는 가상주소가 있다. 실제 주소는 OS가 관리하고, 가상주소는 JVM이 부여한다. 메모리 사이즈 변경은 JVM이 OS로부터 얼마의 메모리를 빌려올 것인지 정하는 것이다. 주소는 정수이며, 번호체계로 데이터 혹은 변수들을 구별한다.
'IT > 공부' 카테고리의 다른 글
[프로그래밍] 객체지향, 메서드 문법, OverLoading, getter 메서드 (0) | 2019.03.17 |
---|---|
[프로그래밍] call by value/reference, 배열, 객체지향 (0) | 2019.03.17 |
[프로그래밍] 연산자, 주석문, switch, for, while, 배열 (0) | 2019.03.04 |
[프로그래밍] Class path, Byte code, Data type, Operator (0) | 2019.03.03 |
[프로그래밍] system 개발 절차, "플랫폼 독립적"의 의미, 환경변수 잡는 이유 (0) | 2019.02.27 |