반응형

pjava programming

1. java application programming - java문법, DataParsing(HTML,JSON, XML),자료구조

2.java web programming –jsp &servlet, html,css,javascript

3.java framework –db (mybatis& hibernate),spring

 

객체지향

C++ C # OBJECT-C 함수형 + 객체지향

PYTHON

CLASS안해도 할 수 있다. 객체지향을 사용하지 않았다.

JAVA OBJECT-C에서 나왔다.

JAVA는 완전한 객체지향언어 이다.

객체지향에  함수를 나중에 추가했다.

함수형은 좀 가볍다.

객체지향은 어렵다.

C++, C#, OBJEC-C, PYTHOn등을 말하기 위해서는 실행파일을 해야한다.

WINDOW MAC은 자기들이 해석할 수 있다.

운영체제

실행파일은 ASSEMBLY LANGUAG로 만들어야 한다.

실행파일 두 개씩 만들어야 한다.

가정용품에서 문제가 생긴다. 그래서 Linux 1.0->linux 2.0에서 만들려면 계속 바꿔야 한다ㅏ.

운영체제에 따라 바꾸지 않고 하기 위하려고 해서 플랫폼 독립적인 언어

java os위에다 jvm을 만들고 거기서 인식하는 것을 만든다.

jvm이 알아서 os가 적용할 수 있는 것을 만든다.

 

 

 

 

 

 

java                 kotlin ->안드로이드(google)

scala ->big dada spark설치 등 해야 한다.

clousre ->lambda sever

3 compiler하면 java class로 한다.

Go lang(google 이 만든 것)

windows 7 .net

j2ee->eclipse

j2se ->licence

j2me->iot embedded

java  개발도구 (jdk)->자바에서 제공하는 클래스모임 , 실행하기 위한 jvm

      실행도구 (jre)=>R,python ->jvm

 

**java  개발 도구 설치

1.oracle에서 회원가입을 하고 jdk를 다운로드 받아도 되고 open jdk를 다운로드 받아서 설치해도 됩니다.

=>회사에서 application 개발을 할 때는 open jdk를 받아서 하던가 오라클 계약을 하고 oracle jdk를 다운로드 받아서 개발

open jdk=>회사에서는 open jdk사용하면 된다.

 

=>se버전을 다운로드

피씨 포맷할 경우 .net하고 java설치 하기

개발도구 하고 실행도구

 

2.다운로드 받은 프로그램을 설치

=>개발도구인 jdk와 실행도구인  jre가 같이 설치가 됩니다.

디렉토리 잘못 되면 안될 가능성이 있어서 환경변수 하면 좋다.

mac은 개발관련한것은 자기가 관리자 권한으로 설정해서 paht 에 연다.

하지만 linux,windows는 자기한테 간다 .관리자가 아니여서 환경변수 설정하는게 좋다.

 

3.환경 변수 등록

1).path:명령어를 입력했을 때 명령어를 찾는 디렉토리에 관련된 환경 변수

=>명령어를 짧게 사용하기 위해서 등록

=>java에서는 jdk디렉토리의 bin이라는 디렉토리를 등록

=>대다수의 프로그램들은 bin이라는 디렉토리에 명령어들이 모여 있습니다.

 

2)classpath:

=>자바 프로그램이 클래스를 찾는 기본 위치를 설정

=>설정하지 않으면 현재 작업 디렉토리에서 먼저 찾고 rt.jar에서 찾습니다.

=>설정하지 않아도 됩니다.

 

3).jre_home

=>자바로 만들어진 프로그램이 사용할 jre위치를 설정

=>java버전이 하나만 설치된 경우는 설정하지 않아도 자바로 만들어진 프로그램이 찾아서 설정합니다.

=>2개이상이 설치된 경우라면 설정하는 것이 좋습니다.

 

4.path설정

1)jdk가 설치된 디렉토리의 bin이라는 디렉토리 경로를 복사

=>python 이나 anaconda설치 할 때 path설정을 실수로 안 한 경우에도 동일한 방법으로 설정

C:\Program Files\Java\jdk1.8.0_231\bin

 

2)탐색기에서 [ pc] [내 컴퓨터]를 선택하고 마우스 오른쪽 [속성]을 선택

 

3)왼쪽 화면에서 [고급 시스템 설정]을 선택

 

4)새로운 대화상자에서 [환경 변수]클릭

 

5)2개로 나누어진 창이 보이게 되는데 위의 창은 현재 로그인 유저에 관련된 설정이고  아래 창은 모든 유저에서 적용되는 설정입니다.

위나 아래에서 path라는 환경 변수를 찾아서 [편집]을 클릭

 

