조컴퓨터

200818 OOP 04 - Java Datatype, Operator, Bit 본문

자바 웹개발자 과정/JAVA

200818 OOP 04 - Java Datatype, Operator, Bit

챠오위 2020. 8. 27. 09:50

200817 Python 수업의 마지막에 내주신 경로명, 파일명, 확장명을 분리 문제로 수업 시작

https://chocomputer.tistory.com/9

 

 

 

path="c:\myphoto\helloworld.jpg"
"""
    c:\myphoto      #파일명에는 '\' 사용하지 못하므로 rfind를 이용하여 경로명 검색이 가능하다.
    helloworld      #rfind 오른쪽부터 검사를 해서 가장 처음 등장하는 위치를 알려줌
    jpg
"""

 

내 답안 

 

a=path.rfind("\\")  #이름 짓는 연습 시작하자.........
print(path[:a])     #c:\myphoto

b=path.rfind(".")
print(path[a+1:b])  #helloworld

print(path[b+1:])   #jpg
print(path[-1])     #g

 

선생님 답안

 

print(path[:10])    #c:\myphoto
print(path[11:21])  #helloworld
print(path[22:25])  #jpg

 

 

마지막 \ 기호의 위치(순서, 인덱스)를 확인한다.

 

#p1=path.find("\\") #2
p1=path.rfind("\\") #10
#print(p1)    

 

path.find는 왼쪽부터 찾게 되므로 내가 원하는 경로값을 기준으로 잘라낼 수 없다.

이 문제의 경우에는 path.rfind가 정석적인 풀이다.

 

#경로명 = dir_path
dir_path=path[0:p1]     #함수 중간에 변수 이름을 정해줌으로써 나중에 봐도 명확
print(dir_path)

 

#파일명 = file_name
p2=path.rfind(".")
file_name=path[p1+1:p2] #함수 중간에 변수 이름을 정해줌으로써 나중에 봐도 명확
print(file_name)

 

#확장명 = ext_name
ext_name=path[p2+1:]    #함수 중간에 변수 이름을 정해줌으로써 나중에 봐도 명확
print(ext_name)

 

 

 

 

Java

 

프로그램 언어를 사용하기에 앞서 고려해야 할 요소 두 가지가 있다.

①어떤 언어를 사용할 것인가?

②어떤 코딩 도구를 이용할 것인가?

 

 

[Java 개발 환경 구축]

1) Java 개발 도구: Java Development Kit

  www.oracle.com

 

jdk-11.0.8_windows-x64_bin.exe

위의 파일을 설치하면 된다.

 

 

※ 왜 Mac용 JDK 다운로드와 MS용 JDK 다운로드가 구분되어 지는가?

 

→ 운영체제는 자바 프로그램을 바로 실행할 수 없는데, 그 이유는 자바 프로그램이 완전한 기계어가 아닌 중간 단계의 바이트 코드이기 때문에 이것을 해석하고 실행할 수 있는 가상의 운영체제가 필요하다. 이것을 자바 가상 기계(JVM: Java Virtual Machine)이라 부른다. JVM은 실 운영체제를 대신하여 자바 프로그램을 실행하는 가상의 운영체제 역할을 한다. 이때 운영체제별로 프로그램을 실행하고 관리하는 방법이 다르기 때문에 운영체제별로 자바 프로그램을 별도로 개발하는 것보다는 운영체제와 자바 프로그램을 중계하는 JVM을 두어 자바 프로그램이 여러 운영체제에서 동일한 실행 결과가 나오도록 설계한 것이다. 

 

바이트 코드는 모든 JVM에서 동일한 실행 결과를 보장하지만, JVM은 운영체제에 종속적이다. 자바 프로그램을 운영체제가 이해하는 기계어로 번역해서 실행해야 하므로 JVM은 운영체제에 맞게 설치되어야 한다. JVM은 JDK 또는 JRE를 설치하면 자동으로 설치되는데, JDK와 JRE가 운영체제 별로 제공된다.

 

 

 

자세한 설치 내용과 설명은 20200803-07 JAVA 코딩기초 (Ⅰ)에 정리해 두었다.

https://chocomputer.tistory.com/3

 

