2024.02.16
*JAVA
-하드웨어 기반 플랫폼=OS
-Java API: 자바에 미리 만들어져 있는 프로그램.. (e.g.System, println...)
-JVM: brain 같은 역할. 바이트코드를 실행함.
JVM은 인터프리터 작업도 함. 인터프리터는 한줄 한줄 바로바로 번역하는 거라서 .class 파일이 안생김. JVM이 바이트코드를 각각의 OS에 맞게 번역함.
즉, 자바는 컴파일러, 인터프리터 작업 두가지를 다 함. (다른 언어는 하나만 하는 경우가 대부분)
Q. 자바는 왜 두가지를 다할까?
A. 자바는 OS에 독립적이라 윈도우에서도, 맥에서도 사용이 가능함. 이걸 가능하게 하려면 각각 OS에 JVM을 설치한 뒤에 각각 OS에 맞게 컴파일 해야함. 이렇게 두가지를 다 사용하는 방식으로 플랫폼 독립적으로 사용 가능.
(참고:
Java는 왜 컴파일러와 인터프리터 둘 다 가지는가?
1. 컴파일러 vs 인터프리터 컴파일러 & 인터프리터 모두 high-level language를 machine language로 번역한다 컴파일러는 소스 코드(high-level language로 작성) 전체를 링커등을 통해 한번에 번역하여 object file(
velog.io
)
-JDK(Java Development Kit) = JRE(Java Runtime Environment)를 포함. 디버거, 컴파일러 등이 추가되어 있음.
JDK 8, 11, 17 버전이 안정적으로 오래 지원되는 버전.
-이클립스는 파일을 만드는 즉시 컴파일 해주고, 파일을 저장할 때마다 컴파일 해줌.
2024.02.19
-식별자: 자바 코드 내에서 개발자가 사용한 이름 (e.g. 클래스 이름, 변수 이름, 메서드 이름...).
숫자로 시작 불가. 영어 알파벳, 숫자, _, $만 사용 가능.
상수 값을 표현하는 단어인 true, false, null은 사용 불가.
*기본자료형의 크기
자료형 | 키워드 | 크기 | 기본값 | 표현 범위 |
논리형 | boolean | 1byte | false | true 또는 false (0과1로 대체할 수 없음) |
문자형 | char | 2byte | \u0000 | 0 ~ 65,535 |
정수형 | byte | 1byte | 0 | -128 ~ 127 |
short | 2byte | 0 | -32,768 ~ 32,767 | |
int | 4byte | 0 | -2,147,483,648 ~ 2,147,483,647 | |
long | 8byte | 0 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
|
실수형 | float | 4byte | 0.0 | -3.4E38 ~ + 3.4E38 |
double | 8byte | 0.0 | -1.7E308 ~ + 1.7E308 |
-정수에 별다른 자료형을 명시하지 않으면 int가 정수표현의 기본임.
(e.g. System.out.println(123);)
마찬가지로, double이 실수표현의 기본이기 때문에 float 자료형도 9.1f 이런 식으로 float 형임을 명시해야 함
*확장 특수 출력 문자(escape sequence)
종류 | 의미 |
\a | 경고음이 난다 |
\n | 엔터 키의 기능을 갖는다. 줄을 바꾼다.(new line) |
\t | 수평 탭으로 일정한 간격을 띄운다.(tab) |
\b | 백스페이스로 뒤로 한 칸 후진한다.(backspace) |
\r | 동일한 줄의 맨 앞 칸으로 커서만 옮긴다(carriage return) |
\f | 출력 용지를 한 페이지 넘긴다.(form feed) |
\\ | \문자를 의미 |
\' | '문자를 의미(single quote) |
\" | "문자를 의미(double quote) |
\0 | 널문자를 의미(null) |
\u16진수 | 16진수에 해당하는 유니코드 |
*형변환
-long 타입(8Byte)의 변수는 float 타입(4Byte)의 변수로 자동 형변환이 가능.
그 이유는 메모리 설계상 정수인 long 타입보다 실수인 float 타입이 더 큰 범위의 수를 담을 수 있기 때문.
(즉 float 타입의 표현범위가 더 큼)
-32bit 미만의 자료형(byte형, short형) 데이터를 연산하면 자동으로 32bit로 변환됨.
CPU는 4byte 연산만 가능하도록 설계되어 있기 때문
-float 데이터를 int 데이터로 강제형변환 하면 소수점 이하 자리가 절삭됨(반올림 X)
*연산자
종류 | 연산자 | 우선 순위 |
증감연산자 | ++ , -- | 1순위 |
산술연산자 | +, -, *, /, % | 2순위 |
시프트연산자 | >>, >>>, << | 3순위 |
비교연산자 | >, <, >=, <=, ==, != | 4순위 |
비트연산자 | &, |, ^, ~ | ~만 1순위, 나머지는 5순위 |
논리연산자 | &&, ||, ! | !만 1순위, 나머지는 6순위 |
조건(삼항)연산자 | ?, : | 7순위 |
대입연산자 | =, +=, -=, *=, /=, %= | 8순위 |
-전위 증감연산자와 후위 증감연산자
System.out.println(++i); // 메모리 공간에서 i를 1 증가시킨 다음 그 값을 읽어옴
System.out.println(i++); // 메모리 공간에서 i 값을 읽어온 다음 메모리 공간의 i를 1 증가시킴
System.out.println(i); // 메모리 공간에서 i가 증가된 것을 확인하기 위한 구문
증감연산자를 변수명 뒤에 명시하면 변수 값을 우선 읽어온 후 값을 증감시킴.
증감연산자를 변수명 앞에 명시하면 변수 값을 증감시킨 후에 그 값을 읽어옴.
2024.02.20
*논리연산자의 수행방식
연산자 | 설명 |
&& | 선조건이 true일 때만 후조건을 실행하며 선조건이 false이면 후조건을 실행하지 않는다 |
|| | 선조건이 true이면 후조건을 실행하지 않으며 선조건이 false일 때만 후조건을 실행한다 |
연산 속도를 빠르게 하기 위해 이렇게 동작함
/*
* 논리곱(&&)
* 선조건 && 후조건 결과
* true true true
* true false false
* false --> (후조건 미실행) --> false
*
* 논리합(||)
* 선조건 || 후조건 결과
* true --> (후조건 미실행) --> true
* false true true
* false false false
*/
2024.02.21
-문자열은 참조 자료형이기 때문에 문자열을 비교할 때는 .equals()를 사용함
-System.exit(0);
을 이용하면 프로그램을 종료할 수 있음
-nextLine()은 라인 전체를 다 받고,next()은 블랭크나 엔터 이전까지 받음
*while문
public class WhileMain05 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int a, total = 0;
System.out.println("0 전까지 입력받은 정수로 합 구하기");
System.out.print("누적할 정수 데이터 입력: ");
while ((a = input.nextInt()) != 0) {
total += a;
System.out.print("누적할 정수 데이터 입력: ");
}
System.out.println("누적된 정수의 합: " + total);
input.close();
}
}
-사용자 입력을 받아서 입력된 값이 0이면 누적 작업을 중단하는 프로그램.
이 프로그램 "누적할 정수 데이터 입력" 라인을 두번이나 출력해야해서 다소 번거롭다.
--> 해결책
public class WhileMain06 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int a, total = 0;
System.out.println("0전까지 입력받은 정수로 합 구하기");
while(true) {
System.out.print("누적할 정수 입력: ");
a = input.nextInt();
if (a == 0)
break;
total += a;
}
System.out.println("누적된 정수의 합: " + total);
input.close();
}
}
-콘솔 프로그램을 만들 때에는 while문을 사용하여 메뉴 선택 방식으로 구현하는 것이 이상적임.
2024.02.22
*while문과 do-while문 비교
-while문: 조건비교에 만족 할 때에만 반복 처리하는 제어문. 선 비교, 후 처리
-do~while문: 조건비교에 불만족하다 할지라도 무조건 한번은 수행. 선 처리, 후 비교
-> do~while문은 조건식을 검사하기 전에 무조건 실행 부분을 한 번 실행한다는 것이 차이
public class DoWhileMain {
public static void main(String[] args) {
int su = 0;
String str = "Hello World!";
// 선 처리, 후 비교
do {
System.out.println(str);
} while(su++ < 5);
System.out.println("---------------------");
int su2 = 0;
// 선 비교, 후 처리
while(su2++ < 5) {
System.out.println(str);
}
System.out.println("---------------------");
}
}
-결과: whlie문은 5번 출력되고 do~while문은 6번 출력됨
*break
-다중반복문에서 break 사용:
다중 반복문일 때 break를 사용하면 전체 반복문을 빠져나가는 것이 아니라 break가 포함되어 있는 반복문만 빠져나감
*break label
-한번에 다중반복문을 빠져나가고 싶을 때 사용 가능.
-빠져나가고 싶은 영역 위에
break_label: 문을 삽입하고
break문 뒤에 break_label; 을 삽입함.
-break_label문의 이름은 마음대로 지정 가능.
public class BreakMain03 {
public static void main(String[] args) {
// 다중반복문에서 break를 이용해서 모든 반복문 빠져나가기
exit_for: // break label 지정
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
if (j == 3)
break exit_for;
System.out.println(i + ", " + j);
}
}
}
}
*countinue
-특정 조건일 때 수행문의 실행을 멈추고 다음 반복 회차로 건너뜀
-반복문을 빠져나가지 않음
*배열
-같은 자료형들끼리 모아두는 하나의 묶음
-자바에서 하나의 배열은 하나의 객체로 인식
배열의 선언 char[] ch; 또는 char ch[]; |
배열의 생성 ch = new char[4]; |
배열의 초기화 ch[0]=‘J’; ch[1]=‘a’; ch[2]=‘v’; ch[3]=‘a’; |
-배열을 생성하면 참조변수 안에 배열의 주소가 보관됨
// 배열의 선언 및 생성
int[] it = new int[6];
// 배열의 선언 및 생성(명시적 배열 생성), 초기화
char[] ch2 = new char[] {'J', 'a', 'v', 'a'};
// 배열의 선언 및 생성(암시적 배열 생성), 초기화
char[] ch3 = {'J', 'a', 'v', 'a'};
-배열을 처음 생성할 때 초기화를 하지 않아도 기본 값으로 0이 들어가 있음 (<=> 변수와의 차이점)
-변수는 기본값이 정해져있지 않기 때문에 초기화를 하지 않으면 에러가 발생
-없는 인덱스를 호출하면 컴파일은 되지만 실행 시 오류 발생
*확장 for문
-배열을 위한 for문
-인덱스 i 변수를 생성하지 않고, 내부적으로 인덱싱을 하여 배열의 요소에 접근함
-> 겉으로 인덱스 표시를 할 수 없음
for (int num : array) {
System.out.print(num + " ");
}
*객체형 배열(e.g. String 배열)
-배열을 생성하면 배열 요소들이 null로 채워짐
*외부에서 데이터 전달하기(이클립스 이용)
우클릭 > Run as > Run configurations > 실행할 클래스 선택 > Arguments 클릭 >
Program arguments: 자바 오라클(구분자=공백) > Run
2024.02.23
*외부에서 데이터 전달하기
-main의 인자로 데이터를 전달하면 전달한 데이터의 자료형은 모두 String으로 인식
-> + 연산이 되지 않고 문자열 연결이 됨
*String 데이터를 int로 변환하기
-Integer.parseInt() 함수 사용
*다차원 배열
-Java에서는 1차원배열은 굉장히 많이, 2차원 배열도 제법 사용하지만 3차원배열은 그렇게 많이 사용하지 않음 (C에 비해)
-> 자바에서는 객체로 다차원 배열을 대체할 수 있기 때문에 다른 언어에 비해서는 1차원 배열 위주로 사용하는 경향.
-test = new int[2][3];
행의 길이 = test.length
열의 길이 = test[i].length
*배열의 크기
-배열은 한 번 크기를 지정하면 바꿀 수 없기 때문에 주어진 데이터를 사용하여 처리하는 경우가 많음
-부득이하게 배열의 크기를 늘려야 할 때에는 새롭게 더 큰 크기의 배열을 만들고 이전 배열에서 모든 자료를 복사해서 넣어주어야 함
-즉, 배열은 고정 길이
[클래스와 객체]
*클래스(class)
-건물을 지을 때 제일 먼저 필요로 하는 설계도면
*객체(Object): 설계도면을 통해 완성된 건물
-컴퓨터, 책상, 사람, 강아지 등 현실 세계에서 흔히 찾아볼 수 있는 대상을 모델링한 것 (메모리에 구체화시킨 것)
-물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것
-객체는 속성과 동작으로 구성
-속성 = 필드(field)
-동작 = 메서드(method)
*주소(Reference): 건물이 지어지면 건물에 주소(Reference)가 부여되고 주소를 통해 건물을 찾아갈 수 있음
*클래스의 구조
*객체의 생성 및 멤버 접근법
1) 객체 선언
-객체가 생성되면 객체의 주소를 보관할 변수를 할당하는 과정
Student s;
2) 객체 생성
-new 연산자를 사용하여 객체 생성을 희망하는 클래스의 생성자를 명시하고 메모리상에 객체를 생성
-객체가 생성되면 주소를 참조변수에 보관하고 원할 때 참조변수를 통해 객체에 접근할 수 있음
s = new Student();
3) 멤버 접근법
-참조변수에 저장된 객체의 주소를 통해 heap 영역에 생성된 객체의 멤버필드 또는 멤버 메서드를 호출
s.age = 21;
'Web Development > SIST' 카테고리의 다른 글
[Java|HTML|CSS] 6주차 수업: 2024.03.25 - 2024.03.29 (0) | 2024.03.25 |
---|---|
[Oracle|PL/SQL|Java] 5주차 수업: 2024.03.18 - 2024.03.22 (0) | 2024.03.22 |
[Java|Oracle] 4주차 수업: 2024.03.11 - 2024.03.15 (0) | 2024.03.22 |
[Java] 3주차 수업: 2024.03.04 - 2024.03.08 (0) | 2024.03.10 |
[Java] 2주차 수업: 2024.02.26 - 2024.02.29 (0) | 2024.03.04 |