6)새로 만들기를 누르고 이전에 복사한 내용을 붙여넣기 하면 됩니다.

=>windows7일 때는 하나의 문자열로 보이는데 이 때는 커서를 맨 뒤로 이동하고 ;을 추가하고 붙여넣기를 하면 됩니다.

이전에 입력된 내용을 삭제하면 이전 설정된 내용이 없어지므로 주의해야 합니다.

 

5.java설치 확인

1).실행 도구 설치 확인 (jre확인 )

=>command창에서 java –version을 입력하고 enter

 

2)개발 도구 설치 확인

=>command창에서 javac –version을 입력하고 enter

=>설치가 되도 안보이는 경우가 있는데 이 때는 path 설정을 하지 않아서 입니다.

 

6.자바 코딩 및 실행

1)코딩은 문서만 만들 수 있는 프로그램이라면 어떤 것이든 상관 없습니다.

=>자바코드 파일의 확장자는 .java로 만들면 돕니다.

 

2)컴파일 명령

=>javac파일명

=>파일명은 전체 경로를 입력해야 하고 확장해도 포함해야 합니다.

=>성공하면 확장자명을 제외한 파일명.class가 생성됩니다.

=>이 파일이 jvm 위에 올라가면 다시 실제 어셈블리어로 번역되서 실행

 

3)실행명령

=>java 클래스이름

=>확장자를 제외한 클래서 이름만 입력

=>반드시 main메소드를 소유한 클래스 이름을 입력해야 합니다.

 

**자바 프로그램의 실행 원리

소스 프로그램(코딩한 내용)->compile(소스 프로그램을 어셈블리 언어로 변역 컴파일에 실패하면 문법에 맞지 않게 작성한 것입니다. 문법을 확인해야 합니다.): java .class파일 을 생성->build(여러 개의 파일들의 실행 순서와 스타트업 코드를 삽입해서 실행되기 직전의 프로그램을 만드는 것입니다. – 빌드에 실패하면 실행하는 메소드가 없거나 2개 이상이거나 하는 등의 구조적인 문제입니다.)

운영체제는 어셈블리 언어로 한다.

python등은 main 이 있어야 한다.

load(프로그램을 메모리에 적재)->run(실행)

 

7.IDE(통합 개발 환경-Integreated Development Environment)

=>컴파일과 실행하는 명령어 들을 직접 입력하지 않고 단축키나 아이콘 등으로 수행할 수 있도록 해주는 개발 관련 프로그램

 

 

=>python IDE idle,pycharm,jupyter notebook, spyder, vscode

,jupyter notebook ->분석하고 보고서 만드는 것이 편하다.

vscode ->개발자

pycharm ->가상환경

=>Java IDE Eclipse(무료- 공공기관,금융,대기업이 Eclipse기반의 Framework를 사용) Intelli J(코드 센스 기능 및 코드 최적화 기능이 Eclipse에 비해서 뛰어남, 무료 버전으로는 일반 application개발과 안드로이드 만 가능 ,사용화 버전을 구매해야만 웹 프로그래밍이 가능, 학생은 상용화 버전이 무료, 스타트업이나 중견기업에서 주로 이용)를 많이 사용

 

 

 

프로그램 만든다.

실행속도는 c가 빠르다.

개발 시 leaning curve(언어 습득시간)

        coding

 

8.Eclipse설치

=>www.eclipse.org 에서 다운로드

https://www.eclipse.org/downloads/download.php?file=/oomph/epp/2018-12/R/eclipse-inst-win64.exe&mirror_id=448

=>설치 과정에서 유의할 점은 맨 처음 버전 선택 하는 부분입니다.

java web programming까지 할려면 java ee버전으로 설치

eclipse IDE for java developers=>java밖에 안된다.

 

프로그램을 해석해주는 것

프로그램 IDE -->프로그램 만드는 것이 아니다.

ANACONDA는 두개 다 있다.

 

9.프로그램 작업 단위

1) workspace:디렉토리의 개념

=>환경 설정과 프로젝트가 같이 저장

 

2).project:실행 단위

=>여러 개의 패키지와 파일이 같이 저장

 

3)package:파일들을 보기 좋게 정리하기 위해서 만드는 단위

=>여러 개의 파일이 같이 저장

 

4)file:소스 코드 작성 단위

 

5)workspace를 변경하면 환경설정을 다시 해야 합니다.

 

10.Elicpse환경설정

=>windows에서는 windows메뉴의 preference

mac에서는 첫번째 메뉴의 preference

 

11.java application projecT(운영체제에 설치해서 실행되는 프로그램)만들기