20200803-07 JAVA 코딩기초 (Ⅰ)

앞서 프로그램 언어를 사용하기에 앞서 고려해야 할 요소 두 가지가 있다고 하였다. ①어떤 언어를 사용할 것인가? ②어떤 코딩 도구를 이용할 것인가? [Java 개발 환경 구축] 1) 자바 개발 도구 �

chocomputer.tistory.com

 

 

- Java 개발 도구 종류

Java SE (Standard Edition) : SDK, 자발 개발 기본 도구

Java EE (Enterprise Edition) : JSP 개발 도구

 

- JDK 삭제

제어판 → 프로그램 제거

 

- JDK의 설치가 완료되었는지 확인하는 방법

바탕화면 하단의 돋보기 검색

→ cmd

>path C:\Program Files\Java\jdk-11.0.8\bin 

>java  -version

>javac

 

 

 

 

프로그래밍 언어

컴퓨터가 이해할 수 있는 언어는 기계어이다. 기계어는 0과 1로 이루어진 이진법 언어이기 때문에 사람이 이해하기 어렵다. 허나 사람이 사용하는 언어는 컴퓨터의 입장에서 이해할 수 없는 문자의 집합이다. 따라서 사람과 컴퓨터가 대화하기 위해서는 중간 다리 역할을 하는 프로그래밍 언어가 필요하다.

 

프로그래밍 언어는 고급 언어저급 언어로 구분된다. 고급 언어는 쉽게 말해 컴퓨터와 대화할 수 있게 만든 언어 중에서 사람이 쉽게 이해할 수 있는 언어를 말한다. 허나 이 또한 컴퓨터가 바로 이해할 수 없기 때문에 컴파일(compile) 과정을 통해서 0과 1로 이루어진 기계어로 변환하여 컴퓨터가 사용할 수 있게 한다. 반대로 저급 언어는 사람이 이해하기 어려운 언어를 말하는데, 대표적으로 어셈블리어가 이에 속한다.

 

고급 언어의 예시 - Java, C, C++

 

이 언어들로 작성된 내용을 소스(source)라 부르고, 이 소스는 컴파일러(compiler)라는 소프트웨어에 의해 기계어로 변환된 후 컴퓨터에서 실행된다. 

 

소스 프로그램
Source Program
ex) Hello.java
번역(compile, build)
--------------------------->
목적 프로그램
Object Program
ex) Hello.class

자바 소스 프로그램 번역: javac 파일명.확장명

자바 클래스 실행: java 클래스명(.class)

 

 

번역 Compile

컴파일러 Compiler : 프로그램 전체를 한꺼번에 번역

                          예시) Java, C, C++

인터프리터 Interpreter : 한 줄 읽고 한 줄 해석

                              예시) Python, R

 

 

위의 목적 프로그램의 예시인 Hello.class를 cmd 명령프롬프트(prompt)에서 테스트하면 다음과 같다.

 

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

		System.out.print("KOREA");

	}//main() end
}//class end

/*
결과값
KOREA
*/

 

※ 소스 파일 작성 시 주의 사항

- 소스 파일명과 대소문자가 일치해야 하며 숫자로 시작할 수 없고, 공백을 포함해서도 안된다.

- 1라인에서 Hello의 H가 대문자로 작성되어야 한다.

- 2라인에서 String의 S가 대문자로 작성되어야 한다.

- 3라인에서 System의 S가 대문자로 작성되어야 한다.

- 3라인 끝에 세미콜론(;)을 붙여준다.

 

 

cmd 명령프롬프트에서 결과값 확인하는 방법

바탕화면 하단의 돋보기 검색

→ cmd

>dir

>javac Hello.java

>java Hello

 

단, 명령프롬프트 대신에 이클립스를 사용하면 javac 저장이 자동화되어 바로 결과값을 출력할 수 있다.

 

 

[자바 환경 변수]
내컴퓨터 우클릭
→ 속성
 고급시스템설정
환경변수 새로만들기 
                    변수명 JAVA_HOME
                    변수값 C:\Program Files\Java\jdk-11.0.8
 path 편집 
    %JAVA_HOME%\bin

 

 

