2023.04.27.
byte는 8비트
2바이트 = 16비트(16가지 종류)
1교시 - sts 사용
개발공통환경 - 언어
한글을 입력하면 그 나라 환경에서 깨지는 경우가 있음
* 유니코드(데이터)
- 데이터와 명령어 구분
- 각 나라별 언어를 모두 표현하기 위해 나온 코드 체계로 문자마다 고유한 코드 값을 제공
● sts 설정
- 상단의 window 탭에서 preferences(설정) 클릭
▶ encoding 검색
1. workspace : 프로그램의 내용이 저장되는 작업장
UTF-8 (유니코드 8비트 체제)
- 문자 코드는 컴퓨터 안에서 통일, 영어 우선
- 이클립스 사용 시 한글이 깨져보이면 UTF-8이 설정 되어있는지 확인
2. content type
- 그림(image)파일은 utf-8이 아니어도 됨(수정하지 않아도 됨)
- 확장자 중요 (.class)는 자바의 실행 파일
- 문자도 컴퓨터 내에서는 숫자로 나오지만, 출력되는 표현을 문자로 하게끔 함
- 한글 데이터를 넣는 경우 text의 java Source File 눌러 utf-8입력하고 업데이트
- 제이슨을 활용하면 문제 없음(문자열로 보내도 구분을 해줘서 문제가 안생김)
▶ 글자크기 조정 법 - font 검색
1. text font 부분을 눌러 원하는 크기로 설정
2. [Ctrl + Shift + ( + / -)]을 통해 화면 크기 설정
* 깃허브
코드를 덮어 쓸때 그 전의 코드를 보존(코드 재활용)하기 위해 백업하는 공간
소스코드를 복원할 수 있음(형상관리) - 코드 변화를 모니터링 하는 용도로도 사용(협업에서도 유용)
● 실습
▷ 프로젝트 파일 만들기
1. 상단의 file 탭의 new의 other 클릭
- 이클립스의 표준 ux를 보여줌
java 검색 : 입력하면 java 관련 내용 다 보여줌
java project 누르고 next -> 여기서 부터 시작
( file 탭의 new를 눌러 상단에 뜨는 java project를 눌러도 됨)
2. HelloJava 입력
(참고) 현재 제일 안정적인 최신 버전은 17임 (최근에 나온 버전 21) - 전세계에서 11(안정적)의 사용량이 많음
- 모듈 끄기 -> 작업지시서 같은 것 (수업 때 활용하지 않아서 끔 - 복잡한 큰 프로젝트 시 다시 키기)
- next 누르고 finish
3. 왼쪽의 Explorer 뷰에 HelloJava가 생김
- src 소스코드의 약자
- 내가 만든 코드가 들어있음
- 이곳에서 소스코드를 볼 수 있음
2교시
자바는 객체지향언어
* 자바 구조
public class 클래스이름 {}
* 자바는 main()메인함수가 있어야 함
- 정해진 규칙 이외의 것을 쓰면 사용 불가
* 이클립스는 내용만 신경쓰면 됨(내부의 메모리 할당 등의 작업은 자바가 알아서 해주기 때문)
* 보안
1. id, pw(일방통행으로 해석, hash :입력된 데이터를 유일한 특정 값으로 변경)
▷클래스 만들기 - 실습 (자바실행 : 소스파일 만들어 콘솔 화면에 글자 출력하기)
1. HelloJava(생성된 프로젝트 파일) 우측 마우스 클릭 후 상단의 file 탭의 new의 other 클릭하여 java 검색
- class 선택하여 next
- name에 HelloJava 작성 후 finish ->HelloJava.java 가 생성됨
2. 실행방법
확장명 .java인 것에 오른쪽을 눌러 Run as 클릭 - main이 없으면 탭이 안뜸
- 실행시작점이 필요 - main()메인함수
* (참고) 컴파일언어는 main()메인함수가 있어야 함
스크립트언어는 main()메인함수가 숨어있음 (불러 오는 순간의 제일 첫째 줄) 왼쪽->오른쪽 방향이 시작 함수가 됨
* 자바의 모든 코드는 반환 값을 가짐
* void : 아무것도 반환하지 않는 반환 값 (main 함수의 결과 값은 void가 규칙)
* 실행시작점 (정해진 구조) - 클래스 만들때 생성하기 누르면 기본으로 나옴
public static void main(String[] args ) {
}
- 구조 해석
이미 정해져 있다
public static
접근제어자(모든 대상) : main 함수 시작지점은 무조건 public이 규칙
배열 배열명
void main(String[] args ) {
}
결과값 함수명 입력값(파라미터) 실제코드의 정의(배열명) {
}
* 자바는 특정 클래스에 소속된 함수 (= 메소드)가 필요
System. 컴퓨터를 의미
out. 출력을 의미
print() 화면에 찍는 방법중 하나
* window + .(점) 을 누르면 이모티콘 작성 가능
* 에러가 나면 빨간엑스표시가 뜨고 에러가 난 쪽에 줄로 표시가 됨 - 빨간 줄의 앞과 뒤를 확인
엑스표에 마우스를 올리면 문구가 뜸 ex) Syntax error, insert ";" to complete BlockStatements
-> 세미콜론(;) 누락 에러
+ w 노란색 : 경고(무시하면 안 됨)
- 흰색표시 : 저장이 안되었다는 것 - 저장하고 실행하는 습관 들이기
- 저장 한개는 열려있는 파일만 저장, 여러개는 작성한 모든 파일 저장
- 메인함수를 실행(Run as)할때 자바어플리케이션(Java Application)을 눌러 실행
3교시
숫자 : 정수, 실수
문자 : 문자열(문자의 배열)
* 주석 - 상대와의 소통 등에 활용되며 중요하게 작용
// 한 줄 주석
/*
*
*여러 줄 주석
*
*/
/**
** 자동문서화 주석
**
**/
▷ 자바로 계산하는 클래스 만들기
1. 다른 방에서 다른 일을 할 것이기 때문에 클래스 생성(MiniClac)
System.out.print("100 + 300 = "); // System.out.print() 출력 후 커서가 맨 뒤에 있음
System.out.println(100 + 300); // System.out.print() 출력 후 커서가 다음 줄 맨 첫 칸에 있음(자동 줄바꿈 효과)
System.out.print("200 - 100 = ");
System.out.println(200 - 100);
System.out.print("100 * 100 = ");
System.out.println(100 * 100);
System.out.print("100 / 100 = ");
System.out.println(100 / 100);
2. 코드 작성 후 실행(Run as)결과
System.out.print의 결과(문자열로 나옴)
100 + 300 = 400
System.out.println의 결과(계산 값이 나옴)
200 - 100 = 100
100 * 100 = 10000
100 / 100 = 1
* run as시 실행이 되는 것을 알 수 있는 방법 terminated가 뜸
* 줄 바꿈해서 화면에 출력하는 명령어
- System.out.println
* 가독성을 좋게 하여 오류를 적게 내는 법
- 데이터와 데이터 사이에는 한 칸 띄우기
- 명령어 사이는 한 칸 띄우기
- 가로에 스크롤바가 생기면 줄 내려서 한 번에 보이게 하기
* 컴퓨터에서 같다라는 의미 (==)
"1000" == 1000 == 1000.0
문자열 정수 실수
같은 것인지 확인해보자
* 에러(엑스표시에 마우스)
27. Incompatible operand types String and int
28. Incompatible operand types String and double
- 문자열과 정수, 실수를 비교하지 마라
29. 경고(노란줄에 마우스)
Comparing identical expressions
- 비교할 종류가 다르다(정수와 실수 등)
- 같은 종류끼리 비교 해야 함
* 참고
- 문자는 글자 1개, 문자열은 문자들이 모여있는 배열
"1" 문자열 : 최소 1자
'1' 문자 : 무조건 1자
고로 "1" =='1' 은 성립되지 않는
- 부동소수점(고정소수점이 아님)
1. 자리에 오차가 있다
2. float 7자리까지 정밀, double 16자리까지 정밀(정확)
3. 컴퓨터 내의 소수점은 부동임
4교시
* 컴퓨터의 데이터는 메모리 상의 어딘가에 데이터를 넣음(RAM 등)
- 메모리 : 방
* 정수타입 - (책 59p 참고)
1바이트 = 8비트
byte : 가장 작은 숫자 단위 = 수의 범위 0 ~ 2^8-1
short : 2바이트 = 수의 범위 0 ~ 2^16-1
int : 4바이트
long : 8바이트
음수는 0을 기준으로 수의 범위에서 반을 음수로 넘김
* 컴퓨터 프로그램 = 코드(명령) + 데이터
데이터 - 메모리에 저장 (1byte 단위로 주소가 매겨짐)
램 (Random Acess Memory)
메모리의 주소방식 : 0 ~ cpu의 비트처리 주소 (내 컴퓨터 64비트 - 0 ~ 2^64-1)
* 자바는 명령을 실행하면 메모리 할당하고 함수 실행 후 메모리에 다시 저장하여 모니터에 출력 함
- 명령이 끝나면 메모리가 리셋 됨
- 작업공간에 일정한 데이터 크기의 빈 방을 할당(위치는 모름)하고 데이터를 고정함
● 상수 : 1회성 자료(보안에 강함)
데이터가 메모리에 차지하면(값이 초기화 되면) 더 이상 변경 불가,
위치는 운영체제(자바 등)가 알아서 지정하기 때문에 어디에 위치하는지 알 수 없음(위치 변경 불가),
컴퓨터 프로그램(java)이 읽는 순간만 존재.
-> println을 하면 소멸 됨(재사용 불가)
-> 변수에 상수를 넣어 재사용하는 방법이 있다
● 변수 : 언제든지 접근할 수 있는 자료
일정한 자리를 지정하여 데이터가 왔다갔다 가능(변경 가능)
주소를 대신하는 별명이라는 것을 활(별명주소)
변수를 참조하여 해당 위치에 찾아갈 수 있음
ex) name = "홍길동";
- name 이라는 방(변수)에 홍길동(data)를 대입하겠다
▷ 변수 내용 담을 클래스 생성
1. src 오른쪽마우스 new, class 클릭
- HelloVariable(class 이름)
- 나를 소개하는 프로그램 만들기
(이름, 나이, 사는 곳, 왜 자바 프로그래머가 되고싶은지, 포부 등 출력)
2. 코드 작성
// 1. 변수 선언
String name; // 이름 : name - 문자열
int age; // 나이 : age - 숫자(정수)
String address; // 주소 : address - 문자열
name = "홍길동";
age = 10;
address = "개성";
System.out.println("이름 : " + name); // 문자열 결합 연산자(+)
System.out.println("나이 : " + age);
System.out.println("주소 : " + address);
- 변수를 이용하여 데이터 출력
- 출력 값
이름 : 홍길동
나이 : 10
주소 : 개성
* 변수에 어떤 내용이 들어가느냐에 따라 출력 값이 달라짐.
- 홍길동, 10, 개성 부분 수정 가능
(=) 대입연산자
(+) 문자열의 결합 연산자
** 자바코드를 작성할 때 안쓰는 것은 주석 또는 지우기
5교시~6교시
* scanner : 시스템의 입력장치로 부터 읽음 / 키보드로 입력받은 것
* 메인함수 체크박스 통해서 실행 시 나오는 코드
// TODO Auto-generated method stub
- 일정관리를 자동으로 생성해줌(현재 수업 내용에서는 지워도 됨)
▷ 계산기 만들기
1. SimpleCalc 클래스 생성하기
1) 오른쪽마우스 new - class 선택
2) 오른쪽마우스 new - flie 선택하여 클래스 이름(제목 설정) 작성하고 파일을 src에 끌어넣은 후 빈 공간에 필요한 내용 직접 작성
2. 코드 작성
Scanner sc = new Scanner(System.in);
System.out.print("키보드로부터 입력을 해주세요 : ");
String msg = sc.next(); // 문자열 변수 msg : 키보드로부터 입력한 값 저장
System.out.println("입력하신 내용은" + msg + "입니다.");
- 출력 값
1) 키보드로부터 입력을 해주세요 : 100
입력하신 내용은100입니다.
2) 키보드로부터 입력을 해주세요 : 입력 하세요
입력하신 내용은입력입니다. // next()에 의해 글자가 누락 됨
* sc=내가 사용 할 변수
* Scanner : 스캐너기능을 사용하겠다. (입력만 받음 - 무조건 문자열로 받음)
* next() : 띄어쓰기 이전까지만 입력 받음
//next~~ : 입력한 다음의 값은 ~~
//nextInt() : 키보드 입력 값 정수로 반환
- 컴퓨터는 입력 기능, 출력 기능을 따로 적용해주어야함
Scanner : 입력
System.out.println : 출력
(sysout 타이핑하고 ctrl+space - 자동완성)
Scanner sc = new Scanner(System.in);
// Scanner sc : 스캐너 기능을 sc변수로 선언한다
// new Scanner() : 새로운 스캐너기능을 만들어라
// System.in : 컴퓨터의 입력장치
* 내용만 작성하면 import 하지 않아 빨간 에러 줄이 나온다.
-> import : 스캐너 기능이 들어있는 패키지를 가져옴
1) import java.util.Scanner; // 첫 번째 줄에 import문 직접 작성하기
2) ctrl shirt o = import문이 자동 작성 됨
3) 빨간줄에 마우스를 올려 하단에 fixed project setup 누르면 자동 작성 됨
- 이클립스는 import 문이 자동으로 만들어짐
● 스캐너 사용 법
1. 먼저 import java.util.Scanner클래스를 가져온다.
2. Scanner sc = new Scanner();
스캐너기능을 쓸 수 있도록 스캐너 객체를 생성한다.
Scanner sc : 스캐너 기능을 sc변수로 선언한다.
new Scanner() : 새로운 스캐너기능을 만들어라
System.in : 컴퓨터의 입력장치
new Scanner(System.in) : 컴퓨터의 입력장치(=표준입력)로부터 입력을 받는 기능을 만들어라
Scanner sc = new Scanner(System.in);
System.out.print("키보드로부터 입력을 해주세요 : ");
String msg = sc.next(); // 문자열 변수 msg : 키보드로부터 입력한 값 저장
System.out.println("입력하신 내용은" + msg + "입니다.");
int x = sc.nextInt(); // 키보드 입력 값 정수로 반환
int y = sc.nextInt();
System.out.println("x + y = " + (x + y));
System.out.println("-------------------------------");
System.out.print("계산할 첫 번째 숫자를 입력해주세요 : "); // 출력기능
int num1 = sc.nextInt(); // 키보드 입력 값 정수로 반환
System.out.print("계산할 두 번째 숫자를 입력해주세요 : ");
int num2 = sc.nextInt();
int result = num1 + num2; // 변수 선언
System.out.println("계산한 결과 출력 : "); // 출력기능
System.out.println(num1 + " + " + num2 + " = " + result); // 출력기능
- next() 를 사용하고, 콘솔창에 아무것도 입력 안하고 엔터를 누르면 계속 반응이 없음 -> 입력 값을 줘야 함
* 코드가 정렬이 안 된 경우(들여쓰기)
- source (메뉴 또는 오른쪽 마우스) Format 클릭하면 정리 됨!
7교시~8교시
* 자바는 파일이름과 클래스 이름이 같아야 함
▷ 숫자 추측하는 클래스 만들기 (NumberGuessingGame)
1) new - file 클릭하여 제목 설정하고 파일을 src에 끌어넣음
2) new - class 클릭하여 제목 설정
* 단축키 (main) + ctrl space
public static void main(String[] args){}
* 난수(상태) : 임의의 수
* 자바에서 식별하기 위해 주로 사용하는 표기법
- 카멜표기법(낙타표기법) - numberGuessGen
- 변수는 소문자로 시작함, 클래스는 대문자로 시작함
● 숫자 추측게임
필요한 재료 : 서로 게임할 상대 (나), 컴퓨터(술래)
게임 규칙 :
1. 컴퓨터가 숫자를 하나 생각합니다. 이 숫자는 임의의 숫자이어야 합니다.
2. 대결자(=나)에게 문제를 풀어보라는 기회를 준다.
키보드로 입력하는 기능 필요
3. 입력한 답을 컴퓨터가 생각한 값과 비교해서 정답여부를 판정 = 판정루틴
생각한 수 < 입력한 수 : 입력하신 정수가 높습니다.
생각한 수 > 입력한 수 : 입력하신 정수가 낮습니다.
생각한 수 == 입력한 수 : 정답입니다.
4. 게임을 계속할 지 결정(반복문 do-while)
Random numberGuessGen = new Random();
// 컴퓨터가 생각한 수 기억하는 변수 선언(answer라고 선언)
// 난수를 발생시킬 범위 지정(=seed 값) 0 ~ 100 (0 <= 난수 < 100)
// 0은 포함, 100은 포함하지 않는 난수
// 1 ~ 100까지 (0 + 1) <= (난수 + 1) < (100 + 1)
int answer = numberGuessGen.nextInt(100) + 1; // 100까지 포함하고 싶다면 +1 하기
int myGuess; // 내가 추측한 값
1. 컴퓨터가 임의의 숫자를 하나 생각합니다.
- 자바에서 난수를 발생시키는 방법은 몇 가지 있음.
-> Random 클래스( =외부기능) 사용
※상단의 코드를 입력하면 import를 하지 않아 에러가 뜸!
* ctrl shirt o = import문이 작성되며 빨간줄이 사라짐(마음 껏 사용)
또는 fixed project setup 눌러 해결
-> import 문을 작성해주지 않으면 빨간 줄이 뜸
import java.util.Random; 상단에 자동으로 작성 됨
Scanner sc = new Scanner(System.in);
int tryNumber = 0; //숫자를 맞추려고 시도한 횟수(랭킹 판정 기준), 0인 이유: 아직 게임 시작 안함
2. 키보드 입력 (대결자(=나)에게 문제를 풀어보라는 기회를 준다.)
- 키보드로부터 사용자가 숫자를 입력한다
// Scanner sc : 스캐너 기능을 sc변수로 선언한다
// new Scanner() : 새로운 스캐너기능을 만들어라
// System.in : 컴퓨터의 입력장치
-> 컴퓨터로부터 입력받은 문자열을 스캔하여 sc라는 변수에 넣는다.
do { // 최소 한 번은 실행 하는 경우
System.out.println(" Q. 숫자를 추측해 보세요 : ");
myGuess = sc.nextInt();
tryNumber = tryNumber + 1; //한 번 실행했으므로 실행횟수 1 증가
3. 게임 시작 : 입력한 답을 컴퓨터가 생각한 값과 비교해서 정답여부를 판정
* do-while : 일단 한 번 해보고 지속할지 말지 결정
-> 게임을 한 번은 실행해보려고 하기 때문에 do-while 반복문이 적격
if (myGuess > answer) {
System.out.println("생각하신 수가 정답보다 큽니다."); //myGuess > answer : 프로그램 루프
}
if (myGuess < answer) {
System.out.println("생각하신 수가 정답보다 작습니다."); //myGuess < answer : 프로그램 루프
}
if (myGuess == answer) {
System.out.println("정답입니다. 시도횟수 = " + tryNumber ); //myGuess == answer : 프로그램 종료 기준
}
} while (myGuess != answer); // 계속 하려면 while의 조건식 == true
4. 게임을 계속할 지 결정(반복문 do-while)
- 판정루틴은 프로그램 계속여부를 판단하므로 do~while 사이에 있어야 함.
- 반복문에서 세미콜론을 안쓰나, do-while은 do에서 실행이 별도로 되기 때문에 while문장에서 추가로 세미콜론을 써야함
->안쓰면 오류
*(참고)
TDD (Test Driven Developement)
프로그램을 개발하는 동안 함수 또는 클래스 단위로 부분코드를
하나하나 테스트하면서 오류를 수정 개선해 나가는 개발방법
-> 품질을 높일 수 있음