1).File – [New] – [Project]

=>java Project 를 선택

=>화면에서 보이지 않을 때는 [Others]를 선택하고 [Java]탭에서 [Java Project]를 선택

 

베타테스트 ->다른 곳에서도 테스트 해본다.

src->java파일 실행하는 디렉토리

.java 컴파일 하면 .class로 되서 실행된다.

.java->src

.class->bin

 

2)프로젝트 이름을 입력하고 저장 위치를 정하는 대화상자를 출력

 

3)next를 누르면 소스 파일과 클래스 파일의 위치를 정할 수 있는 대화상자를 출력

디폴트는 소스 파일은 src 클래스 파일은 bin으로 설정되어 있습니다.

변경하지 않습니다.

 

4)자바는 완전한 객체 지향 언어라서 최소한 1개 이상의 클래스가 있어야 실행이 됩니다.

=>클래스를 생성할 떄는 src 디렉토리 위에 마우스를 올려놓고 마우스 오른쪽을 클릭하고 [New] – [Class]를 선택하고 클래스 이름과 옵션을 설정

=>클래스를 만들 때 main메소드를 소유한 클래스가 실행이 가능한 start up class가 됩니다.

=>클래스 이름은 대문자로 작성하는 것이 관례입니다.

대문자로 만드면 class이다. 그래서  python 에서는 dir 확인 필요

 

 

 

5)main메소드 안에 작성

System.out.println("안녕하세요 처음 만드는 자바 프로그램입니다.");

System.out.println("Hello world");

 

 

6)실행

[Run] –[Run]

=>하단에 콘솔이 하나 만들어지고 결과를 출력합니다.

 

12.Eclipse화면

=>조그마한 화면 하나는 View라고 하고 전체적인 구조는 Perspective 라고 합니다.

Eclipse에서는 Perspective 에 따라 메뉴가 달라집니다.

=>조그만한 화면이 안 보이는 경우에는 [Window] –[Show View]메뉴를 이용해서 출력하면 됩니다.

=>메뉴가 다르거나 화면 전체 구성이 다르면 [Window]-[ Perspective]-[Open Perspective]에서 원하는 구조를 선택하면 됩니다.

상단의 메뉴바 가장 오른쪽에서도 가능합니다.

 

13.System.out.println(),system.out.print,System.out.printf,out대신에  err사용

=>콘솔에 내용을 문자열로 출력해주는 메소드

System.out.println() 은 메소드를 출력할 때 마다 출력하고 마지막에 줄 바꿈을 해줍니다.

 

System.out.print는 호출할 때 출력하지 않고 모사어 한꺼번에 출력하고 줄 바꿈을 하지 않습니다.

 

System.out.printf는 서식을 적용해서 출력하고자 할 때 사용

콘솔용 프로그램을 만들 때 출력을 보기좋게 할 때 주로 이용

 

out대신에 err을 사용하면 콘솔에 에러가 발생한 것처럼 빨간색으로 출력

프레임워크 같은 곳에서는 자체적으로 출력하는 메시지들이 있기 때문에 구분하기 위해서 사용

System.err.println("Hello world");

System.out.println("Hello world");

System.out.print("Hello world");

 

14.프로그램의 구성

1).keyword(예약어)

=>프로그래밍 언어가 기능을 정해놓은 명령어

 

2).identifier(식별자)

=>프로그래머가 다른 것 들과 구분하기 위해서 만든 이름

=>예약어를 식별자로 사용하면 에러

=>이미 만들어진 식별자를 새로운 기능으로 재정의하면 기존 식별자의 기능은 소멸되고 프로그램에서는 새로운 기능으로만 사용이 가능합니다.

python에서는 def 는 예약어이다.

def = 10 ->오류난다.

str->식별자이다.

str = 100 (str은 문자열이지만 이 프로그램을 사용하는 동안은 str 100이 된다. )

=>영문과 한글 모두 가능하고 숫자도 가능하면 일부 특수문자도 가능

=>시작은 반드시 문자로 해야합니다.

=>중간에 공백은 안됩니다.

=>JAVA에서는 카멜 표기법을 권장하는데 변수와 메소드는 소문자로 시작하고 클래스는 대문자로 시작하고 상수는 모두 대문자로 표기

2개 이상의 단어로 구성된 경우는 두번째 단어의 시작도 대문자로 합니다.

 

PYTHON: 기본제공이 적다. 예약어가 적다. 다른 개발자가 제공하는 기능이 많다.

문법 ->예약어

 

3).literal

=>사용자가 직접 작성하는 데이터