[이클립스 Eclipse 설치]

www.eclipse.org/downloads/packages/

 

Eclipse Packages | The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 350 open source pro

444 MB 8,630 DOWNLOADS The Modeling package provides tools and runtimes for building model-based applications. You can use it to graphically design domain models, to leverage those models at design time by creating and editing dynamic instances, to collabo

www.eclipse.org

 

eclipse-jee-2020-06-R-win32-x86_64.zip

위의 파일을 설치하면 된다.

 

 

[이클립스에서 한글 UTF-8 변경]

 

프로젝트를 생성하기 전에 Java, JSP, HTML, CSS, Text 파일의 기본 인코딩을 'UTF-8'로 지정한다.

이클립스 Window - Preference 메뉴

 

1)
Window
→ Preferences
General
Workspace
Text File encoding 속성을 UTF-8로 변경

2)
Window
Preferences
General
Editors
Text Editors
Spelling - Encoding 속성을 UTF-8로 변경

3)
Window
Preferences
Web
CSS Files
HTML Files
JSP Files Encoding을 UTF-8로 변경

 

[자바 환경 변수]

내 컴퓨터 우클릭

→ 속성

→ 고급시스템설정

→ 환경변수 → 새로만들기

                    변수명 JAVA_HOME

                    변수값 C:\Program Files\Java\jdk-11.0.8

→ path 편집

   %JAVA_HOME%\bin

 

 

 

 

자바 Java

 

자바의 특징

 

- 이식성이 높은 언어이다.

이식성이란 서로 다른 실행 환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 것을 말한다. 예를 들어 MS 윈도우에서 실행하는 프로그램을 리눅스 또는 유닉스에서 실행할 수 있다면 이식성이 높은 것이고, 실행할 수 없다면 이식성이 낮은 것이다. 자바 언어로 개발된 프로그램은 소스 파일을 다시 수정하지 않아도 자바 실행 환경(JRE: Java Runtime Environment)이 설치되어 있는 모든 운영체계에서 실행 가능하다. 따라서 자바 언어는 이식성이 높은 프로그래밍 언어라 할 수 있다.

 

- 객체 지향 언어이다.

프로그램을 개발하는 기법으로 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립 및 연결해서 전체 프로그램을 완성하는 기법객체 지향 프로그래밍(OOP: Object Oriented Programming)이라 한다. 이때 사용되는 언어를 객체 지향 언어라 한다.

자바는 아무리 작은 프로그램이라도 객체를 만들어 사용한다. 처음부터 객체를 고려하여 설계되었기 때문에 객체 지향 언어가 가져야 할 캡슐화, 상속, 다형성 기능을 완벽하게 지원하고 있다.

 

- 함수적 스타일 코딩을 지원한다.

최근 함수적 프로그래밍이 부각되고 있는데, 이는 대용량 데이터의 병렬 처리 그리고 이벤트 지향 프로그래밍을 위해 적합하기 때문이다. 자바는 함수적 프로그래밍을 위해 람다식(Lambda Expressions)을 자바 8부터 지원한다. 람다식을 사용하면 컬렉션의 요소를 필터링, 매핑, 집계 처리하는데 쉬워지고, 코드가 매우 간결해진다.

 

- 메모리를 자동으로 관리한다.

C++은 메모리에 생성된 객체를 제거하기 위해 개발자가 직접 코드를 작성해야 한다. 이 작업이 반드시 후행되지 않는다면 프로그램은 불완전해진다. 허나 자바는 개발자가 직접 메모리에 접근할 수 없도록 설계되어 자바가 직접 메모리를 관리한다. 객체 생성 시 자동적으로 메모리 영역을 찾아서 할당하고, 사용이 완료되면 쓰레기 수집기(Garbage Collector)를 실행시켜 자동적으로 사용하지 않는 객체를 제거시켜준다. 

 

- 다양한 애플리케이션을 개발할 수 있다.

단순한 콘솔 프로그램에서부터 모바일용 안드로이드 앱에 이르기까지 거의 모든 곳에서 실행되는 프로그램을 개발할 수 있다. 자바는 다양한 운영체제에서 사용할 수 있는 개발 도구와 API를 묶어 에디션(Edition) 형태로 정의하고 있다.

 