=>숫자는 숫자만 표현, 하나의 문자는 'c'형태로 표현 ,여러개의 문자는 "문자열" , 참과 거짓은 TRUE,FALSE로 표현하고 NULL NULL이라고 표현

 

4).variable

=>변수 데이터를 저장해두고 다음에 사용하기 위해서 붙인 이름

 

5).constant

=>상수 데이터를 저장해두고 읽기 전용으로 사용하기 위해서 붙인 이름

 

6).operator

=>연산자 연산을 위해서 사용하는 부호나 명령어

 

7).method

=>객체 지향언어에서 작업을 수행하는 단위

=>function(함수)라고도  하는데 함수는 아무곳에서나 사용할 수 있는 것이고 메소드는 객체나 클래스를 이용해서만 호출이 가능

 

8).class & object(instance)

=>관련있는 변수와 메소드의 집합

 

9).package

=>관련있는 클래스의 집합으로 배포 단위

 

10).comment

=>주석

=>컴파일러에 의해서 번역되지 않는 문장

=>한줄은 //다음에 작성

여러 줄은 /**/안에 작성

 

Data Type(자료형)

=>데이터를 얼마만큼의 크기에 어떻게 저장하고 읽어낼 것인가 하는 것

1.분류

1)정적 자료형 과 동적자료형

정적자료형 (Static) 선언할 때 결정->속도가 더 빠르다.

동적자료형(dynamic) 실행할 때 결정 runtime->효율은 좋을 가능성이 높다.

int a = 10;->정적 a를 선언하는 순간 정수를 정한다. 바꿀 필요 없다.

int a = 10.7->오류난다. 안된다.

a = 10;->동적이다. a는 뭐 저장할 지 모르지만 10을 주는 순간 정수가 된다.계속 바뀐다.

a = 10.7 ->float으로 된다.

 

2)변경가능성에 따른 분류

documnet에는

1)mutable(변경가능) ->variable(변수)

2)imutable(변경 불가능)->constant(상수) -> readonly ->

예약어 int A = 10

                                                         예약어 붙이면 constant, readonly

                                                         읽기 전용은 프로그램의 가독성 문제이거나 multithread때문에

           : 잔액조회시 constant하지 않으면 누군가가 바꿀 수 있다.

                                                         literal->사용자가 직접 작성한 데이터

                                                                     10 , 10.7 , a

데이터 가공

R은 자기것 안바꾸고 return한다. 항상 새로운 것에 복사해서 작업해서 바꾼다.

python은 프로그래밍 언어이기 때문에 보통 자기 자신을 바꾼다.그래서 분석인지 아닌지 확인해야 한다.inplace = true 자기 자신 바꾸는 것이고 설정하지 않으면 return한다.

 

3)데이터 개수에 따른 분류 ->데이터 분석시

(1).scala data :데이터 1변수가 데이터 자체를 의미

(2).vector data:0 개 이상의 데이터 변수가 데이터가 위치한 곳의 참조가 되는

 a = 10 ->a 10

li = [10,20] ->시작 위치를 가리킨다. 참조 .이나 이런 것 해서 찾아야 한다. li[0]

분석에서는 1개이나 0개 이상이냐는 매우 중요한 것이다.

 

4).사용 방식에 따른 분류->java ->데이터 프로그램

(1). value type (기본형) : 변수 자체가 데이터

변수는 절대 값을 저장 할 수 없다.

(2)reference type(참조형):변수가 데이터 저장된 곳에 참조를 의미 ->javascript(정적을 자료를 선언하지 않는다.)

javascript var =

            lef

a = 10->reference type

reference메모리의 주소를 카르킨다. 크기가 같다.

value는 가르키고 있는 주소가 정해져 있어야 한다. 그래서 자료형을 쓴다.

 

주소는 (assembly)등에 서 사용하기 때문에 따른데는 주소라고 할 수없다. 가상의 주소 가르킨다. 참조라고 하는게 좋다.

a = 10

a = 10.9

변수의 크기는 주소를 가르킨다.

32bit머신은 4g가 이상 사용할 수 없다.

실제로는 1나는 value, reference인지 확인 해야 한다. 그래서 2 31승이다.

 

 

**자료형(Data Type)

1.java에서 일반적으로 자료형을 구분하는 방법

1).value type(기본형):변수가 데이터 자체를 의미하는 것

=>8가지의 자료형이 제공

=>boolean,byte, short, char, int,long, float, double

 

2)reference type(참조형):변수가 데이터의 참조를 의미하는 것

=>배열,클래스(객체)

 

2.java에서 변수 선언

자료형 변수이름:

=>기본형인 경우는 이름만 만들어지고 참조형인 경우는 변수이름이 만들어지고 공간할당을 한후  null을 저장

 

3.변수가 가리키는 공간에 값 대입

변수이름 = 데이터;

=>이 때 데이터는 변수가 선언될 때와 동일한 자료형의 데이터만 가능

=>선언과 동시에 값 할당 가능

자료형 변수이름 = 데이터;

 

4.java는 명령어 종료할 때 마다 ;을 해야 합니다.

 

5.변수는 선언할 때와 = 의 왼쪽에 있을 때는 공간을 의미하지만 그 이외의 경우는 데이터나 데이터의 참조를 의미합니다.

 

int a = 10; //선언할 때 이므로 a라는 공간

System.out.println(a); ///a라는 공간에 저장된 데이터(10)를 출력

a = a +4; // 10 이라는 값에 4를 더한 결과를 a라는 공간에 다시 저장

 

6.변수의 종류

1)Local Variable(지역변수):자신을 만든 영역에서만 사용이 가능한 변수

=>메소드(함수) 안에서 만들어진 변수

 

2)instance Variable(멤버변수):자신을 소유하고 있는 객체를 통해서만 접근이 가능한 변수

=>클래스 안에서 static키워드 없이 메소드 바깥에 선언된 변수

python에서는 init안에 만들어진 self

 

3)static Variable(클래스 변수):자신을 소유하고 있는 클래스를 통해서 접근이 가능한 변수

=>클래스 안에서 static이라는 키워드와 함께 메소드 바깥에 선언된 변수

=>자바에선느 이 변수를 이용해서 전역변수(Global Variable-아무 곳에서나 사용가능한 변수)를 만듭니다.

local global를 통해서 나누기도 해다.

 

7.기본형

=>변수가 데이터 자체인 자료형

=>boolean:byte, short, char, int,long: float, double

1)boolean

=>참과 거짓을 저장할 수 있는 자료형

=>boolean literal:true false

=>boolean자료형은 boolean만 저장 가능

=>변수를 만들 때 앞에 is를 붙여서 boolean이라는 것을 나타내는 경우가 많습니다.

=>is로 시작하는 모든 것들은 참 과 거짓을 판별하는 것입니다.

python에서는 연산은 가능 하는데 의미가 없다.

데이터 있으면 true등으로 하기 때문에 가능하다.

true하고 true 2가 나온다.

하지만 java는 연산이 안된다.

 

=>실습 : boolean 변수를 만들고 데이터를 저장한 후 값을 출력해보기

//boolean 변수를 만들어서 값을 저장

boolean isNum = true;

//변수의 값을 출력

System.out.println("isNum:"+isNum);

 

2)정수

=>byte(1byte), short(2byte), char(2byte), int(4byte),long(8byte)

=>bit(binary digit):0또는 1둘 중에 하나의 데이터를 저장할 수 있는 메모리 크기

=>byte:8비트로 2 8승 까지를 구별할 수 있는 크기 - 256가지 구분 영문 1글자

=>1 byte -128 ~ +127까지 저장 ,데이터를 메모리에 저장되는 구조로 저장하기 위해서 사용, 파일의 내용을 저장하거나 네트워크에서 데이터를 주고 받을 때 주로 이용 -27  ~ 27-1

2 8 => 256 나누기

=>short : -32768 ~ 32768 까지 사용 -215  ~ 215-1 ,예전에 좌표 같은 것을 short를 이용해서 저장

=>char : 0 ~ 65535 까지 저장 ,정수를 저장하고 있다가 출력을 할 때는 정수에 해당하는 ASCII코드에 해당하는 문자를 출력

48 ->'0'

65 ->'A'

97 ->'a'

0 ->null

7 ->beep(메모리 없을 때 9번 삑 소리난다.)

 

=>int  : 4byte, -21 ~+21억 까지 표현 ,정수의 기준형, 10이라고 입력을 하면 int 10입니다.

가장많이 사용되는 정수 자료형 -2^31  ~ 2^31  -1

 

=>long :8byte , 크거나 작은 정수 표현, 리터럴로 표현할 때는 뒤에 L또는 소문자 l 을 붙임

10L이라고 하면 long형 정수 10입니다. -2 ^ 63  ~ 2^63 -1

 

=>변수를 만들면 자신이 저장할 수 있는 크기보다 크거나 작은 값은 저장할 수 없습니다.

다른 변수의 데이터를 저장할 때는 자신의 크기와 같거나 작은 자료형의 변수의값만 저장가능

 

int long을 저장 못함

long int는 저장 가능

 

=>크기

byte< short< char< int <long