- 멀티 스레드(Multi-Thread)를 쉽게 구현할 수 있다.

하나의 프로그램이 동시에 여러 가지 작업을 처리해야 할 경우와 대용량 작업을 빨리 처리하기 위해 서브 작업으로 분리해서 병렬 처리하려면 멀티 스레드 프로그래밍이 필요하다. 프로그램이 실행되는 운영체제에 따라서 멀티 스레드를 구현하는 방법이 다르지만, 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기 때문에 실행되는 운영체제에 상관없이 멀티 스레드를 쉽게 구현할 수 있다. 

 

- 동적 로딩(Dynamic Loading)을 지원한다.

자바 애플리케이션은 여러 개의 객체가 서로 연결되어 실행되는데, 이 객체들은 클래스로부터 생성된다. 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩해서 객체를 생성한다. 또한 개발 완료 후 유지보수(수정)가 발생하더라도 해당 클래스만 수정하면 되므로 전체 애플리케이션을 다시 컴파일할 필요가 없다.

 

- 막강한 오픈소스 라이브러리가 풍부하다.

자바는 오픈소스(Open Source) 언어이기 때문에 자바 프로그램에서 사용하는 라이브러리 또한 오픈소스가 넘쳐난다. (다른 사람이 만들어 놓은 소스를 사용할 수 있다는 이야기이다.) 검증된 오픈소스 라이브러리를 사용하면 개발 기간을 단축하면서 안전성이 높은 애플리케이션을 쉽게 개발할 수 있다. 

 

 

 

Java와 Python을 비교하기 위한 출력 몇 가지

 

//콘솔창 출력
System.out.print(123);
System.out.print(456);
System.out.print(789);

//결과값: 123456789

 

//출력하고 줄 바꿈(엔터)
System.out.println(123);
System.out.println(456);
System.out.println(789);

/* 
	결과값
	123
	456
	789
*/

 

//문자열 데이터 구분 기호 "
System.out.println("자바");
System.out.println("파이선");
System.out.println(123);		//123
System.out.println("123");		//문자 123

 

// " ' \ 등을 단순 기호로 인식하고자 할 때
System.out.println("\"");
System.out.println("\'");
System.out.println("\\");

/*
	결과값
	"
	'
	\
*/

 

// + 연산자
System.out.println(10+20);
System.out.println("10"+"20");
System.out.println("10"+20);
System.out.println(10+"20");
System.out.println("10+20");

/*
	결과값
	30
	1020
	1020
	1020
	10+20
*/

 

위의 + 연산자에서 "10"+20이 통용된다는 것을 알 수 있다.

단, 앞 자리 10은 문자열 10이고 뒷 자리 20은 숫자 20이다.

 

 

 

 

자료형 Datatype

모든 변수에는 형이 있으며, 형에 따라 저장할 수 있는 값의 종류와 범위가 달라진다. 변수를 선언할 때 주어진 형은 변수를 사용하는 도중에 변경할 수 없다. 따라서 변수를 선언할 때 어떤 형을 사용할지 충분히 고려해야 한다.

 

→ 기본자료형, 참조자료형(클래스)

 

 

기본자료형

기본자료형은 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 형이다.

 

① 정수형      byte, short, int, long

② 실수형      float, double

③ 문자형      char

④ 문자열형   String

⑤ 논리형      boolean

 

메모리에는 0과 1을 저장하는 최소 기억 단위인 비트(bit)가 있다. 그리고 8개의 비트를 묶어서 바이트(byte)라 한다. 기본형은 정해진 메모리 사용 크기로 값을 저장하는데 바이트 크기가 클수록 표현하는 값의 범위가 크다.

 

 

 

① 정수형 byte, short, int, long

정수형에는 4개의 형이 있으며 저장할 수 있는 값의 범위가 서로 다르다.

 

정수형 byte short int long
바이트 수 1 2 4 8

 

자바는 기본적으로 정수 연산을 int형으로 진행한다. 연산 시에 범위를 초과하면 잘못된 결과가 나올 수 있으므로 고려하여 형을 결정해야 한다.

 