bytes는 네트워크 나 파일 내용 읽을 때 중요하다.

42억은 float double를 자주 사용합니다.

word는 한번에 데이터 주고 가고 받는 것이다.

word 32bit

하나의 워드 크기로 하면 괜찮은데 여러개 할 때 long이 문제 있다.앞부분은 괜찮은데 뒤부분 계산할 때 문제가 있다.

C언어의 크기는 word이다. int 원래는 2byte였는데 지금은 32bit이다.

 

=>실습

//자신의 나이를 저장하기 출력

//20이라는 값을 정수 변수 age에 저장

int age = 20;

//age에 저장된 값을 콘솔에 출력

System.out.println("나이는 : "+age);

 

분석의 마지막은 보고서이다.

browse에서 만드는 것 좋다.

application의 마지막은 배포이다. 분석의 마지막은 보고서를 만드는 것이다.

 

=>java에서 하나의 문자 저장

문자 리터럴 표현 : '문자' 또는0x16진수 2개 등으로 표현

자료형은 char에 저장하면 출력할 때 문자로 출력되고 다른 정수 자료형에 저장하면 숫자로 출력

 

char ch = 'A';

int c = 'A';

System.out.println("ch:"+ch); //char를 출력하므로 A로 출력

System.out.println("c:"+c);   //int를 출력하므로 65로 출력

                      

char ch1 = 65;

System.out.println("ch:"+ch1); //65 A로 출력

 

 

3)실수

=>float(4byte) : +-2 38승 정도의 데이터 까지 표현, 숫자의 정밀도는 소수 7자리 정도

literal로 표현할 때는 뒤에 소문자 f를 추가

4.07f 형태로 표현

 

=>double(8byte) : +-2 308승 정도의 데이터 까지 표현, 숫자의 정밀도는 소수 15자리 정도

실수의 기준형은 double이어서 특별한 문자 없이 표현

3.14 로 입력하면 실제 저장은 +0.314E+002의 지수 형태로 저장

0.314 * 10 2

지수 형태로 저장해야 작은 크기로 넓은 범위의 숫자를 표현할 수 있기 때문입니다.

float 을 사용하는 것이 메모리를 절약하는 것이기는 하지만 되도록이면 double을 사용하는 것을 권장하는데 그 이유는 지금의 cpu는 산술 연산을 빠르게 하기 위해서 수치보조 프로세서를 가지고 있는데 이 수치보조 프로세서의 연산 단위가 double입니다.

 

=>실수를 가지고 연산할 때는 주의해야 합니다.

실수는 정확하게 표현할 수 없는 경우가 있기 때문입니다.

 

int i = 1;

int sum = 0;

for(int j = 0; j < 1000; j = j+1) {

sum = sum +i;

}

System.out.println("sum:" + sum);

 

 

double i = 0.1;

double sum = 0.0;

for(int j = 0; j < 1000; j = j+1) {

sum = sum +i;

}

System.out.println("sum:" + sum);//0.1 1000번 더했는데 100.0이 아님

                      

System.out.println("1-0.8:" +(1-0.8)); //1-0.8 0.2를 비교했는데 다르다고 나옴

System.out.println("1.0-0.8:" +(1.0-0.8));

 

컴퓨터 가지고 실수 연산하면 잘 못 나올 수 있다.

int a = 23;  =>10진수

컴퓨터는 10진수 아니고 2진수로 저장

8진수, 16진수는 2진수를 줄여쓰기 위해서 사용한 것이다.

8진수는 2진수 3개씩 묶은 것이고

16진수는 2진수 4개씩 묶은 것이다.

23 2진수로 변환

몫이 0이 될때 까지 나눈다.

8진수 등을 설명한다.

10111(2)

 

음수는 양수의 2의 보수

=>2의 보수는 1의 보수 + 1

=>1의 보수는 0-> 1 1->0

a = -23 =>23 2의 보수이다.

-23시 먼저 23을 찾는다.

1111 1111 1111 1111 1111 1111 1110 1000

+                                        1

1111 1111 1111 1111 1111 1111 1110 1001 =>-23

0000 0000 0000 0000 0000 0000 0001 0111=>

뒤쪽에서 가장 먼저 만나는 1을 찾아서 그 자리를 1로 두고 앞에는 다 뒤집는다.

첫 번째 자리는 1이면 음수이다.

 

-1:

0000 0000 0000 0000 0000 0000 0000 0001

1111 1111 1111 1111 1111 1111 1111 1110 ->1 의 보수

+1      1111 1111 1111 1111 1111 1111 1111 1111 -1

-1->가장 큰 숫자  infinite

12의 보수 구하는 것이다.

indexOf -1로 준다 내가 끝까지 가봤는데 없더라

음수 필요 하는지 확인해서 음수가 필요하면 -1이지만 음수가 필요 없으면 가장 큰 숫자이다.

비디오 재생회수 -> 최대수 숫자여서 -1이 잴 크다.

 

소수의 정밀도 문제

10진수를 2진수로 표현

=>소수부분에 2를 곱해서 정수 부분만 순서대로 표기

0.5 * 2 = 1.0 ->0.1(2)

0.625 (10)  -> 0.625 * 2 = (1.25-1) *2 => 0.5 * 2 =>1.0 ->0.101           2진수

 

0.2 * 2 = 0.4 * 0.2 = 0.8 * 2  = (1.6 -1)*2 =  1.2

0.0011

 

컴퓨터에는 0.2가 존재하지 않는다.

숫자표현의 한계 때문에 틀리다.

실수가지고 할 때는 정수로 하는 것이 좋다. 아니면 문자별로 해서 자리별로 계산하는 것이 좋다.

 

0.1 * 10 -> 1.0 * 100 = 100/ 10  -> 10

 

1- 0.8 == 0.2 =>구조적인 문제

10- 8 == 2

실수를 정수로 바꾸거나 다른 모듈로 이용해서 하는 게 좋다.tensorflow  keras등은 이런  수식을 해준다.

python은 마지막 것이  -1인데 재일 마지막이라는 의미를 한다.

 

 그림은 색갈의 집합

ARGB

RGBA

A-투명도

이미지 분석 패턴을 분석 4byte 씩 한다. 4개씩 모아서 선을 그은다. 색상이 4개로

 

컴퓨터는 2진수로 저장한다. 10진수로 저장하지 못한다. 실수를 저장하는데 한계가 있다.

고정소수점 3.14 ->0.314E+002

 

0000 0000 00

9999 9999 99

8개는 숫자 쓰고 뒤에 두개는 지수를 사용한다.

지수표기법을 이용하면 넓은 범위를 표시할 수 있다 계산 속도나 늦어지지만

0.314E002 + 0.67E001 ->cpu옆에 수치보조 시스템이 한다. double

double 키 저장하고

python에서 숫자의 기본은 실수 이다. 소수와 같이 나오는 것이 종종 있다.

자신의 키와 몸무게를 저장할 수 있는 변수를 만들어서 저장한 후 출력

자바에서 정수 , 실수

자료형 변수이름 = ;

8.Type Casting

=>데어터의 자료형을 변환하는 것

 

1)분류

=>자동 형 변환: 데이터의 자료형이 자동으로 변환되는 경우

=>강제 형 변환: 원하는 결과를 만들기 위해서 강제로 자료형을 변환하는 경우

 

2)형 변환이 가능한 경우

=>숫자 데이터끼리는 형 변환이 가능합니다.

(byte, short, char, int ,long,float, double)

=>참조형 데이터의 경우는 상속 관계인 경우만 가능합니다.

 

3)자동 형 변환

=>표현 할 수 있는 범위가 큰 자료형의 변수에 작은 자료형의 데이터를 대입하는 경우

long 8byte이고 float 4byte이지만 long은 정수이고 float는 실수로서 float이 표현범위가 long보다 크기때문에 float long보다 큽니다.

ex)

float f =10;

f float변수인데 10이라는 int형 데이터를 대입했습니다.

float f = 10.0f;로 변경되서 처리

 

=>정수 자료형의 변수에 int정수 상수를 대입하면 변수가 표현할 수  있는 범위 내의 숫자라면

그 변수의 자료형으로 변경되서 대입됩니다.

리터럴은 변경이되서 저장되지만 변수의 값은 변경이 안되기 때문에 저장이 안됩니다.

 

ex)

short s = 3000;//3000이라는 int형 리터럴이 short 범위 안에 있는 정수이므로 short로 변경되서 저장이 됩니다.

int n = 3000;

s = n ;//n int형 변수이므로 이 데이터의 크기를 줄여서 short에 대입할 수 없습니다.

 

=>산술연산을 하면 2개이 자료형이 동일할 때는 동일한 자료형으로 결과를 리턴하고 2개의 자료형이 다를 때는 큰 자료형으로 변환해서 연산을 수행

그리고 int보다 작은 자료형으로 산술연산을 하면  int로 변경해서 산술연산을 수행

정수 / 정수 = 정수;

10 / 4 = 2.5가 아니라 2=>소수는 버림

 

short s1 = 100;

short s2 = 200;

short s3 = s1+s2;//에러가 발생합니다.