byte a;		//1바이트 할당
short b;	//2바이트 할당
int c;		//4바이트 할당(기본)
long d;		//8바이트 할당
	
a=3;
b=5;
c=7;
d=9;
		
System.out.println(a);	//3
System.out.println(b);	//5
System.out.println(c);	//7
System.out.println(d);	//9

 

 

 

② 실수형 float, double

실수형은 소수점이 있는 실수 데이터를 저장할 수 있는 형으로, 메모리 사용 크기에 따라 float과 double이 있다.

 

실수형 float double
바이트 수 4 8

 

float과 double의 메모리 사용 크기는 각각 int와 long의 크기와 같지만, 정수형과는 다른 저장 방식 때문에 정수형보다 훨씬 더 큰 범위의 값을 저장할 수 있다. 

float보다 double이 더 정밀한 값을 저장할 수 있기 때문에 높은 정밀도를 요구하는 계산에서는 double을 사용해야 한다. 자바는 실수 리터럴의 기본 타입을 double로 간주한다.

 

float a=1.2f;	//접미사 d 생략 가능, 8바이트 할당
double b=3.4d;	//기본
		
System.out.println(a);	//1.2
System.out.println(b);	//3.4

 

 

 

③ 문자형 char

자바는 모든 문자를 유니코드(Unicode)로 처리한다. 유니코드는 세계 각국의 문자들을 코드값으로 매핑한 국제 표준 규약이다. 유니코드는 하나의 문자에 대해 하나의 코드값을 부여하기 때문에 영문 'A' 및 한글 '가'도 하나의 코드값을 갖는다. 

 

char ch='A';
System.out.println(ch);	//A

ch='가';
System.out.println(ch);	//가

 

 

 

④ 문자열형 String

char형 변수는 단 하나의 문자만 저장한다면 String형 변수는 문자열을 저장한다.

String은 기본형이 아니다. String은 클래스 타입이고 String 변수는 참조 변수이다. 문자열을 String 변수에 대입하면 문자열이 변수에 직접 저장되는 것이 아니라, String 객체가 생성되고, String 변수는 String 객체의 번지를 참조하게 된다.

 

String str="Corona";		//String은 클래스(참조형)이나 사용 빈도가 높아 기본형으로 사용 
System.out.println(str);	//Corona
		
str="R";
System.out.println(str);	//R
		
str="";//글자갯수 0
System.out.println("#"+str+"#");	//##
		
str=" ";//글자갯수 1
System.out.println("#"+str+"#");	//# #

 

 

 

⑤ 논리형 boolean

boolean형은 1byte(8bit)로 표현되는 논리값(true/false)을 저장할 수 있는 데이터 타입이다. boolean형은 두 가지 상태값을 저장할 필요성이 있을 경우에 사용되며, 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 주로 이용된다.

 

다음 코드는 boolean형으로 저장된 flag값의 출력이다.

 

boolean flag=true;
System.out.println(flag);	//true

flag=false;
System.out.println(flag);	//false

//true		논리형
//"true"	문자열형

 

다음 코드를 보면 stop 변수에 true가 저장되어 있기 때문에 if 블록을 실행해서 "사용 중지"가 출력된다. 만약 stop 변수에 false가 저장되어 있다면 else 블록이 실행되어 "사용 가능"을 출력한다. 

 

boolean stop=true;
if(stop) {
	System.out.println("사용 중지");
}else {
	System.out.println("사용 가능");
}//if end

//결과값: 사용 중지

 

 

문제) 성적 프로그램

String name="홍길동";
int kor=80, eng=85, mat=100;
double aver=(kor+eng+mat)/3;	//소수점 유무에 따라 double(float), int가 나뉜다.
		
System.out.println("이름: "+name);
System.out.println("국어: "+kor);
System.out.println("영어: "+eng);
System.out.println("수학: "+mat);
System.out.println("평균: "+aver);

 

 

 

 

연산자 operator

프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산(operations)이라 하고, 연산에 사용되는 표시나 기호를 연산자(operator)라 한다. 

 

 

산술연산자

 