short +short 이지만 자바는 int로 변경해서 연산을 하기 때문에 int+ int가 되서 short에 결과를 저장할 수 없습니다.

 

실습) 자동형변환

컴퓨터도 단위가 있다.

컴퓨터는 int보다 작은 단위로 계산 못한다.

                       //자동 형 변환

                       double d = 10;//10 10.0으로 변환해서 저장

                       System.out.printf("d:%f\n",d);

                      

                       //숫자의 표현범위가 int보다  작은 변수에 저장 가능한 정수 리터럴(상수)를 대입하면 형 변환해서 대입합니다.

                       //표현범위가 더 큰 정수는 대입이 안되고 더 큰 자료형 변수에 있는 데이터도 대입이 안됩니다.

                       short s = 3000;//3000이라는 상수는 short표현 ㅂㅁ위 내라서 대입이 가능

                       //아래 문장은 에러

                       //s = 65535;//65535 short표현범위 밖이라서 대입이 불가능

                      

                       int n = 3000;

                       //s = n ; //같은 3000이지만 변수에 저장된 3000int 3000이라서 더 큰 데이터라서 역시 에러가 발생합니다.

                      

                       /*자바는 산술연산(+,-,*,/,%)을 할 때 2개의 자료형이 다르면 더 큰 자료형으로 변환해서

                        *연산을 하고 int 보다 작으면 int로 변환해서 연산

                        *2개의 자료형이 같으면 결과도 동일한 자료형으로 리턴

                        */

                      

                       double result = 10 /3;

                       //결과는 3.3이 아니고 3.0

                       //정수 /정수는 결과가 정수

                       System.out.println("result:"+result);

                      

                       //int보다 작은 자료형의 연산은 int로 변환해서 처리하기 때문ㄴ에

                       //산술연산의 결과 최소 자료형은 int

                       short s1 = 300;

                       short s2 = 100;

                       //short s3 = s1+ s2;//이 구문은 에러

                       //short+short 이지만 결과는 int

                       //산술 연산의 최소단위는 int

                       //cpu의 정순 최소 처리 단위가 int

 

 

4)강제 형 변환

=>데이터의 자료형을 강제로 변경하는 것

=>숫자 데이터끼리 변환이 가능하고 참조형인 경우는 상속 관계인 경우만 가능

=>숫자 데이터의 형변환을 하는 경우는 원하는 결과를 만들기 위해서 또는 큰 자료형의 데이터를 작은 자료형의 데이터로 변환하기 위해서 입니다.

=>방법

(변환할 자료형) 데이터

 

=>데이터라고 할 때는 변수와 상수 모두 그리고 변수만 가능할 때는 변수라고 기재

=>실수를 정수로 변환하면 소수는 버려지게 됩니다.

 

ex) 정수 / 정수를 할 때 소수 까지 결과를 저장하고 싶은 경우

double result = 10 /7 ;

//이렇게 하면 결과는 1.0

 

double result = (double)  10 /7 ;

//10 double로 변환해서 10.0/7을 만들게 되고

//실수와 정수가 연산을 정수를 실수로 변환해서 10.0/7.0이 되고 그리면 결과는 1.4...

 

//실수 /실수를 했을 때 몫만 취하고 자 하는 경우

 

int r = 10.3/5.2;//에러 실수 /실수 이므로 결과는 실수인데 int에 저장할려고 해서 에러

 

int r = (int)(10.3/5.2) ;결과를 정수로 강제로 형 변환을 해서 1로 만들어서 r에 대입합니다.

double r = 10 /4;

                       System.out.println("r:"+r);//정수 /정수는 정수 2.0

                      

                       r = (double)10/4;

                       //10을 실수로 변경했기 떄문에 실수/정수는 실수로 결과를 리턴

                       System.out.println("r:"+r);

                      

                       //실수 /실수 한 결과를 정수로 저장하고자 하는 경우에는 결과를 int로 변환

                       int result = (int)(10.3 / 5.2);

                       System.out.println("result:"+result);

                      

                       double d = 18.75;

                       //d를 소수 첫째자리에서 반올림해서 정수로 변환

                       //int n = (int)Math.round(d);

                       int n = (int)(d+0.5);

                       System.out.println("n:"+n);//19

                      

                       //일의 자리에서 반올림

                       n = (int)(d* 0.1 + 0.5) * 10;

                       System.out.println("n:"+n);

반응형

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

java-6  (0) 2020.09.26
java-5  (0) 2020.09.24
java-4  (0) 2020.09.22
java-3  (0) 2020.09.20
java-2  (0) 2020.09.20

+ Recent posts