System.out.println(5+3);
System.out.println(5-3);
System.out.println(5*3);
System.out.println(5/3);	//1몫. 정수를 정수로 나누면 소수점이 발생하지 않는다
System.out.println(5%3);	//2나머지 ->5/3의 경우 int가 생략되어 있는 형태(정수/정수)
		
//정수형으로만 계산하면 소수점이 발생하지 않는다.
System.out.println(3/5);	//0
System.out.println(3%5);	//3
		
System.out.println(3/5.0);	//0.6. 하나라도 실수값이 있으면 소수점이 발생한다
System.out.println(3/5.); 	//0.6

 

 

비교연산자

 

System.out.println(5<3);
System.out.println(5>3);
System.out.println(5>=3);
System.out.println(5<=3);
System.out.println(5==3);	//같다
System.out.println(5!=3);	//같지 않다

 

 

논리연산자

 

AND -> &&
OR  -> ||
NOT -> !

 

 

윤년 구하는 공식

 

int y=2020;
System.out.println(y%4==0 && y%100!=0 || y%400==0);
		
boolean flag=true;
System.out.println(!flag);

 

 

bit 연산자

컴퓨터 신호체계: 0, 1

컴퓨터 신호의 최소단위: bit

예) A → 01000001

 

8bit → 1byte

컴퓨터 용량의 크기: KB < MB < GB < TB < NB

 

 

[수의 체계]

2진수    0 1  

8진수    0 1 2 3 4 5 6 7

10진수   0 1 2 3 4 5 6 7 8 9

16진수   0 1 2 3 4 5 6 7 8 9 A(10) B(11) C(12) D(13) E(14) F(15)

           예) ffffff → 화면 색상 표현

 



10진수 5  → 2진수
          9  → 
          15
          16
128  64  32  16  8  4  2  1
1  0  1
1  0  0  1
1  1  1  1
1  0  0  0  0

 

 

문제) 10진수의 16을 2진수로 바꾸시오.

        00010000 (8bit(1byte)가 컴퓨터 신호의 최소단위이므로 앞에 000을 붙인다/ 패딩값)

        <<3  10000000 128   left shift 연산자

        >>3  00000010 2      right shift 연산자

        *3은 이동 bit수

 

 

삼항연산자

 

(조건) ? 참 : 거짓

 

예제) 절대값을 구하시오.

 

int num=-3;
int result=(num<0) ? num*-1 : num;
System.out.println(num+"의 절대값:"+result);

//-3의 절대값:3

 

 

대입연산자

 

int a=3;
		
a=a+2;
System.out.println(a); //5
		
a+=2;
System.out.println(a); //7
		
a=a-3;
System.out.println(a); //4
		
a-=3;
System.out.println(a); //1
		
a*=5;
System.out.println(a); //5
		
a/=3;
a%=3;
System.out.println(a); //1

 

 

1증가연산자

 

a=a+1, a+=1, a++, ++a

 

int a=3;
a=a+1;
System.out.println(a); //4
		
a+=1;
System.out.println(a); //5
		
a++;
System.out.println(a); //6
		
++a;
System.out.println(a); //7

 

 

1감소연산자

 

int b=3;
b=b-1;
b-=1;
b--;
--b;
System.out.println(b); //-1

 

또는

 

a=a-1;
System.out.println(a); //6
		
a-=1;
System.out.println(a); //5
		
a--;
System.out.println(a); //4
		
--a;
System.out.println(a); //3

 

 

※ 1증감연산자는 대입연산자와 계산식을 함께 사용하는 경우에 주의해야 한다. (***)

 

int i=10, j=20;
int x=i++; //int x=i //x=i'++';
	   //i=i+1   //i++; i=i+1;
int y=--j; //int j=j-1 //y='--'j; j=j-1;
	   //int y=j   //y=j;
           
System.out.println(i); //11
System.out.println(j); //19
System.out.println(x); //10
System.out.println(y); //19

 

 

문제) 다음 계산식을 분석하시오. (***)

 

int p=2, q=6;
int r=++p * q--; //p=p+1; r=p+1*q; q=q-1; (이 순서로 계산이 이루어지기 때문)

System.out.println(p); //3
System.out.println(q); //5
System.out.println(r); //18